Skip to content
Kevin edited this page Sep 29, 2024 · 58 revisions

The following files affect the configuration of MiniDexed in various ways:

Note: The # character is used to denote comments in MiniDexed .ini files, not the ; character (details).

minidexed.ini

System Options

These are more advanced options and do not appear by default in minidexed.ini.

ToneGenerators=8
Polyphony=16

On a Raspberry Pi 4 or above, the number of Tone Generators can be either 8 or 16 - the default is 8. For the Raspberry Pi V1/Zero, the number of Tone Generators is fixed at 1 - i.e. a single Tone Generator. Pi V2, V3 and Zero 2 are fixed at 8 Tone Generators.

The polyphony per Tone Generator can be adjusted for all Raspberry Pi versions. The following are the default and maximum settings:

  • Pi V1 (inc Zero 1/W): default 8, max 8.
  • Pi V2/V3 (inc Zero 2): default 16, max 16.
  • Pi V4 (inc 400): default 24, max 32.
  • Pi V5: default 32, max 32.

Adjusting these settings can lead to performance issues. If the sound starts to glitch or crackle with certain voices or performances then try reducing the amount of polyphony.

Sound device

# Sound device
SoundDevice=pwm
SampleRate=48000
#ChunkSize=256
DACI2CAddress=0
ChannelsSwapped=0
EngineType=1
QuadDAC8Chan=0

Configures the sound device.

  • SoundDevice can be pwm (headphone jack, default, worst quality), hdmi (HDMI output, better quality), or i2s (i2s DAC, best quality). You need to choose the one that matches your hardware setup.
  • SampleRate is best left at its default
  • ChunkSize is best left at its default
  • DACI2CAddress can be 0 or the i2c address of your i2s DAC (some DACs are using i2c in addition to i2s for control). Leaving it at 0 will try to autodetect well-known DACs. Note that when entering an i2c address, you can use a decimal number or a hexadecimal number prefixed with 0x
  • ChannelsSwapped can be set to 1 if you encounter the left and right stereo channel being swapped. Some hardware is (wrongly) swapping stereo channels
  • EngineType sets the synthesizer engine being used. Possible values are 1 (Modern (24-bit), default), 2 (Mark I), and 3 (OPL Series)
  • QuadDAC8Chan is an advanced option for the Raspberry Pi 5 only. It allows the use of four I2S DACs to give 8 independent mono audio channel outputs - one per tone generator (TG1 = DAC1 Left; TG2 = DAC1 Right; TG3 = DAC2 Left; etc). In this mode there are no effects and any pan or effect settings in performances are ignored. More details can be found here.

MIDI

# MIDI
MIDIBaudRate=31250
# MIDIThru=umidi1,ttyS1
MIDIRXProgramChange=1
IgnoreAllNotesOff=0
MIDIAutoVoiceDumpOnPC=0
HeaderlessSysExVoices=0
ExpandPCAcrossBanks=1
PerformanceSelectChannel=0
MIDISystemCCVol=0
MIDISystemCCPan=0
MIDISystemCCDetune=0

# See https://github.com/probonopd/MiniDexed/wiki/Hardware#usb-gadget-mode
USBGadget=0
#USBGadgetPin=0

