Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
probonopd committed Dec 2, 2023
2 parents 9908abf + 258a456 commit b75e336
Show file tree
Hide file tree
Showing 11 changed files with 72 additions and 19 deletions.
6 changes: 5 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
2 changes: 2 additions & 0 deletions USBID.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
USB_VID=0x1209
USB_DID=0xF043
9 changes: 9 additions & 0 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions src/Rules.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down
15 changes: 1 addition & 14 deletions src/circle_stdlib_app.h
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -160,7 +159,6 @@ class CStdlibAppStdio: public CStdlibAppScreen
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)
Expand Down Expand Up @@ -199,16 +197,6 @@ class CStdlibAppStdio: public CStdlibAppScreen
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;
Expand All @@ -223,7 +211,7 @@ class CStdlibAppStdio: public CStdlibAppScreen

return true;
}

virtual void Cleanup (void)
{
f_mount(0, "", 0);
Expand All @@ -232,7 +220,6 @@ class CStdlibAppStdio: public CStdlibAppScreen
}

protected:
CUSBHCIDevice mUSBHCI;
CEMMCDevice mEMMC;
FATFS mFileSystem;
CConsole mConsole;
Expand Down
7 changes: 7 additions & 0 deletions src/config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ CConfig::~CConfig (void)
void CConfig::Load (void)
{
m_Properties.Load ();

m_bUSBGadgetMode = m_Properties.GetNumber ("USBGadget", 0) != 0;

m_SoundDevice = m_Properties.GetString ("SoundDevice", "pwm");

Expand Down Expand Up @@ -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 ();
Expand Down
5 changes: 5 additions & 0 deletions src/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ class CConfig // Configuration for MiniDexed
~CConfig (void);

void Load (void);

// USB Mode
bool GetUSBGadgetMode (void) const; // true if in USB gadget mode

// Sound device
const char *GetSoundDevice (void) const;
Expand Down Expand Up @@ -167,6 +170,8 @@ class CConfig // Configuration for MiniDexed

private:
CPropertiesFatFsFile m_Properties;

bool m_bUSBGadgetMode;

std::string m_SoundDevice;
unsigned m_nSampleRate;
Expand Down
20 changes: 19 additions & 1 deletion src/kernel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");

Expand Down Expand Up @@ -63,7 +65,23 @@ 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);
Expand All @@ -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);

Expand Down
2 changes: 2 additions & 0 deletions src/kernel.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -54,6 +55,7 @@ class CKernel : public CStdlibAppStdio
CGPIOManager m_GPIOManager;
CI2CMaster m_I2CMaster;
CMiniDexed *m_pDexed;
CUSBController *m_pUSB;

static CKernel *s_pThis;
};
Expand Down
9 changes: 9 additions & 0 deletions src/minidexed.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,15 @@ CMiniDexed::CMiniDexed (CConfig *pConfig, CInterruptSystem *pInterrupt,
m_pTG[i]->setEngineType(pConfig->GetEngineType ());
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++)
{
Expand Down
15 changes: 12 additions & 3 deletions submod.sh
Original file line number Diff line number Diff line change
@@ -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 -

0 comments on commit b75e336

Please sign in to comment.