Eric
 | Posted on Mon 12 Oct 2026, 09:01 PM Hi Kodamo,
I’m developing a desktop editor for my MASK1EX MK2 running firmware 2.0, and would like to read the currently edited sound into the UI—including changes made on the hardware that haven’t been saved.
From the official Organizer, I found the numbered voice request:
`F0 00 00 02 <voice LSB> <voice MSB> F7`
This successfully returns a 64-byte voice after unpacking the nibble pairs. However, after changing the filter cutoff on the hardware without saving, reading the patch slot still returns the original data.
Is there a supported SysEx command or special address to retrieve the **current unsaved edit buffer**, ideally for each part, without changing programs or writing to patch memory?
Also, is a MASK1EX MK2 SysEx specification available, including the voice structure and partial-voice commands mentioned in the manual?
Thanks! |
KODAMO
 | Posted on Mon 02 Nov 2026, 09:15 PM Hi,
Here is the voice structure for the 64-byte voice data:
#define VOICE_NAME_LEN 8
#define NB_OSC 2
#define NB_ADSR 4
#define NB_LFO 2
#define NB_FX 2
struct instrument
{
unsigned char filtermode_splitpointpart1; // 1-2 mode filtre (LP, HP, BP). 3-8 split point
char name[VOICE_NAME_LEN]; // nom du son
unsigned char cutoff_isdrumkit; // 1-7 cutoff (0...127). 8 isdrumkit (0/1)
unsigned char resonance_tracking; // 1-7 resonance (0...60). 8 tracking filtre (0/1)
struct
{
unsigned char ad; // 1-4 attack (0...15). 5-8 decay (0...15)
unsigned char sr; // 1-4 sustain (0...15). 5-8 release (0...15)
unsigned char vol_loop; // 1-7 volume (0...20). 8 adsr loop(0/1)
}adsr[NB_ADSR];
// 23 bytes
struct
{
unsigned char mask; // masque (0...255)
signed char transpose; // transposition (-60...60)
signed char detune; // detune (-40...40)
signed char maskStart; // depart masque (-40...40)
unsigned char maskTime; // temps masque 1-5 (0...40), 6 = mask bit #9
}osc[NB_OSC];
// 33 bytes
struct
{
unsigned char presetId; // 1-4 vitesse LFO (0...15). 5-8 forme d'onde LFO (0...7)
unsigned char presetIdB; // 1-4 profondeur LFO (0...15). 5-8 destination LFO (0...12)
unsigned char delay; // 1-4 delay LFO. 5-8 decay LFO
}lfo[NB_LFO];
signed char pitchEnvStart; // depart enveloppe pitch (-60...60)
unsigned char pitchEnvTime; // vitesse enveloppe pitch (1...40)
unsigned char arpSpeed; // 1-4 sensibilite volume a la velocite(0...15). 5-8 sensibilite cutoff a la velocite (0...15)
unsigned char noiseFreq; // periode du noise (1...80)
signed char transpose; // transposition globale voice
volatile unsigned char volume_arpLatchRetrig; // 1-5 volume global voice (0...31). 6 arp latch (0/1). 7 arp retrigger (0/1)
unsigned char unused; // 8 bit FREE
// 46 bytes
struct
{
unsigned char send; // balance effet (0...25)
unsigned char preset; // 1-4 preset effet (0...15). 5-8 type effet (0...1/2)
}fx[NB_FX];
// 50 bytes
unsigned char arpPresetId_isLayerSplit; // preset arpegiateur (0...28), islayersplit (0=no, 1=layer, 2=split)
unsigned char portaspeed_panSpread; // vitesse portamento (3...15), pan spread (0...15)
signed char pitchEnvEnd; // fine enveloppe pitch (-60...60)
signed short voiceLayerSplitId;
unsigned char modAft; // mod dest aftertouch (0...15), depth (0...15)
unsigned char modWheel; // mod dest modwheel (0...15), depth (0...15)
unsigned char fltTracking_splitpointpart2; // 1-5 fltTracking (0...20), 6 splitpointpart2
// 57 bytes
signed char layerTransp;
signed char layerTune;
unsigned char layerPan_vol; // 1-4 pan, 5-8 vol
unsigned char playmode; // 1-4 playmode, 5-6 osc1 delta loop, 7-8 osc2 delta loop
unsigned char modVel; // mod dest velocity (0...15), depth (0...15)
unsigned char krs; // 1-4 Key Rate Scaling, 5-8 filter extra
};
There is currently no command to retrieve the current edit buffer. Maybe that could be added though
- Sysex to get a voice from Mask1 : 0xf0, 0x00, 0x00, 0x02, voiceNumber&127, voiceNumber>>7, 0xf7
You will receive sysex data of voice structure, packed as 4-bit values (so size = double the real size, you have to make bytes with these nibbles)
voiceNumber is the ID of the voice you want to get/edit. Between 0 and 120 for Mask1 or 0 and 377 for Mask1EX you will get factory presets, and starting from 128 for Mask1 or 384 for Mask1EX you will get user sounds.
- Sysex to send a voice to Mask1 : 0xf0, 0x00, 0x00, 0x01, voiceNumber&127, voiceNumber>>7, [ voice structure converted in 4-bit nibbles], 0xf7
- Sysex to perform the write after you send it to the device : 0xF0, 0x00, 0x00, 0x05, voiceNumber&127, voiceNumber>>7, 0xF7
- Or if you sent multiple voices and want to write them all at once : 0xF0, 0x00, 0x00, 0x05, 0x7F, 0x7F, 0xF7
/!\ Beware of write operations, if you trigger them in a loop by mistake, you might wear the EEPROM quickly. |