Configures MIDI settings.

  • MIDIBaudRate determines the speed of the MIDI bus. Should normally be left at 31250
  • MIDIThru can be used to forward MIDI messages which MiniDexed is receiving, e.g., from a MIDI controller such as a keyboard, to another device attached to MiniDexed, such as a computer or tablet. Please see MIDI-Thru for details
  • MIDIRXProgramChange determines whether MIDI Program Change messages are received. If set to 1, MIDI Program Change messages are received, if set to 0, they are ignored
  • MIDIAutoVoiceDumpOnPC determines whether MIDI sysex dumps are sent when the program is changed. This can be useful, e.g., when MiniDexed is connected to a computer with Dexed or another tool that allows voices to be edited, as it provides a means to keep the tool's display in sync with what is happening on MiniDexed. But it isn't desirable in all circumstances as it does result in extra MIDI data being sent out to all MIDI OUT interfaces every time a voice is selected. If set to 1, MIDI sysex dumps are sent, if set to 0, they are not sent. Please see #386 for details
  • HeaderlessSysExVoices instructs MiniDexed to accept "headerless" SysEx voice bank files. Headerless files are 4096 bytes long, compared to the 4104 bytes of "headered" files. Some voice banks from the Internet have a mix of headered and headerless. The downside of accepting headerless files is that no validation is possible on the data and loading of voices can take longer on startup. An alternative to accepting headerless files is to use an external utility to pre-process SysEx files to ensure they are all in a format that MiniDexed can read.
  • ExpandPCAcrossBanks instructs MiniDexed to accept Program Change message values 0..127 and map them onto four consecutive banks of voices. MiniDexed assumes 32 voices per bank. The original DX7 accepted Program Change values of 0..31 only, but the DX7II accepted 0..63 for internal memory voices and 64..127 for the voices stored on the external cartridge. Note, if this is enabled then PC values are mapped onto the current selected bank and the next three consecutive banks, even if they are empty or not loaded (so not selectable via the MiniDexed UI menus). If this is disabled then PC messages using values greater than 31 are ignored.
  • PerformanceSelectChannel determines if MIDI Program Change (PC) messages should select individual voices within a tone generator or act at the system level and select performances. This mirrors the similarly named control on a DX7II. Setting this to 0 (the default) means PC messages select voices on any tone generators set to the receiving MIDI channel. Setting this to a MIDI channel (1 to 16) means PC messages on that channel will select performances. Setting this to a value >16 selects "Omni" mode so any PC messages received select performances. Note when in performance mode, no PC messages will be passed on to tone generators. Note that MIDIRXProgramChange has to be set to 1 for this to have any affect.
  • MIDISystemCCVol enables separate MIDI CC control of the volume of each Tone Generator. Ideal for use in performance mode when all TGs are responding to the same MIDI channel, this allows individual control of each TG via a series of 8 distinct MIDI CC messages - one per TG. There are 7 fixed maps of 8 MIDI CC messages that can be chosen for any of TG volume, pan or detune: 0=not used (default); 1-7 are defined as detailed on the MIDI pages here.
  • MIDISystemCCPan as above but for individual control of each Tone Generator's pan setting.
  • MIDISystemCCDetuned as above but for individual control of each Tone Generator's detuned setting.
  • USBGadget determines how the USB ports are used. If set to 1 then USB Gadget (device) Mode is enabled otherwise the system runs in USB Host mode. When used as a USB Gadget MiniDexed can be plugged into other devices, e.g. a PC. The normal mode is USB host which means other devices (e.g. keyboards, MIDI controllers) can be plugged into MiniDexed. USB Gadget mode is only supported on certain versions of the Raspberry Pi and has some important considerations for how the system is powered. IMPORTANT: Read this before enabling this option.
  • USBGadgetPin can be used when USBGadget=1 to allow hardware control over the USB mode. When the pin defined with USBGadgetPin is pulled LOW (and USBGadget=1), then USB gadget mode is enabled. If the pin is unconnected (i.e. left to be pulled HIGH) then USB host mode is assumed.

HD44780 LCD

# HD44780 LCD
LCDEnabled=1
LCDPinEnable=17
LCDPinRegisterSelect=4
LCDPinReadWrite=0
LCDPinData4=22
LCDPinData5=23
LCDPinData6=24
LCDPinData7=25
LCDI2CAddress=0x00

Configures the pinout for the optional HD44780 LCD.

  • If no HD44780 LCD is attached, LCDEnabled can be set to 0

To use a HD44780 device with i2c (requiring only 4 wires instead of many), set

LCDEnabled=1
LCDI2CAddress=0x27

In this case, all other values in this section will be ignored.

To use a HD44780 device without i2c (requiring more wires but faster), set

LCDI2CAddress=0x00

In this case, all other values in this section will be used.

SSD1306 OLED

