switch_perf_dir
probonopd 12 months ago
commit b75e336972
  1. 6
      README.md
  2. 2
      USBID.sh
  3. 9
      build.sh
  4. 1
      src/Rules.mk
  5. 13
      src/circle_stdlib_app.h
  6. 7
      src/config.cpp
  7. 5
      src/config.h
  8. 20
      src/kernel.cpp
  9. 2
      src/kernel.h
  10. 9
      src/minidexed.cpp
  11. 15
      submod.sh

@ -2,7 +2,7 @@
![minidexed](https://user-images.githubusercontent.com/2480569/161813414-bb156a1c-efec-44c0-802a-8926412a08e0.jpg)
MiniDexed is a FM synthesizer closely modeled on the famous DX7 by a well-known Japanese manufacturer running on a bare metal Raspberry Pi (without a Linux kernel or operating system). On Raspberry Pi 2 and larger, it can run 8 tone generators, not unlike the TX816/TX802 (8 DX7 instances without the keyboard in one box). [Featured by HACKADAY](https://hackaday.com/2022/04/19/bare-metal-gives-this-pi-some-classic-synths/) and [adafruit](https://blog.adafruit.com/2022/04/25/free-yamaha-dx7-synth-emulator-on-a-raspberry-pi/).
MiniDexed is a FM synthesizer closely modeled on the famous DX7 by a well-known Japanese manufacturer running on a bare metal Raspberry Pi (without a Linux kernel or operating system). On Raspberry Pi 2 and larger, it can run 8 tone generators, not unlike the TX816/TX802 (8 DX7 instances without the keyboard in one box). [Featured by HACKADAY](https://hackaday.com/2022/04/19/bare-metal-gives-this-pi-some-classic-synths/), [adafruit](https://blog.adafruit.com/2022/04/25/free-yamaha-dx7-synth-emulator-on-a-raspberry-pi/), and [Synth Geekery](https://www.youtube.com/watch?v=TDSy5nnm0jA).
## Features
@ -49,6 +49,8 @@ Video about this project by [Floyd Steinberg](https://www.youtube.com/watch?v=Z3
* If the system seems to become unresponsive after a few seconds, remove `usbspeed=full` from `cmdline.txt` and repeat ([details](https://github.com/probonopd/MiniDexed/issues/39))
* Optionally, put voices in `.syx` files onto the SD card (e.g., using `getsysex.sh`)
* See the Wiki for [Menu](https://github.com/probonopd/MiniDexed/wiki/Menu) operation
* For voice programming, use any DX series editor (using MIDI sysex), including Dexed
* For library management, use the dedicated [MiniDexedLibrarian](https://github.com/BobanSpasic/MiniDexedLibrarian) software
* If something is unclear or does not work, don't hesitate to [ask](https://github.com/probonopd/MiniDexed/discussions/)!
## Pinout
@ -88,3 +90,5 @@ This project stands on the shoulders of giants. Special thanks to:
* [dcoredump](https://github.com/dcoredump) for https://codeberg.org/dcoredump/Synth_Dexed, a port of Dexed for embedded systems
* [rsta2](https://github.com/rsta2) for https://github.com/rsta2/circle, the library to run code on bare metal Raspberry Pi (without a Linux kernel or operating system) and for the bulk of the MiniDexed code
* [smuehlst](https://github.com/smuehlst) for https://github.com/smuehlst/circle-stdlib, a version with Standard C and C++ library support
* [Banana71](https://github.com/Banana71) for the sound design of the performances shipped with MiniDexed
* [BobanSpasic](https://github.com/BobanSpasic) for the [MiniDexedLibrarian](https://github.com/BobanSpasic/MiniDexedLibrarian) software

@ -0,0 +1,2 @@
USB_VID=0x1209
USB_DID=0xF043

@ -20,6 +20,15 @@ if [ "${RPI}" -gt "1" ]; then
OPTIONS="${OPTIONS} -o ARM_ALLOW_MULTI_CORE"
fi
# USB Vendor and Device ID for use with USB Gadget Mode
source USBID.sh
if [ "${USB_VID}" ] ; then
OPTIONS="${OPTIONS} -o USB_GADGET_VENDOR_ID=${USB_VID}"
fi
if [ "${USB_DID}" ] ; then
OPTIONS="${OPTIONS} -o USB_GADGET_DEVICE_ID=${USB_DID}"
fi
# Build circle-stdlib library
cd circle-stdlib/
make mrproper || true

@ -22,6 +22,7 @@ LIBS += \
$(CIRCLEHOME)/addon/Properties/libproperties.a \
$(CIRCLEHOME)/addon/SDCard/libsdcard.a \
$(CIRCLEHOME)/lib/usb/libusb.a \
$(CIRCLEHOME)/lib/usb/gadget/libusbgadget.a \
$(CIRCLEHOME)/lib/input/libinput.a \
$(CIRCLEHOME)/lib/sound/libsound.a \
$(CIRCLEHOME)/addon/fatfs/libfatfs.a \

@ -25,7 +25,6 @@
#include <circle/writebuffer.h>
#include <circle/timer.h>
#include <circle/logger.h>
#include <circle/usb/usbhcidevice.h>
#include <SDCard/emmc.h>
#include <circle/input/console.h>
#include <circle/sched/scheduler.h>
@ -160,7 +159,6 @@ public:
const char *pPartitionName = CSTDLIBAPP_DEFAULT_PARTITION)
: CStdlibAppScreen (kernel),
mpPartitionName (pPartitionName),
mUSBHCI (&mInterrupt, &mTimer, TRUE),
mEMMC (&mInterrupt, &mTimer, &mActLED),
#if !defined(__aarch64__) || !defined(LEAVE_QEMU_ON_HALT)
//mConsole (&mScreen, TRUE)
@ -199,16 +197,6 @@ public:
return false;
}
#if !defined(__aarch64__) || !defined(LEAVE_QEMU_ON_HALT)
// The USB driver is not supported under 64-bit QEMU, so
// the initialization must be skipped in this case, or an
// exit happens here under 64-bit QEMU.
if (!mUSBHCI.Initialize ())
{
return false;
}
#endif
if (!mConsole.Initialize ())
{
return false;
@ -232,7 +220,6 @@ public:
}
protected:
CUSBHCIDevice mUSBHCI;
CEMMCDevice mEMMC;
FATFS mFileSystem;
CConsole mConsole;

@ -36,6 +36,8 @@ void CConfig::Load (void)
{
m_Properties.Load ();
m_bUSBGadgetMode = m_Properties.GetNumber ("USBGadget", 0) != 0;
m_SoundDevice = m_Properties.GetString ("SoundDevice", "pwm");
m_nSampleRate = m_Properties.GetNumber ("SampleRate", 48000);
@ -152,6 +154,11 @@ void CConfig::Load (void)
m_bPerformanceSelectChannel = m_Properties.GetNumber ("PerformanceSelectChannel", 0);
}
bool CConfig::GetUSBGadgetMode (void) const
{
return m_bUSBGadgetMode;
}
const char *CConfig::GetSoundDevice (void) const
{
return m_SoundDevice.c_str ();

@ -63,6 +63,9 @@ public:
void Load (void);
// USB Mode
bool GetUSBGadgetMode (void) const; // true if in USB gadget mode
// Sound device
const char *GetSoundDevice (void) const;
unsigned GetSampleRate (void) const;
@ -168,6 +171,8 @@ public:
private:
CPropertiesFatFsFile m_Properties;
bool m_bUSBGadgetMode;
std::string m_SoundDevice;
unsigned m_nSampleRate;
unsigned m_nChunkSize;

@ -21,6 +21,8 @@
#include <circle/logger.h>
#include <circle/synchronize.h>
#include <assert.h>
#include <circle/usb/usbhcidevice.h>
#include <circle/usb/gadget/usbmidigadget.h>
LOGMODULE ("kernel");
@ -64,6 +66,22 @@ bool CKernel::Initialize (void)
m_Config.Load ();
if (m_Config.GetUSBGadgetMode())
{
// Run the USB stack in USB Gadget (device) mode
m_pUSB = new CUSBMIDIGadget (&mInterrupt);
}
else
{
// Run the USB stack in USB Host (default) mode
m_pUSB = new CUSBHCIDevice (&mInterrupt, &mTimer, TRUE);
}
if (!m_pUSB->Initialize ())
{
return FALSE;
}
m_pDexed = new CMiniDexed (&m_Config, &mInterrupt, &m_GPIOManager, &m_I2CMaster,
&mFileSystem);
assert (m_pDexed);
@ -82,7 +100,7 @@ CStdlibApp::TShutdownMode CKernel::Run (void)
while (42 == 42)
{
boolean bUpdated = mUSBHCI.UpdatePlugAndPlay ();
boolean bUpdated = m_pUSB->UpdatePlugAndPlay ();
m_pDexed->Process(bUpdated);

@ -24,6 +24,7 @@
#include <circle/cputhrottle.h>
#include <circle/gpiomanager.h>
#include <circle/i2cmaster.h>
#include <circle/usb/usbcontroller.h>
#include "config.h"
#include "minidexed.h"
@ -54,6 +55,7 @@ private:
CGPIOManager m_GPIOManager;
CI2CMaster m_I2CMaster;
CMiniDexed *m_pDexed;
CUSBController *m_pUSB;
static CKernel *s_pThis;
};

@ -98,6 +98,15 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt,
m_pTG[i]->activate ();
}
if (pConfig->GetUSBGadgetMode())
{
LOGNOTE ("USB In Gadget (Device) Mode");
}
else
{
LOGNOTE ("USB In Host Mode");
}
for (unsigned i = 0; i < CConfig::MaxUSBMIDIDevices; i++)
{
m_pMIDIKeyboard[i] = new CMIDIKeyboard (this, pConfig, &m_UI, i);

@ -1,15 +1,24 @@
#!/bin/bash
set -ex
#
# Update top-level modules as a baseline
git submodule update --init --recursive
#
# Use fixed master branch of circle-stdlib then re-update
cd circle-stdlib/
git checkout e318f89 # Needed to support Circle develop?
git checkout 695ab4a
git submodule update --init --recursive
cd -
#
# Optional update submodules explicitly
cd circle-stdlib/libs/circle
git checkout ec09d7e # develop
git checkout fe09c4b
cd -
cd circle-stdlib/libs/circle-newlib
git checkout 48bf91d # needed for circle ec09d7e
#git checkout develop
cd -
#
# Use fixed master branch of Synth_Dexed
cd Synth_Dexed/
git checkout c9f5274
cd -

Loading…
Cancel
Save