& You can play all these Yamaha DX7 banks in #Dexed. And make new ones, selecting the patch you want, etc..
& You can play all these Yamaha DX7 banks in #Dexed. And make new ones, selecting the patch you want, etc..
If you're still playing around with a Yamaha DX7, you will find :
A L L T H E W E B P A T C H E S C O L L E C T I O N
Thousands of sounds, some sculpted by the best artists of the time.
Here:
https://bobbyblues.recup.ch/yamaha_dx7/dx7_patches.html
Old stuff on the Kitchen table..
A Yamaha DX7 plugged in the AKAI DPS16 Professional Studio Recorder.
Gonna update some sounds in the internal memory of the DX7 with #Dexed by MIDI with a Laptop.
#Vintage #AKAI #DPS16 #SCSI #Multitrack #Recorder #DigitalStudio #Yamaha #DX7 #FMsynthesis #synths #synthesizer #tech #retro #photography #photo
I've updated my #picoDexed to include a basic encoder/display UI and updated to the latest Pico SDK.
This is a port of Synth_Dexed to the Raspberry Pi PIco.
I also thought it was probably about time I actually documented the basic architecture :)
https://diyelectromusic.com/2025/04/12/raspberry-pi-pico-synth_dexed-revisited/
Raspberry Pi Pico Synth_Dexed – Revisited
I thought it was time I took another look at my Raspberry Pi Pico Synth_Dexed. I’ve a couple of main aims with coming back to this project:
The current hardware is described in detail in Raspberry Pi Pico Synth_Dexed? – Part 5 and supports serial and USB MIDI, I2S or PWM audio output, voice selection (over MIDI) and up to 16 note polyphony if using an overclocked (to 250MHz) RP2040 based Pico and lower sample rate.
https://makertube.net/w/tY1u9qFz85NprRYPmtdvEj
Warning! I strongly recommend using old or second hand equipment for your experiments. I am not responsible for any damage to expensive instruments!
If you are new to microcontrollers, see the Getting Started pages.
Core Updates
Since I first put the PicoDexed together, V2 of the Raspberry Pi Pico SDK has been released. There aren’t many changes, but as noted by okyeron, an additional include file is required in main.c.
But as I was updating things, I also found a number of changes to Synth_Dexed too that broke the build. The most irritating of which was including a definition of DEXED_SAMPLE_RATE which now clashes with my own definition. I’ve gone through and changed a number of DEXED_ definitions to PICODEXED_ to avoid that in the future too.
A few other changes have also been introduced, which have necessitated an update to my diff file for Synth_Dexed/src/Dexed.cpp.
But on the whole, there was nothing major in the end. This has all been uploaded to GitHub as a v0.02.
PicoDexed Architecture
I had to go back and attempt to reacquaint myself with what I’d done last time, so as part of that I’ve drawn out a rough architecture diagram as shown below.
This expands on the design notes I’ve already written up in Part 3.
The key principles are as follows:
Looking at this, I should be able to include some additional IO handling in the main Process loop of picoDexed that runs on core 0.
I2C Displays
Hunting around for libraries to support an SSD1306 display with the Pico SDK, so far I’ve found four options:
Whilst tempted to go with the “proper” library, it might be a little over the top for what I really need right now, and I don’t want to include an additional third-party GitHub link in my code at this time.
So I’m going to try daschr’s pico-ssd1306 as I can just grab the files, maintain the license information, and include it directly into my code.
To include this code in the build I’ve done the following:
My new CMakeLists.txt file now looks as follows.
cmake_minimum_required(VERSION 3.13)
include(pico_sdk_import.cmake)
include(pico_extras_import.cmake)
project(picodexed)
pico_sdk_init()
add_executable(picodexed)
target_sources(picodexed PUBLIC
${CMAKE_CURRENT_LIST_DIR}/src/main.cpp
${CMAKE_CURRENT_LIST_DIR}/src/pico_perf.cpp
${CMAKE_CURRENT_LIST_DIR}/src/mididevice.cpp
${CMAKE_CURRENT_LIST_DIR}/src/picodexed.cpp
${CMAKE_CURRENT_LIST_DIR}/src/serialmidi.cpp
${CMAKE_CURRENT_LIST_DIR}/src/sounddevice.cpp
${CMAKE_CURRENT_LIST_DIR}/src/usbmidi.cpp
${CMAKE_CURRENT_LIST_DIR}/src/usbtask.c
${CMAKE_CURRENT_LIST_DIR}/src/usb_descriptors.c
${CMAKE_CURRENT_LIST_DIR}/libs/ssd1306.c
)
add_subdirectory(synth_dexed)
target_include_directories(picodexed PUBLIC
${CMAKE_CURRENT_LIST_DIR}/src
${CMAKE_CURRENT_LIST_DIR}/libs
${CMAKE_CURRENT_LIST_DIR}/synth_dexed/Synth_Dexed/src
${CMAKE_CURRENT_LIST_DIR}/synth_dexed
)
target_link_libraries(picodexed PUBLIC synth_dexed pico_stdlib pico_multicore tinyusb_device tinyusb_board pico_audio_i2s pico_audio_pwm hardware_i2c)
target_compile_definitions(picodexed PRIVATE
PICO_AUDIO_I2S_MONO_OUTPUT=1
PICO_AUDIO_I2S_MONO_INPUT=1
USE_AUDIO_I2S=1
USE_AUDIO_PWM=1
)
pico_add_extra_outputs(picodexed)
The most basic usage is as follows:
static ssd1306_t disp;
i2c_init(i2c1, 400000);
gpio_set_function(2, GPIO_FUNC_I2C);
gpio_set_function(3, GPIO_FUNC_I2C);
gpio_pull_up(2);
gpio_pull_up(3);
disp.external_vcc=false;
ssd1306_init(&disp, 128, 32, 0x3c, i2c1);
ssd1306_clear(&disp);
ssd1306_draw_string(&disp, 8, 8, 2, "picoDexed");
ssd1306_show(&disp);
This initialises I2C bus 1 on GPIO 2 and 3 for device at address 0x3C.
Rotary Encoder
Taking the same approach with a rotary encoder, I’ve so far found the following as candidates for use:
The first is a more complete library, the second more “bare bones”. The last seems more of an example rather than a reusable object.
I was initially inclined towards the second which seemed likely to be easier to integrate into my own code, but as it was pretty low level and required a fair bit of glue around it.
Eventually I actually opted for something based on “GitJer”‘s example. There is a full explanation of how the code works here: https://github.com/GitJer/Some_RPI-Pico_stuff/tree/main/Rotary_encoder
I’ve had to change how voices are selected slightly to ensure the display, MIDI BANKSEL/PC and encoder can stay reasonably intuitive.
I’ve used the following logic:
In each case the display shows the current bank and voice number in 0-7/0-31 format.
So just to be clear, MIDI Program Select on its own now (so 0..128) will always only select from the first four banks of 32 voices each. This is a change from the previous version which would allow PC to select based on the currently selected banks and the three following banks.
The encoder will automatically switch from one bank to the next, and wrap around at either end, so is able to select all voices across all installed banks.
Raspberry Pi Pico PIO Use
One issue to keep an eye on is PIO state-machine use.
I’m still getting my head around PIO (I’ve just not really devoted any significant time to figuring it out yet) but as I understand things, each PIO instance has a 32 instruction memory which is shared across four state machines.
So if there are several programmes to run and they all combined fit in the 32 instruction memory, then they could all use the same PIO instance whilst being attached to different state machines.
But if there are two vastly different programs to be running then it may be that they have to be split across the two PIO instances. But there can still be up to four instance of each program, one for each state machine in a PIO instance.
The I2S audio driver uses PIO to implement I2S. As far as I can see which PIO to use is determined by the following definitions:
PICO_AUDIO_PIO
PICO_AUDIO_I2S_PIO
PICO_AUDIO_PWM_PIO
If PICO_AUDIO_PIO is not defined then I2S_PIO and PWM_PIO are set to 0, which is then turned into “pio0” via the following in i2s_audio.c:
#define audio_pio __CONCAT(pio, PICO_AUDIO_I2S_PIO)
Which later on then uses the following to claim a free statemachine as part of audio_i2s_setup():
pio_sm_claim(audio_pio, sm);
I don’t know for certain, but it appears to me that the I2S PIO program is quite complete and so highly likely to fill the 32 word instruction memory.
On that basis, then the rotary encoder PIO program will have to use PIO instance 1 for its own code.
Summary of PIO use:
UsePIO InstanceNumber of State machinesI2SPIO 01EncoderPIO 11Update GPIO Usage
Expanding now on the table from Part 5, updated with the above, now gives the following GPIO usage map.
GP0Debug UART TXGP1Debug UART RX (unused at present)GP2SDA (I2C bus 1) OLED displayGP3SCL (I2C bus 1) OLED displayGP4MIDI TX (unused at present)GP5MIDI RXGP6Rotary Encoder AGP7Rotary Encoder BGP8Rotary Encoder Switch (not used)GP9I2S Data (DATA, DIN)GP10I2S Bit Clock (BCK)GP11I2S “Left/Right” Clock (LCK, LRCK, LR_CLOCK)GP20Optional: PWM outputGP22Optional: Mute pin for the Pimoroni Audio Pack (not used)VSYS5V power to DAC and OLED display (if required)3V3_OUT3V3 power to MIDI IN and encoder (if required)GNDPicoDexed on a Breadboard
Closing Thoughts
I feel like this is really starting to get interesting now. I have a few choices to make now – do I attempt to go for a more complete menu system similar to MiniDexed, or do I stay with MIDI control and basic voice selection as it is now?
Future enhancements might include:
In the video I’ve hooked it up to a serial MIDI controller and am just cycling through some of the voices showing how the UI works.
Kevin
PicoDexed UI and Voice Demonstration
" How Jan Hammer Layered Synths For that Iconic 80's Miami Vice Sound "
I thought this video was interesting, and a new channel to follow as well I think.
@sandradejong Ballonnen die tegen elkaar worden gewreven.
En een heel specialistische wat abstracte: het gebruik van synthesizer factory presets. Als je in een jaren 80 nummer dat elektrische piano geluid hoort van een Yamaha DX7: dat is precies wat ik bedoel.
Hacking the Yamaha DX9 to Turn It into a DX7 (2023)
https://ajxs.me/blog/Hacking_the_Yamaha_DX9_To_Turn_It_Into_a_DX7.html
#ycombinator #ajxs #synthesisers #programming #DX7 #Musical_Equipment #Programming #Reverse_Engineering #Synthesizers
Current #jamuary project: creating 31 #DX7 patches (one per day). Cool twist: day 1 uses algorithm 1, day 2 uses algorithm 2, etc. These are on a Volca FM, so I haven't been posting live (I need to clean up each patch on my TX802 to ensure things like velocity sensitivity are dialed in correctly) but they'll all be up sooner or later.
The Math Behind the Music of the 80s - Although there might have been other music produced or recorded in the 1980s, we m... - https://hackaday.com/2024/12/11/the-math-behind-the-music-of-the-80s/ #musicalhacks #synthesizer #instrument #synthpop #yamaha #1980s #music #synth #dx-7 #dx7
The Math Behind the Music of the 80s https://hackaday.com/2024/12/11/the-math-behind-the-music-of-the-80s/ #MusicalHacks #synthesizer #instrument #synthpop #1980's #yamaha #music #synth #dx-7 #dx7
No need to buy the Tracker Plus to get the additional synth engines when the latest Polyend firmware (1.9) for the OG Tracker adds 4 MIDI channels that I can use to send notes to a Raspberry Pi 2 MiniDexed box.
#DX7 #FMsynthesis #electronicMusic #synthDIY
Yamaha DX7 & Yamaha CX5
Free DX7 Sci-Fi Sounds - Vol. 1
Old-school science fiction sounds for DX7-compatible devices.
Synth patches for Yamaha DX7, Dexed and Korg Volca FM
So much going on in this video.
https://youtu.be/CAQ1fC38r7c?feature=shared
There is a demonstration at 2:45 by Gary Leuenberger, one of the original programmers of the DX7.