# SSD1306 LCD
# For a 128x32 display, set LCDColumns=20; LCDRows=2
# For a 128x64 display, set LCDColumns=20; LCDRows=4
SSD1306LCDI2CAddress=0x0
SSD1306LCDWidth=128
SSD1306LCDHeight=32
SSD1306LCDRotate=0
SSD1306LCDMirror=0

# Default is 16x2 display (e.g. HD44780)
LCDColumns=16
LCDRows=2

Configures the optional SSD1306 based OLED. 128x32 and 128x64 display modules with i2c can be used, but currently only 128x32 pixels are used for text mode; contributions to graphically display the selected alogrithm would be very welcome.

  • If you use a SSD1306 based OLED, set SSD1306LCDI2CAddress to the i2c address of the particular module, usually 0x3c
  • For a 128x32 display, set LCDColumns=20 and LCDRows=2
  • For a 128x64 display, set LCDColumns=20 and LCDRows=4

If you use a SSD1306 based display, you can rotate and mirror the display in the following ways:

  • To rotate the display by 180 degrees, set SSD1306LCDRotate=1
  • To mirror the display along the short axis, set SSD1306LCDMirror=1
  • To mirror the display along the long axis, set both SSD1306LCDMirror=1 and SSD1306LCDRotate=1

ST7789 SPI Displays

# ST7789 LCD
# SPIBus=0 for any RPi (GPIO 10,11,8,7).
#     Note: Leave blank (default) if no SPI device required.
# Select=0|1 for CE0 or CE1
# Data = GPIO pin number
# Optional: Reset, Backlight = GPIO pin numbers
# Rotation=0,90,180,270
# SmallFont=0 (default), 1
#
# For a 240 wide display set LCDColumns=15 with LCDRows=2
SPIBus=
ST7789Enabled=0
ST7789Data=
ST7789Select=
ST7789Reset=
ST7789Backlight=
ST7789Width=240
ST7789Height=240
ST7789Rotation=0
ST7789SmallFont=0

There is some support for ST7789 based graphical displays. On a Raspberry Pi the default SPI bus (0) uses GPIO 10 and 11. SPI GPIO pin 9 (MISO) is not required. One of the chip select pins (0 or 1) should be configured. For the default SPI bus (0) these are on GPIO 8 and 7.

On a Raspberry Pi 4 or above there are additional SPI bus and pin options (more here).

To fully control a ST7789 display also requires a data pin. Some displays also include options for a reset pin and pin to control the backlight.

The other options (width, height, rotation) should be set for the display. SmallFont can be enabled if the display is relatively low resolution, but for displays of 240 pixels or higher is not recommended.

For a 240 pixel display without SmallFonts, the display will only support 15 columns:

LCDColumns=15
LCDRows=2

Advanced SPI Options

The following advanced options should only be used if the display is not being recognised and it is known that an alternative SPI configuration is required:

SPIBus=
SPIMode=
SPIClocKHz=

SPIBus has already been mentioned. SPIMode will allow one of the four SPI modes to be configured: 0, 1, 2, 3. These related to the different combinations of clock polarity and clock phase. The default is mode 0 (more here). SPIClockKHz permits an alternative SPI clock speed to be set (in KHz). The default is 15000 (i.e. 15MHz).

Note that it is recommended that SPI is left inactive if no SPI display is configured (the default). Also note that given the wide range of ST7789 displays, there is no guarantees that any particular display will be supported, but feel free to add details of the configuration used to the "list of hardware" thread in the discussions (here) for any that are found to work.

Buttons

# GPIO Button Navigation
#  Any buttons set to 0 will be ignored
ButtonPinPrev=0
ButtonActionPrev=
ButtonPinNext=0
ButtonActionNext=
ButtonPinBack=11
ButtonActionBack=longpress
ButtonPinSelect=11
ButtonActionSelect=click
ButtonPinHome=11
ButtonActionHome=doubleclick
ButtonPinShortcut=11
# (Shortcut doesn't have an action)

