From 09f4b3463e324f2a93cb1a7e024c292084abf404 Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Thu, 7 Jun 2018 12:55:18 +0200 Subject: [PATCH] Added bank loading (banks have to be organized in _one_ sysex file per directory (named like the bank number), e.g. 5/ROM1B.SYX). --- MicroDexed.ino | 9 ++++----- config.h | 2 +- dexed_sysex.cpp | 49 +++++++++++++++++++++++++++++++++++-------------- dexed_sysex.h | 4 ++-- 4 files changed, 42 insertions(+), 22 deletions(-) diff --git a/MicroDexed.ino b/MicroDexed.ino index a22143b..05b837c 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -45,6 +45,8 @@ AudioControlSGTL5000 sgtl5000_1; //xy=507,403 MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI); Dexed* dexed = new Dexed(SAMPLE_RATE); bool sd_card_available = false; +uint8_t bank = DEFAULT_SYSEXBANK; + #ifdef MASTER_KEY_MIDI bool master_key_enabled = false; #endif @@ -107,7 +109,7 @@ void setup() #endif // load default SYSEX data - load_sysex(DEFAULT_SYSEXFILE, DEFAULT_SYSEXSOUND); + load_sysex(bank, DEFAULT_SYSEXSOUND); #ifdef DEBUG show_patch(); @@ -277,16 +279,13 @@ bool handle_master_key(uint8_t data) { int8_t num = num_key_base_c(data); - Serial.print(F("Key->Number: ")); - Serial.println(num); - if (num > 0) { // a white key! num = num - 1 + (((data - MASTER_NUM1) / 12) * 7); if (num <= 32) { - if (!load_sysex(DEFAULT_SYSEXFILE, num)) + if (!load_sysex(bank, num)) { Serial.print(F("E: cannot load voice number ")); Serial.println(num, DEC); diff --git a/config.h b/config.h index 83b38f1..7ac2a57 100644 --- a/config.h +++ b/config.h @@ -40,7 +40,7 @@ #define MAX_NOTES 16 #define AUDIO_MEM 2 -#define DEFAULT_SYSEXFILE "RITCH0~2.SYX" +#define DEFAULT_SYSEXBANK 5 #define DEFAULT_SYSEXSOUND 0 #define MASTER_KEY_MIDI 84 // C6 diff --git a/dexed_sysex.cpp b/dexed_sysex.cpp index 8c02dcb..f43a26d 100644 --- a/dexed_sysex.cpp +++ b/dexed_sysex.cpp @@ -30,16 +30,23 @@ #include "dexed_sysex.h" #include "config.h" -bool load_sysex(char *name, uint8_t voice_number) +bool load_sysex(uint8_t bank, uint8_t voice_number) { File root; bool found = false; voice_number %= 32; + bank %= 10; if (sd_card_available) { - root = SD.open("/"); + char bankdir[3]; + + bankdir[0] = '/'; + bankdir[2] = '\0'; + itoa(bank, &bankdir[1], 10); + + root = SD.open(bankdir); if (!root) { Serial.println(F("E: Cannot open main dir from SD.")); @@ -57,19 +64,23 @@ bool load_sysex(char *name, uint8_t voice_number) { if (!entry.isDirectory()) { - if (strcmp(name, entry.name()) == 0) + uint8_t data[128]; + found = true; + if (get_sysex_voice(bankdir, entry, voice_number, data)) { - uint8_t data[128]; - - found = true; - if (get_sysex_voice(entry, voice_number, data)) - return (dexed->loadSysexVoice(data)); - else - Serial.println(F("E: Cannot load voice data")); - entry.close(); - break; + char n[11]; + strncpy(n, (char*)&data[118], 10); + Serial.print("<"); + Serial.print(entry.name()); + Serial.print("|'"); + Serial.print(n); + Serial.println("'>"); + return (dexed->loadSysexVoice(data)); } + else + Serial.println(F("E: Cannot load voice data")); entry.close(); + break; } } } @@ -80,18 +91,23 @@ bool load_sysex(char *name, uint8_t voice_number) return (false); } -bool get_sysex_voice(File sysex, uint8_t voice_number, uint8_t* data) +bool get_sysex_voice(char* dir, File sysex, uint8_t voice_number, uint8_t* data) { File file; uint16_t i, n; uint32_t calc_checksum = 0; + char sysex_file[20]; + + strcpy(sysex_file, dir); + strcat(sysex_file, "/"); + strcat(sysex_file, sysex.name()); if (sysex.size() != 4104) // check sysex size { Serial.println(F("E: SysEx file size wrong.")); return (false); } - if (file = SD.open(sysex.name())) + if (file = SD.open(sysex_file)) { if (file.read() != 0xf0) // check sysex start-byte { @@ -135,5 +151,10 @@ bool get_sysex_voice(File sysex, uint8_t voice_number, uint8_t* data) return (false); } } + else + { + Serial.print(F("Cannot open ")); + Serial.println(sysex.name()); + } return (true); } diff --git a/dexed_sysex.h b/dexed_sysex.h index 50ce75e..eaf4d89 100644 --- a/dexed_sysex.h +++ b/dexed_sysex.h @@ -25,6 +25,6 @@ extern bool sd_card_available; extern Dexed* dexed; -bool load_sysex(char *name, uint8_t voice_number); -bool get_sysex_voice(File sysex, uint8_t voice_number, uint8_t* data); +bool load_sysex(uint8_t bank, uint8_t voice_number); +bool get_sysex_voice(char* dir, File sysex, uint8_t voice_number, uint8_t* data);