|
|
|
@ -1,25 +1,25 @@ |
|
|
|
|
/*
|
|
|
|
|
* MicroDexed |
|
|
|
|
* |
|
|
|
|
* MicroDexed is a port of the Dexed sound engine |
|
|
|
|
* (https://github.com/asb2m10/dexed) for the Teensy-3.5/3.6 with audio shield
|
|
|
|
|
*
|
|
|
|
|
* (c)2018 H. Wirtz <wirtz@parasitstudio.de> |
|
|
|
|
* |
|
|
|
|
* This program is free software; you can redistribute it and/or modify |
|
|
|
|
* it under the terms of the GNU General Public License as published by |
|
|
|
|
* the Free Software Foundation; either version 3 of the License, or |
|
|
|
|
* (at your option) any later version. |
|
|
|
|
* |
|
|
|
|
* This program is distributed in the hope that it will be useful, |
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
|
|
|
* GNU General Public License for more details. |
|
|
|
|
* |
|
|
|
|
* You should have received a copy of the GNU General Public License |
|
|
|
|
* along with this program; if not, write to the Free Software Foundation, |
|
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
|
|
|
* |
|
|
|
|
MicroDexed |
|
|
|
|
|
|
|
|
|
MicroDexed is a port of the Dexed sound engine |
|
|
|
|
(https://github.com/asb2m10/dexed) for the Teensy-3.5/3.6 with audio shield
|
|
|
|
|
|
|
|
|
|
(c)2018 H. Wirtz <wirtz@parasitstudio.de> |
|
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify |
|
|
|
|
it under the terms of the GNU General Public License as published by |
|
|
|
|
the Free Software Foundation; either version 3 of the License, or |
|
|
|
|
(at your option) any later version. |
|
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful, |
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
|
|
|
GNU General Public License for more details. |
|
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License |
|
|
|
|
along with this program; if not, write to the Free Software Foundation, |
|
|
|
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#include <Arduino.h> |
|
|
|
@ -68,64 +68,92 @@ bool load_sysex_voice(File sysex, uint8_t voice_number) |
|
|
|
|
if (file = SD.open(sysex.name())) |
|
|
|
|
{ |
|
|
|
|
uint8_t* p_data = dexed->data; |
|
|
|
|
uint8_t i; |
|
|
|
|
uint8_t op; |
|
|
|
|
uint8_t tmp; |
|
|
|
|
|
|
|
|
|
dexed->notes_off(); |
|
|
|
|
|
|
|
|
|
file.seek(6 + (voice_number * 128)); |
|
|
|
|
for (i = 0; i < 6; i++) |
|
|
|
|
{ |
|
|
|
|
file.read(p_data + (i * 21), 11); // R1, R2, R3, R4, L1, L2, L3, L4, LEV SCL BRK PT, SCL LEFT DEPTH, SCL RGHT DEPTH
|
|
|
|
|
for (op = 0; op < 6; op++) |
|
|
|
|
{ |
|
|
|
|
// DEXED_OP_EG_R1, // 0
|
|
|
|
|
// DEXED_OP_EG_R2, // 1
|
|
|
|
|
// DEXED_OP_EG_R3, // 2
|
|
|
|
|
// DEXED_OP_EG_R4, // 3
|
|
|
|
|
// DEXED_OP_EG_L1, // 4
|
|
|
|
|
// DEXED_OP_EG_L2, // 5
|
|
|
|
|
// DEXED_OP_EG_L3, // 6
|
|
|
|
|
// DEXED_OP_EG_L4, // 7
|
|
|
|
|
// DEXED_OP_LEV_SCL_BRK_PT, // 8
|
|
|
|
|
// DEXED_OP_SCL_LEFT_DEPTH, // 9
|
|
|
|
|
// DEXED_OP_SCL_RGHT_DEPTH, // 10
|
|
|
|
|
file.read(p_data + (op * 21) + DEXED_OP_EG_R1, 11); |
|
|
|
|
tmp = file.read(); |
|
|
|
|
*(p_data + 11 + (i * 21)) = (tmp & 0x3); // SCL LEFT CURVE
|
|
|
|
|
*(p_data + 12 + (i * 21)) = (tmp & 0x0c) >> 2; // SCL RGHT CURVE
|
|
|
|
|
*(p_data + DEXED_OP_SCL_LEFT_CURVE + (op * 21)) = (tmp & 0x3); |
|
|
|
|
*(p_data + DEXED_OP_SCL_RGHT_CURVE + (op * 21)) = (tmp & 0x0c) >> 2; |
|
|
|
|
tmp = file.read(); |
|
|
|
|
*(p_data + 20 + (i * 21)) = (tmp & 0x78) >> 3; // DETUNE
|
|
|
|
|
*(p_data + 13 + (i * 21)) = (tmp & 0x07); // RS
|
|
|
|
|
*(p_data + DEXED_OP_OSC_DETUNE + (op * 21)) = (tmp & 0x78) >> 3; |
|
|
|
|
*(p_data + DEXED_OP_OSC_RATE_SCALE + (op * 21)) = (tmp & 0x07); |
|
|
|
|
tmp = file.read(); |
|
|
|
|
*(p_data + 15 + (i * 21)) = (tmp & 0x1c) >> 2; // KVS
|
|
|
|
|
*(p_data + 14 + (i * 21)) = (tmp & 0x03); // AMS
|
|
|
|
|
*(p_data + 16 + (i * 21)) = file.read(); // OUTPUT LVL
|
|
|
|
|
*(p_data + DEXED_OP_KEY_VEL_SENS + (op * 21)) = (tmp & 0x1c) >> 2; |
|
|
|
|
*(p_data + DEXED_OP_AMP_MOD_SENS + (op * 21)) = (tmp & 0x03); |
|
|
|
|
*(p_data + DEXED_OP_OUTPUT_LEV + (op * 21)) = file.read(); |
|
|
|
|
tmp = file.read(); |
|
|
|
|
*(p_data + 18 + (i * 21)) = (tmp & 0x3e) >> 1; // FREQ_CORSE
|
|
|
|
|
*(p_data + 17 + (i * 21)) = (tmp & 0x01); // OP MODE
|
|
|
|
|
file.read(p_data + 19 + (i * 21), 1); // FREQ FINE
|
|
|
|
|
} |
|
|
|
|
file.read(p_data + 125, 8); // PR1, PR2, PR3, PR4, PL1, PL2, PL3, PL4
|
|
|
|
|
*(p_data + DEXED_OP_FREQ_COARSE + (op * 21)) = (tmp & 0x3e) >> 1; |
|
|
|
|
*(p_data + DEXED_OP_OSC_MODE + (op * 21)) = (tmp & 0x01); |
|
|
|
|
file.read(p_data + DEXED_OP_FREQ_FINE + (op * 21), 1); |
|
|
|
|
} |
|
|
|
|
// DEXED_PITCH_EG_R1, // 0
|
|
|
|
|
// DEXED_PITCH_EG_R2, // 1
|
|
|
|
|
// DEXED_PITCH_EG_R3, // 2
|
|
|
|
|
// DEXED_PITCH_EG_R4, // 3
|
|
|
|
|
// DEXED_PITCH_EG_L1, // 4
|
|
|
|
|
// DEXED_PITCH_EG_L2, // 5
|
|
|
|
|
// DEXED_PITCH_EG_L3, // 6
|
|
|
|
|
// DEXED_PITCH_EG_L4, // 7
|
|
|
|
|
file.read(p_data + DEXED_VOICE_OFFSET + DEXED_PITCH_EG_R1, 8); |
|
|
|
|
tmp = file.read(); |
|
|
|
|
*(p_data + 134) = (tmp & 0x1f); // ALG
|
|
|
|
|
*(p_data + DEXED_VOICE_OFFSET + DEXED_ALGORITHM) = (tmp & 0x1f); |
|
|
|
|
tmp = file.read(); |
|
|
|
|
*(p_data + 136) = (tmp & 0x08) >> 3; // OKS
|
|
|
|
|
*(p_data + 135) = (tmp & 0x07); // FB
|
|
|
|
|
file.read(p_data + 137, 4); // LFS, LFD, LPMD, LAMD
|
|
|
|
|
*(p_data + DEXED_VOICE_OFFSET + DEXED_OSC_KEY_SYNC) = (tmp & 0x08) >> 3; |
|
|
|
|
*(p_data + DEXED_VOICE_OFFSET + DEXED_FEEDBACK) = (tmp & 0x07); |
|
|
|
|
// DEXED_LFO_SPEED, // 11
|
|
|
|
|
// DEXED_LFO_DELAY, // 12
|
|
|
|
|
// DEXED_LFO_PITCH_MOD_DEP, // 13
|
|
|
|
|
// DEXED_LFO_AMP_MOD_DEP, // 14
|
|
|
|
|
file.read(p_data + DEXED_VOICE_OFFSET + DEXED_LFO_SPEED, 4); |
|
|
|
|
tmp = file.read(); |
|
|
|
|
*(p_data + 143) = (tmp & 0x30) >> 4; // LFO PITCH MOD SENS
|
|
|
|
|
*(p_data + 142) = (tmp & 0x0e) >> 1; // LFO WAV
|
|
|
|
|
*(p_data + 141) = (tmp & 0x01); // LFO SYNC
|
|
|
|
|
file.read(p_data + 144, 1); // TRNSP
|
|
|
|
|
file.read(p_data + 145, 10); // NAME
|
|
|
|
|
*(p_data + 155) = 1; // PBEND RANGE
|
|
|
|
|
*(p_data + 156) = 0; // PBEND STEP
|
|
|
|
|
*(p_data + 157) = 99; // MOD RANGE
|
|
|
|
|
*(p_data + 158) = 0; // MOD ASSIGN
|
|
|
|
|
*(p_data + 159) = 99; // FOOT CTRL RANGE
|
|
|
|
|
*(p_data + 160) = 0; // FOOT CTRL ASSIGN
|
|
|
|
|
*(p_data + 161) = 99; // BREATH CTRL RANGE
|
|
|
|
|
*(p_data + 162) = 0; // BREATH CTRL ASSIGN
|
|
|
|
|
*(p_data + 163) = 99; // AT RANGE
|
|
|
|
|
*(p_data + 164) = 0; // AT ASSIGN
|
|
|
|
|
*(p_data + 165) = 0; // MASTER TUNE
|
|
|
|
|
*(p_data + 166) = 1; // OP1 ENABLE
|
|
|
|
|
*(p_data + 167) = 1; // OP2 ENABLE
|
|
|
|
|
*(p_data + 168) = 1; // OP3 ENABLE
|
|
|
|
|
*(p_data + 169) = 1; // OP4 ENABLE
|
|
|
|
|
*(p_data + 170) = 1; // OP5 ENABLE
|
|
|
|
|
*(p_data + 171) = 1; // OP6 ENABLE
|
|
|
|
|
*(p_data + 172) = MAX_NOTES; |
|
|
|
|
|
|
|
|
|
dexed->setOPs((*(p_data + 166) << 5) | (*(p_data + 167) << 4) | (*(p_data + 168) << 3) | (*(p_data + 166) << 2) | (*(p_data + 170) << 1) | *(p_data + 171)); |
|
|
|
|
dexed->setMaxNotes(*(p_data + 172)); |
|
|
|
|
*(p_data + DEXED_VOICE_OFFSET + DEXED_LFO_PITCH_MOD_SENS) = (tmp & 0x30) >> 4; |
|
|
|
|
*(p_data + DEXED_VOICE_OFFSET + DEXED_LFO_WAVE) = (tmp & 0x0e) >> 1; |
|
|
|
|
*(p_data + DEXED_VOICE_OFFSET + DEXED_LFO_SYNC) = (tmp & 0x01); |
|
|
|
|
file.read(p_data + DEXED_VOICE_OFFSET + DEXED_TRANSPOSE, 1); |
|
|
|
|
file.read(p_data + DEXED_VOICE_OFFSET + DEXED_NAME, 10); |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_PITCHBEND_RANGE) = 1; |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_PITCHBEND_STEP) = 0; |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_MODWHEEL_RANGE) = 99; |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_MODWHEEL_ASSIGN) = 0; |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_FOOTCTRL_RANGE) = 99; |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_FOOTCTRL_ASSIGN) = 0; |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_BREATHCTRL_RANGE) = 99; |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_BREATHCTRL_ASSIGN) = 0; |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_AT_RANGE) = 99; |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_AT_ASSIGN) = 0; |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_MASTER_TUNE) = 0; |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_OP1_ENABLE) = 1; |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_OP2_ENABLE) = 1; |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_OP3_ENABLE) = 1; |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_OP4_ENABLE) = 1; |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_OP5_ENABLE) = 1; |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_OP6_ENABLE) = 1; |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_MAX_NOTES) = MAX_NOTES; |
|
|
|
|
|
|
|
|
|
dexed->setOPs((*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_OP1_ENABLE) << 5) | |
|
|
|
|
(*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_OP2_ENABLE) << 4) | |
|
|
|
|
(*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_OP3_ENABLE) << 3) | |
|
|
|
|
(*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_OP4_ENABLE) << 2) | |
|
|
|
|
(*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_OP5_ENABLE) << 1) | |
|
|
|
|
*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_OP6_ENABLE )); |
|
|
|
|
dexed->setMaxNotes(*(p_data + DEXED_GLOBAL_PARAMETER_OFFSET + DEXED_MAX_NOTES)); |
|
|
|
|
dexed->doRefreshVoice(); |
|
|
|
|
dexed->activate(); |
|
|
|
|
|
|
|
|
|