This section configures which pins are used for buttons, and which actions are triggered by which button actions (click, double-click, long-press). By default, the only button being used is the button that is built into the rotary encoder. Pins not used for buttons are set to 0 (disabled). ButtonPinShortcut defines the pin that is used for rotating the rotary encoder knob while the button is pressed. Probably you will want the button that is built into the rotary encoder to be used for shortcuts.

Optional GPIO Buttons for Program and Tone Generator selection

ButtonPinPgmUp=0
ButtonActionPgmUp=click
ButtonPinPgmDown=0
ButtonActionPgmDown=click
ButtonPinTGUp=0
ButtonActionTGUp=click
ButtonPinTGDown=0
ButtonActionTGDown=click

The above can be used to configure optional additional buttons for program up/down and tone generator up/down selection. Note that program up/down will act on voices if PerformanceSelectChannel is 0 and performances if configured for a MIDI channel.

Timeouts

# Timeouts in milliseconds for double click and long press
DoubleClickTimeout=400
LongPressTimeout=400

Defines the timing for double-click and long-press actions. NOTE: For logical reasons, LongPressTimeout cannot be lower than DoubleClickTimeout (if it is, then the higher value of the two will be used).

MIDI Button Navigation

This section allows you to use physical buttons on your MIDI controller (like a MIDI keyboard) as the buttons for MiniDexed, instead of or in addition to a rotary encoder and/or GPIO buttons.

# MIDI Button Navigation
#  Specify MIDI CC to act as a button
#  NB: Off < 64 < ON
# CC channel: 0=OFF; 1-16 MIDI Ch; >16 Omni
MIDIButtonCh=17
MIDIButtonNotes=0
MIDIButtonPrev=00
MIDIButtonNext=02
MIDIButtonBack=03
MIDIButtonSelect=04
MIDIButtonHome=06
MIDIButtonPgmUp=0
MIDIButtonPgmDown=0
MIDIButtonTGUp=0
MIDIButtonTGDown=0

It is possible to emulate any of the UI buttons over MIDI either using MIDI Control Change (CC) messages or Note messages. This section configures which MIDI Control Change (CC) or Note messages to listen to for each button action.

NOTE: Need to set MIDIButtonCh=17 (Omni mode) if MiniDexed should react to these buttons when the MIDI controller is set to any MIDI channel. Also need to define the number of the Control Change message the respective button on the MIDI controller is sending.

NOTE: The MIDI controller may need to be configured so that it does not "Toggle" but "Trigger/Release". Please refer to the documentation of your MIDI controller. (This has been tested on the Nektar Impact LX61+.)

It is possible to use NoteOn/NoteOff messages as "MIDI buttons" too. This may be useful if your MIDI controller has no other buttons and you need to use some white/black keys as buttons. Turn this functionality on with MIDIButtonNotes=1, then set the MIDIButton values to MIDI note numbers - e.g. 60, 62, 64, 65, 67 for C4-G4.

KY-040 Rotary Encoder

# KY-040 Rotary Encoder
EncoderEnabled=1
EncoderPinClock=10
EncoderPinData=9

(The key EncoderPinSwitch is no longer used as of June 15, 2022, and can be removed.)

Configures the pinout for the optional KY-040 Rotary Encoder.

  • EncoderEnabled can be set to 0 if no encoder is attached.
  • EncoderPinClock sets the pin attached to one of the Rotary Encoder data pins ("clock" is a bit misleading but Rotary Encoders are labeled this way)
  • EncoderPinData sets the pin attached to the other of the Rotary Encoder data pins
  • EncoderPinSwitch sets the pin attached to the push button

Debug

# Debug
MIDIDumpEnabled=0
ProfileEnabled=0

