zynaddsubfx

ZynAddSubFX open source synthesizer
Log | Files | Refs | Submodules | LICENSE

commit f48af51550097d36acb602a37f369aa18ff8e62a
parent 2894ee1a11f01e586a6c6ac3b810a1579309058f
Author: fundamental <mark.d.mccurry@gmail.com>
Date:   Fri, 14 May 2010 10:42:09 -0400

Bank: cleanup and fixing introduced bugs

Diffstat:
Msrc/Misc/Bank.cpp | 180++++++++++++++++++++++---------------------------------------------------------
Msrc/Misc/Bank.h | 13++++---------
Msrc/Misc/Util.cpp | 12+++++++++++-
Msrc/Misc/Util.h | 2++
Msrc/Params/PresetsStore.cpp | 6+-----
Msrc/UI/BankUI.fl | 26++++++++++++++------------
6 files changed, 81 insertions(+), 158 deletions(-)

diff --git a/src/Misc/Bank.cpp b/src/Misc/Bank.cpp @@ -1,9 +1,11 @@ /* ZynAddSubFX - a software synthesizer - Bank.h - Instrument Bank + Bank.cpp - Instrument Bank Copyright (C) 2002-2005 Nasca Octavian Paul + Copyright (C) 2010-2010 Mark McCurry Author: Nasca Octavian Paul + Mark McCurry This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License @@ -27,6 +29,7 @@ #include <dirent.h> #include <sys/stat.h> #include <algorithm> +#include <iostream> #include <sys/types.h> #include <fcntl.h> @@ -43,17 +46,10 @@ using namespace std; Bank::Bank() + :defaultinsname(" ") { - defaultinsname = " "; - - for(int i = 0; i < BANK_SIZE; i++) { - ins[i].used = false; - ins[i].info.PADsynth_used = false; - } clearbank(); - bankfiletitle = dirname; - loadbank(config.cfg.currentBankDir); } @@ -79,12 +75,8 @@ string Bank::getnamenumbered(unsigned int ninstrument) { if(emptyslot(ninstrument)) return defaultinsname; - snprintf(tmpinsname[ninstrument], - PART_MAX_NAME_LEN + 15, - "%d. %s", - ninstrument + 1, - getname(ninstrument).c_str()); - return tmpinsname[ninstrument]; + + return stringFrom(ninstrument + 1) + ". " + getname(ninstrument); } /* @@ -108,43 +100,28 @@ void Bank::setname(unsigned int ninstrument, string newname, int newslot) if(tmpfilename[i] == ' ') tmpfilename[i] = '0'; - //make the filenames legal - for(int i = 0; i < (int) strlen(tmpfilename); i++) { - char c = tmpfilename[i]; - if((c >= '0') && (c <= '9')) - continue; - if((c >= 'A') && (c <= 'Z')) - continue; - if((c >= 'a') && (c <= 'z')) - continue; - if((c == '-') || (c == ' ')) - continue; - - tmpfilename[i] = '_'; - } - - newfilename = dirname + '/' + tmpfilename + ".xiz"; + newfilename = dirname + '/' + legalizeFilename(tmpfilename) + ".xiz"; rename(ins[ninstrument].filename.c_str(), newfilename.c_str()); ins[ninstrument].filename = newfilename; - ins[ninstrument].name = tmpfilename; //TODO limit name to PART_MAX_NAME_LEN + ins[ninstrument].name = legalizeFilename(tmpfilename); //TODO limit name to PART_MAX_NAME_LEN } /* * Check if there is no instrument on a slot from the bank */ -int Bank::emptyslot(unsigned int ninstrument) +bool Bank::emptyslot(unsigned int ninstrument) { if(ninstrument >= BANK_SIZE) - return 1; + return true; if(ins[ninstrument].filename.empty()) - return 1; + return true; if(ins[ninstrument].used) - return 0; + return false; else - return 1; + return true; } /* @@ -181,28 +158,11 @@ void Bank::savetoslot(unsigned int ninstrument, Part *part) if(tmpfilename[i] == ' ') tmpfilename[i] = '0'; - //make the filenames legal - for(int i = 0; i < (int)strlen(tmpfilename); i++) { - char c = tmpfilename[i]; - if((c >= '0') && (c <= '9')) - continue; - if((c >= 'A') && (c <= 'Z')) - continue; - if((c >= 'a') && (c <= 'z')) - continue; - if((c == '-') || (c == ' ')) - continue; - - tmpfilename[i] = '_'; - } - - strncat(tmpfilename, ".xiz", maxfilename + 10); - - string filename = dirname + '/' + tmpfilename; + string filename = dirname + '/' + legalizeFilename(tmpfilename) + ".xiz"; remove(filename.c_str()); part->saveXML(filename.c_str()); - addtobank(ninstrument, tmpfilename, (char *) part->Pname); + addtobank(ninstrument, legalizeFilename(tmpfilename), (char *) part->Pname); } /* @@ -218,7 +178,6 @@ void Bank::loadfromslot(unsigned int ninstrument, Part *part) part->loadXMLinstrument(ins[ninstrument].filename.c_str()); } - /* * Makes current a bank directory */ @@ -239,7 +198,7 @@ int Bank::loadbank(string bankdirname) while((fn = readdir(dir))) { const char *filename = fn->d_name; - //sa verific daca e si extensia dorita + //check for extension if(strstr(filename, INSTRUMENT_EXTENSION) == NULL) continue; @@ -257,9 +216,8 @@ int Bank::loadbank(string bankdirname) } } - if((startname + 1) < strlen(filename)) - startname++; //to take out the "-" + startname++; //to take out the "-" string name = filename; @@ -277,7 +235,6 @@ int Bank::loadbank(string bankdirname) addtobank(-1, filename, name); } - closedir(dir); if(!dirname.empty()) @@ -331,24 +288,17 @@ int Bank::locked() */ void Bank::swapslot(unsigned int n1, unsigned int n2) { - //TODO use std::swap if((n1 == n2) || (locked())) return; if(emptyslot(n1) && (emptyslot(n2))) return; - if(emptyslot(n1)) { //change n1 to n2 in order to make - int tmp = n2; - n2 = n1; - n1 = tmp; - } + if(emptyslot(n1)) //change n1 to n2 in order to make + swap(n1, n2); if(emptyslot(n2)) { //this is just a movement from slot1 to slot2 setname(n1, getname(n1), n2); ins[n2] = ins[n1]; - ins[n1].used = false; - ins[n1].name.clear(); - ins[n1].filename.clear(); - ins[n1].info.PADsynth_used = 0; + ins[n1] = ins_t(); } else { //if both slots are used if(ins[n1].name == ins[n2].name) //change the name of the second instrument if the name are equal @@ -356,16 +306,7 @@ void Bank::swapslot(unsigned int n1, unsigned int n2) setname(n1, getname(n1), n2); setname(n2, getname(n2), n1); - ins_t tmp; - tmp.used = true; - tmp.name = ins[n2].name; - string tmpfilename = ins[n2].filename; - bool padsynth_used = ins[n2].info.PADsynth_used; - - ins[n2] = ins[n1]; - ins[n1].name = tmp.name; - ins[n1].filename = tmpfilename; - ins[n1].info.PADsynth_used = padsynth_used; + swap(ins[n2],ins[n1]); } } @@ -381,10 +322,8 @@ bool Bank::bankstruct::operator<(const bankstruct &b) const void Bank::rescanforbanks() { - for(int i = 0; i < MAX_NUM_BANKS; i++) { - banks[i].dir.clear(); - banks[i].name.clear(); - } + //remove old banks + banks.clear(); for(int i = 0; i < MAX_BANK_ROOT_DIRS; i++) if(!config.cfg.bankRootDirList[i].empty()) @@ -395,18 +334,13 @@ void Bank::rescanforbanks() //remove duplicate bank names int dupl = 0; - for(int j = 0; j < banks.size() - 1; j++) { - for(int i = j + 1; i < banks.size(); i++) { - if(banks[i].name.empty() || banks[j].name.empty()) - continue; - if(banks[i].name == banks[j].name) { //add a [1] to the first bankname and [n] to others - char *tmpname = new char[strlen(tmpname) + 100]; - sprintf(tmpname, "%s[%d]", tmpname, dupl + 2); - banks[i].name = tmpname; - delete[] tmpname; - + for(unsigned int j = 0; j < banks.size() - 1; j++) { + for(unsigned int i = j + 1; i < banks.size(); i++) { + if(banks[i].name == banks[j].name) { + //add a [1] to the first bankname and [n] to others + banks[i].name = banks[i].name + '[' + stringFrom(dupl +2) + ']'; if(dupl == 0) - banks[i].name += "[1]"; + banks[j].name += "[1]"; dupl++; } @@ -417,7 +351,6 @@ void Bank::rescanforbanks() } - // private stuff void Bank::scanrootdir(string rootdir) @@ -426,7 +359,6 @@ void Bank::scanrootdir(string rootdir) if(dir == NULL) return; - const int maxdirsize = 1000; bankstruct bank; const char *separator = "/"; @@ -457,26 +389,14 @@ void Bank::scanrootdir(string rootdir) if((strstr(fname->d_name, INSTRUMENT_EXTENSION) != NULL) || (strstr(fname->d_name, FORCE_BANK_DIR_FILE) != NULL)) { isbank = true; - break; //aici as putea pune in loc de break un update la un counter care imi arata nr. de instrumente din bank + break; //could put a #instrument counter here instead } } - closedir(d); - - if(isbank) { - int pos = -1; - for(int i = 1; i < MAX_NUM_BANKS; i++) { //banks[0] e liber intotdeauna - if(banks[i].name.empty()) { - pos = i; - break; - } - } + if(isbank) + banks.push_back(bank); - if(pos >= 0) { - banks[pos].name = bank.name; - banks[pos].dir = bank.dir; - } - } + closedir(d); } closedir(dir); @@ -484,7 +404,8 @@ void Bank::scanrootdir(string rootdir) void Bank::clearbank() { - banks.clear(); + for(int i = 0; i < BANK_SIZE; ++i) + ins[i] = ins_t(); bankfiletitle.clear(); dirname.clear(); @@ -494,34 +415,29 @@ int Bank::addtobank(int pos, string filename, string name) { if((pos >= 0) && (pos < BANK_SIZE)) { if(ins[pos].used) - pos = -1; //force it to find a new free position + pos = -1; //force it to find a new free position } else - if(pos >= BANK_SIZE) - pos = -1; + if(pos >= BANK_SIZE) + pos = -1; if(pos < 0) { //find a free position - for(int i = BANK_SIZE - 1; i >= 0; i--) + for(int i = BANK_SIZE - 1; i >= 0; i--) { if(!ins[i].used) { pos = i; break; } - ; + } } if(pos < 0) - return -1; //the bank is full - - // printf("%s %d\n",filename,pos); + return -1;//the bank is full deletefrombank(pos); ins[pos].used = true; ins[pos].name = name; - - snprintf(tmpinsname[pos], PART_MAX_NAME_LEN + 10, " "); - ins[pos].filename = dirname + '/' + filename; //see if PADsynth is used @@ -548,12 +464,14 @@ bool Bank::isPADsynth_used(unsigned int ninstrument) void Bank::deletefrombank(int pos) { - if((pos < 0) || (pos >= banks.size())) + if((pos < 0) || (pos >= (int) banks.size())) return; - ins[pos].used = false; - ins[pos].name.clear(); - ins[pos].filename.clear(); + ins[pos] = ins_t(); +} - ZERO(tmpinsname[pos], PART_MAX_NAME_LEN + 20); +Bank::ins_t::ins_t() + :used(false), name(""), filename("") +{ + info.PADsynth_used = false; } diff --git a/src/Misc/Bank.h b/src/Misc/Bank.h @@ -30,13 +30,9 @@ #include "XMLwrapper.h" #include "Part.h" +//entries in a bank #define BANK_SIZE 160 -/** - * The max. number of banks that are used - */ -#define MAX_NUM_BANKS 400 - /**The instrument Bank*/ class Bank { @@ -49,9 +45,8 @@ class Bank void setname(unsigned int ninstrument, const std::string newname, int newslot); //if newslot==-1 then this is ignored, else it will be put on that slot bool isPADsynth_used(unsigned int ninstrument); - /**returns 0 if the slot is not empty or 1 if the slot is empty - * \todo start using bool before facepalm*/ - int emptyslot(unsigned int ninstrument); + /**returns true when slot is empty*/ + bool emptyslot(unsigned int ninstrument); /**Empties out the selected slot*/ void clearslot(unsigned int ninstrument); @@ -91,9 +86,9 @@ class Bank void clearbank(); std::string defaultinsname; - char tmpinsname[BANK_SIZE][PART_MAX_NAME_LEN + 20]; //this keeps the numbered names struct ins_t { + ins_t(); bool used; std::string name; std::string filename; diff --git a/src/Misc/Util.cpp b/src/Misc/Util.cpp @@ -142,4 +142,14 @@ void os_sleep(long length) Sleep((long)length/1000); #endif } - + +std::string legalizeFilename(std::string filename) +{ + for(int i = 0; i < (int) filename.size(); i++) { + char c = filename[i]; + if(!(isdigit(c) || isalpha(c) || (c == '-') || (c == ' '))) + filename[i] = '_'; + } + return filename; +} + diff --git a/src/Misc/Util.h b/src/Misc/Util.h @@ -47,6 +47,8 @@ void set_realtime(); /**Os independent sleep in microsecond*/ void os_sleep(long length); +std::string legalizeFilename(std::string filename); + extern REALTYPE *denormalkillbuf; /**<the buffer to add noise in order to avoid denormalisation*/ extern Config config; diff --git a/src/Params/PresetsStore.cpp b/src/Params/PresetsStore.cpp @@ -144,11 +144,7 @@ void PresetsStore::copypreset(XMLwrapper *xml, char *type, string name) return; //make the filenames legal - for(int i = 0; i < (int) name.size(); i++) { - char c = name[i]; - if(!(isdigit(c) || isalpha(c) || (c == '-') || (c == ' '))) - name[i] = '_'; - } + name = legalizeFilename(name); //make path legal const string dirname = config.cfg.presetsDirList[0]; diff --git a/src/UI/BankUI.fl b/src/UI/BankUI.fl @@ -76,17 +76,20 @@ highlight=0; refresh();} {} } Function {refresh()} {} { - code {if (bank->emptyslot(nslot)) { - color(46); -} else { - if (bank->isPADsynth_used(nslot)) color(26); - else color(51); -}; + code {if (bank->emptyslot(nslot)) + color(46); +else if (bank->isPADsynth_used(nslot)) + color(26); +else + color(51); + -if (*nselected==nslot) color(6); +if (*nselected==nslot) + color(6); -label(bank->getnamenumbered(nslot).c_str());} {} +copy_label(bank->getnamenumbered(nslot).c_str());} {selected + } } decl {int *what,*whatslot,nslot,highlight, *nselected;} {} decl {void (BankProcess_:: *fnc)(void);} {} @@ -318,8 +321,8 @@ if (bank->locked()){ clearbutton->activate(); swapbutton->activate(); }; -for (int i=0;i<BANK_SIZE;i++) bs[i]->refresh();} {selected - } +for (int i=0;i<BANK_SIZE;i++) + bs[i]->refresh();} {} } Function {removeselection()} {} { code {if (nselected>=0) { @@ -333,8 +336,7 @@ for (int i=0;i<BANK_SIZE;i++) bs[i]->refresh();} {selected banklist->add(" "); bank->rescanforbanks(); -for (int i=1;i<MAX_NUM_BANKS;i++) { - if (!bank->banks[i].name.empty()) +for (unsigned int i=1;i<bank->banks.size();i++) { banklist->add(bank->banks[i].name.c_str()); };} {} }