Configures output useful for debugging.

  • MIDIDumpEnabled can be set to 1 to print incoming MIDI messages to an attached HDMI display. This can be useful to see what MIDI data an attached device is sending to MiniDexed
  • ProfileEnabled can be set to 1` to periodically print CPU usage information to an attached HDMI display

cmdline.txt

Some MIDI keyboards need usbspeed=full to be set in this file, or else you will get missed MIDI events. Note that when usbspeed=full is set, PC keyboards may no longer work.

Some MIDI controllers attempt to set up other USB endpoints in addition to the audio/MIDIStreaming endpoint. In the event log (on the HDMI display) if you see messages such as the following, then try adding usbignore=int3-0-0, or whatever the first failing USB interface is for your keyboard. Don't do this for int1-3-0, that is the MIDI interface, (and also note that the message "function is not supported" is not a failure and can be ignored):

usbdev1-1: Interface int3-0-0 found
usbdev1-1: Cannot get HID report descriptor
usbdev1-1: Interface int1-3-0 found
usbdev1-1: Using device/interface int1-3-0
xhciep: Transfer timed out
usbdev1-1: Cannot set configuration (1)
usbhub: Port 1: Cannot configure device

This also seems to be the case for home-built MIDI Controllers based on CircuitPython especially if used with MiniDexed on a Raspberry Pi 4 (for details, see https://github.com/probonopd/MiniDexed/discussions/197). An alternative solution is to disable the HID int3-0-0 interface on the CircuitPython device (as described in this article) by creating a boot.py file that contains the following:

# CircuitPython boot.py file
import usb_hid, usb_midi
usb_hid.disable()
usb_midi.enable()

Workaround for Roland MIDI devices

Some Roland MIDI devices interpret the "All Notes Off" MIDI command differently. Set IgnoreAllNotesOff=1 in minidexed.ini as a workaround (more information).

Voice data (.syx files)

Voice data (the contents of cartridges) can be put as .syx files into the sysex/voice/ directory on the SD card. This isn't part of the release, so has to be created separately.

The files have to be numbered and named in this way:

sysex/voice/000001_filename.syx
sysex/voice/000002_filename.syx
...

The number (000001, 000002) corresponds to the "bank" number (in decimal) used when selecting voices for the tone generators via the menu. "filename" is used as the name for the voice bank. Bank numbers go from 00001 to 16384, giving a total of 16384 banks supported. Note that loading more than a few hundred banks from the same directory will be slow, so it is recommended that subdirectories are used to categorise banks and speed up loading.

Any errors in reading voice data will be printed to an attached display, so if there are voices missing, or no voices at all, check for errors such as "Directory sysex/voice not found", "Invalid filename format" or "Invalid size or format" on startup.

There is a script getsysex.sh that can download some .syx files and place them into the sysex/voice directory with working names for you automatically.

Note: At present there is no way to save voice parameters back to specific banks, but the "live" voice parameter settings can be saved as part of a "performance" (see below).

Voice banks should be in the VMEM (compressed) format and should be in banks of 32 voices each, each voice being 128 bytes in size. The system will support sysex files with a header (4104 bytes in size) and optionally (if HeaderlessSysExVoices=1) files without a header (4096 bytes in size). Files with headers are recommended as MiniDexed is then able to confirm they are Yamaha voice files on loading.

performance.ini

MiniDexed is 8-parts multitimbral and each of these parts corresponds to a tone generator (TG1 - TG8) which can be parameterized. All settings that can be changed from the MiniDexed menu can be saved in a performance.ini file. This includes voice, bank (although see next comment), PAN, detune, volume, cutoff, MIDI channel and so on.

Any changes made under "Edit Voice" are also saved in Performance.ini but note that these changes override any bank or voice numbers stored.

In fact when a performance is saved all currently "live" voice data, whether an edited voice or a voice loaded from a bank, will always be written out to the performance.ini file and when loaded back in it will always take precedence over any bank or voice number specified in the file. The consequence of this is that if a performance.ini file is edited by hand (i.e. away from MiniDexed directly from the SD card) and the bank and voice numbers changed, then the VoiceDataX lines will have to be cleared for the bank and voice settings to take effect and the VoiceData will be recreated from the "live" voice whenever the performance is next saved.

The default performance.ini file is located in root and will load while MiniDexed starts up. Switchable performances files must be saved in a "performance" folder:

performance/000002_FirstPerf.ini
performance/000003_NextPerf.ini
...
performance/000128_LastPerf.ini

The file name has to have the following format: XXXXXX_PerfName.ini, where XXXXXX is the performance number (000001 to 000128) and PerfName can't exceed 14 characters.

Note that performance 1 refers to the original performance.ini file stored in the root directory, so additional performances will start from 000002.

Performances can also be stored in additional banks as follows:

performance/002_FirstBank/000001_Bank2FirstPerf.ini
performance/002_FirstBank/000002_Bank2NextPerf.ini
performance/003_SecondBank/000001_Bank3FirstPerf.ini
performance/003_SecondBank/000128_Bank3LastPerf.ini
performance/128_LastBank/000128_LastBankLastPerf.ini

The bank name format is BBB_Bankname.ini, where BBB is a bank number between 002-128. The first bank (001) refers to the performance files in the performance/ directory itself so cannot be used for an additional bank.

When MiniDexed is configured so that MIDI Program Change messages will select performances, the performance number (XXXXXX above) corresponds to the MIDI Program Change number (1..128) and the bank number (BBB above) corresponds to the MIDI BANKSEL message (1-128). Note that only the BANKSEL LSB is actually significant, but the MIDI specification states that both MSB and LSB should be transmitted. MiniDexed will change banks when it receives the LSB message, pairing it with the last received MSB.

Also note as detailed in the MIDI specification, the 1..128 performance and bank numbers will be converted to the MIDI 0..127 range "on the wire" in MIDI messages.

MiniDexed supports up to 128 banks each containing 128 performances, although as previously noted, Bank 001/Perf 000001 is reserved for the default performance.ini file.

All performance files have the following format and parameters, with the first section repeated for each of the 8 tone generators and then an additional effects section at the end.

As mentioned above, BankNumber and VoiceNumber are only significant if VoiceData is empty, but VoiceData will be automatically populated every time a performance is saved.

TG 1-8

BankNumber#=0            # 0 .. 127, points to the bank from /sysex/voices/ (in MIDI 0..127 format at present)
VoiceNumber#=1           # 1 .. 32, points to voice from the bank
MIDIChannel#=1           # 1 .. 16, 0: off, >16: omni mode
Volume#=100              # 0 .. 127, volume of the Voice
Pan#=64                  # 0 .. 127, 64=centre; 0=left; 127=right
Detune#=0                # -99 .. 99, 0=in tune
Cutoff#=99               # 0 .. 99, Filter setting
Resonance#=0             # 0 .. 99, 
NoteLimitLow#=0          # 0 .. 127, C-2 .. G8, 60 for the middle C3
NoteLimitHigh#=127       # 0 .. 127, C-2 .. G8, 
NoteShift#=0             # -24 .. 24, each value is detuned by one semitone
ReverbSend#=0            # 0 .. 99
PitchBendRange#=2        # 0 .. 12
PitchBendStep#=0         # 0 .. 12
PortamentoMode#=0        # 0 .. 1
PortamentoGlissando#=0   # 0 .. 1
PortamentoTime#=0        # 0 .. 99
VoiceData#=              # space separated hex numbers of 156 voice parameters. Example: 5F 1D 14 32 63 [....] 20 55
MonoMode#=0              # 0-off .. 1-On
ModulationWheelRange#=99 # 0..99
ModulationWheelTarget#=1 # 0..7
FootControlRange#=99     # 0..99
FootControlTarget#=0     # 0..7
BreathControlRange#=99   # 0..99
BreathControlTarget#=0   # 0..7
AftertouchRange#=99      # 0..99
AftertouchTarget#=0      # 0..7
# Effects
CompressorEnable=1       # 0: off, 1: on
ReverbEnable=1           # 0: off, 1: on
ReverbSize=70            # 0 .. 99
ReverbHighDamp=50        # 0 .. 99
ReverbLowDamp=50         # 0 .. 99
ReverbLowPass=30         # 0 .. 99
ReverbDiffusion=65       # 0 .. 99
ReverbLevel=80           # 0 .. 99