commit e29d503df7df55deb8d601db51a05d9249a5f9fa
parent 6634e39ecf07190434709db24aa83ed8761357d0
Author: fundamental <mark.d.mccurry@gmail.com>
Date: Thu, 4 Apr 2013 09:51:30 -0400
WIP
Diffstat:
6 files changed, 135 insertions(+), 53 deletions(-)
diff --git a/src/Misc/Bank.h b/src/Misc/Bank.h
@@ -38,9 +38,10 @@ class Bank
~Bank();
std::string getname(unsigned int ninstrument);
std::string getnamenumbered(unsigned int ninstrument);
+ //if newslot==-1 then this is ignored, else it will be put on that slot
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
+ int newslot);
bool isPADsynth_used(unsigned int ninstrument);
/**returns true when slot is empty*/
@@ -85,6 +86,7 @@ class Bank
std::string defaultinsname;
+ public:
struct ins_t {
ins_t();
bool used;
@@ -94,6 +96,7 @@ class Bank
bool PADsynth_used;
} info;
} ins[BANK_SIZE];
+ private:
std::string dirname;
diff --git a/src/Misc/Master.cpp b/src/Misc/Master.cpp
@@ -53,6 +53,11 @@ static Ports localports = {
{"reset-vu", "::", 0, [](const char *, RtData d) {
Master *m = (Master*)d.obj;
m->vuresetpeaks();}},
+ {"load-part:ib", "::", 0, [](const char *msg, RtData d) {
+ Master *m = (Master*)d.obj;
+ m->part[rtosc_argument(msg, 0).i] = *(Part**)rtosc_argument(msg, 1).b.data;
+ printf("part %d is now pointer %p\n", rtosc_argument(msg, 0).i, *(Part**)rtosc_argument(msg, 1).b.data);}},
+
PARAMF(Master, volume, volume, log, 0.01, 4.42, "Master Volume"),
RECURSP(Master, Part, part, part, 16, "Part"),//NUM_MIDI_PARTS
};
@@ -355,7 +360,7 @@ void Master::AudioOut(float *outl, float *outr)
while(uToB->hasNext()) {
ports.dispatch(uToB->read()+1, d);
events++;
- //printf("backend: '%s'\n", uToB->peak());
+ //fprintf(stderr, "backend: '%s'<%s>\n", uToB->peak(), rtosc_argument_string(uToB->peak()));
}
if(events>1)
fprintf(stderr, "backend: %d events per cycle\n",events);
diff --git a/src/Misc/Master.h b/src/Misc/Master.h
@@ -154,7 +154,9 @@ class Master
//other objects
Microtonal microtonal;
- Bank bank;
+
+ //Strictly Non-RT instrument bank object
+ Bank bank;
class FFTwrapper * fft;
pthread_mutex_t mutex;
diff --git a/src/Misc/MiddleWare.cpp b/src/Misc/MiddleWare.cpp
@@ -143,6 +143,7 @@ void osc_check(cb_t cb, void *ui)
}
+
void preparePadSynth(string path, PADnoteParameters *p)
{
printf("preparing padsynth parameters\n");
@@ -337,6 +338,36 @@ struct MiddleWareImpl
delete osc;
}
+ void loadPart(const char *msg, Master *master)
+ {
+ fprintf(stderr, "loading a part!!\n");
+ //Load the part
+ Part *p = new Part(&master->microtonal, master->fft, &master->mutex);
+ unsigned npart = rtosc_argument(msg, 0).i;
+ p->loadXMLinstrument(rtosc_argument(msg, 1).s);
+ p->applyparameters();
+
+ //Update the resource locators
+ string base = "/part"+to_s(npart)+"/kit";
+ for(int j=0; j < NUM_KIT_ITEMS; ++j) {
+ objmap[base+to_s(j)+"/padpars/"] =
+ p->kit[j].padpars;
+ objmap[base+to_s(j)+"/padpars/oscil/"] =
+ p->kit[j].padpars->oscilgen;
+ for(int k=0; k<NUM_VOICES; ++k) {
+ objmap[base+to_s(j)+"/adpars/voice"+to_s(k)+"/oscil/"] =
+ p->kit[j].adpars->VoicePar[k].OscilSmp;
+ objmap[base+to_s(j)+"/adpars/voice"+to_s(k)+"/oscil-mod/"] =
+ p->kit[j].adpars->VoicePar[k].FMSmp;
+ }
+ }
+
+ //Give it to the backend and wait for the old part to return for
+ //deallocation
+ //printf("writing something to the location called '%s'\n", msg);
+ uToB->write("/load-part", "ib", npart, sizeof(Part*), &p);
+ }
+
void tick(void)
{
osc_check(cb, ui);
@@ -366,31 +397,37 @@ struct MiddleWareImpl
if(!last_path)
return;
+ //printf("watching '%s' go by\n", msg);
//Get the object resource locator
string obj_rl(msg, last_path+1);
- if(objmap.find(obj_rl) == objmap.end()) {
- uToB->raw_write(msg);
- return;
- }
-
-
- //try some over simplified pattern matching
- if(strstr(msg, "oscil/"))
- handleOscil(obj_rl, last_path+1, objmap[obj_rl]);
- //else if(strstr(obj_rl.c_str(), "kititem"))
- // handleKitItem(obj_rl, objmap[obj_rl],atoi(rindex(msg,'m')+1),rtosc_argument(msg,0).T);
- else if(strstr(msg, "padpars/prepare"))
- preparePadSynth(obj_rl,(PADnoteParameters *) objmap[obj_rl]);
- else {//just forward the message
+ if(objmap.find(obj_rl) != objmap.end()) {
+ //try some over simplified pattern matching
+ if(strstr(msg, "oscil/"))
+ handleOscil(obj_rl, last_path+1, objmap[obj_rl]);
+ //else if(strstr(obj_rl.c_str(), "kititem"))
+ // handleKitItem(obj_rl, objmap[obj_rl],atoi(rindex(msg,'m')+1),rtosc_argument(msg,0).T);
+ else if(strstr(msg, "padpars/prepare"))
+ preparePadSynth(obj_rl,(PADnoteParameters *) objmap[obj_rl]);
+ else //just forward the message
+ uToB->raw_write(msg);
+ } else if(strstr(msg, "load-part"))
+ loadPart(msg, master);
+ else
uToB->raw_write(msg);
- }
}
+
void write(const char *path, const char *args, ...)
{
//We have a free buffer in the threadlink, so use it
va_list va;
va_start(va, args);
+ write(path, args, va);
+ }
+
+ void write(const char *path, const char *args, va_list va)
+ {
+ //printf("is that a '%s' I see there?\n", path);
char *buffer = uToB->buffer();
unsigned len = uToB->buffer_size();
bool success = rtosc_vmessage(buffer, len, path, args, va);
@@ -449,6 +486,19 @@ class UI_Interface:public Fl_Osc_Interface
impl->write(s.c_str(),"");
}
+
+ void write(string s, const char *args, ...) override
+ {
+ va_list va;
+ va_start(va, args);
+ impl->write(s.c_str(), args, va);
+ }
+
+ void writeValue(string s, string ss) override
+ {
+ Fl_Osc_Interface::writeValue(s,ss);
+ impl->write(s.c_str(), "s", ss.c_str());
+ }
void writeValue(string s, char c) override
{
diff --git a/src/UI/BankUI.fl b/src/UI/BankUI.fl
@@ -1,39 +1,44 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0110
+version 1.0300
header_name {.h}
code_name {.cc}
-decl {//Copyright (c) 2002-2005 Nasca Octavian Paul} {}
+decl {//Copyright (c) 2002-2005 Nasca Octavian Paul} {private local
+}
+
+decl {//License: GNU GPL version 2 or later} {private local
+}
-decl {//License: GNU GPL version 2 or later} {}
+decl {\#include <stdlib.h>} {public local
+}
-decl {\#include <stdlib.h>} {public
+decl {\#include <stdio.h>} {public local
}
-decl {\#include <stdio.h>} {public
+decl {\#include <string.h>} {public local
}
-decl {\#include <string.h>} {public
+decl {\#include <FL/Fl_Button.H>} {public local
}
-decl {\#include <FL/Fl_Button.H>} {public
+decl {\#include <FL/Fl_File_Chooser.H>} {public local
}
-decl {\#include <FL/Fl_File_Chooser.H>} {public
+decl {\#include "Fl_Osc_Interface.h"} {public local
}
-decl {\#include "../Misc/Master.h"} {public
+decl {\#include "../Misc/Master.h"} {public local
}
-decl {\#include "../Misc/Part.h"} {public
+decl {\#include "../Misc/Part.h"} {public local
}
-decl {\#include "../Misc/Bank.h"} {public
+decl {\#include "../Misc/Bank.h"} {public local
}
-decl {\#include "../Misc/Config.h"} {public
+decl {\#include "../Misc/Config.h"} {public local
}
-decl {\#include "../Misc/Util.h"} {public
+decl {\#include "../Misc/Util.h"} {public local
}
class BankProcess_ {} {
@@ -41,7 +46,7 @@ class BankProcess_ {} {
} {
code {;} {}
}
- decl {Bank *bank;} {public
+ decl {Bank *bank;} {public local
}
}
@@ -52,10 +57,9 @@ class BankSlot {open : {public Fl_Button,BankProcess_}
code {what=NULL;
whatslot=NULL;
nslot=0;
-nselected=NULL;} {selected
- }
+nselected=NULL;} {}
}
- Function {handle(int event)} {return_type int
+ Function {handle(int event)} {open return_type int
} {
code {if (what==NULL) return(0);
if (Fl::event_inside(this)){
@@ -100,9 +104,12 @@ if (*nselected==nslot)
copy_label(bank->getnamenumbered(nslot).c_str());} {}
}
- decl {int *what,*whatslot,nslot,highlight, *nselected;} {}
- decl {void (BankProcess_:: *fnc)(void);} {}
- decl {BankProcess_ *bp;} {}
+ decl {int *what,*whatslot,nslot,highlight, *nselected;} {private local
+ }
+ decl {void (BankProcess_:: *fnc)(void);} {private local
+ }
+ decl {BankProcess_ *bp;} {private local
+ }
}
class BankUI {open : {public BankProcess_}
@@ -228,10 +235,11 @@ refreshmainwindow();}
}
}
}
- Function {BankUI(Master *master_,int *npart_)} {} {
+ Function {BankUI(Master *master_,int *npart_, Fl_Osc_Interface *osc_)} {} {
code {fnc=&BankProcess_::process;
master=master_;
npart=npart_;
+osc =osc_;
bank=&master_->bank;
what=0;
nselected=-1;
@@ -254,7 +262,7 @@ simplesetmode(config.cfg.UserInterfaceMode==2);} {}
code {cbwig=cbwig_;
rescan_for_banks();} {}
}
- Function {process()} {return_type void
+ Function {process()} {open return_type void
} {
code {int slot=this->slot;
@@ -265,11 +273,17 @@ if ((what==2)&&(bank->emptyslot(slot)==0)&&(mode!=4)) {//Rename slot
};
if ((what==1)&&(mode==1)&&(!bank->emptyslot(slot))){//Reads from slot
- pthread_mutex_lock(&master->part[*npart]->load_mutex);
- bank->loadfromslot(slot,master->part[*npart]);
- pthread_mutex_unlock(&master->part[*npart]->load_mutex);
- master->part[*npart]->applyparameters();
- snprintf((char *)master->part[*npart]->Pname,PART_MAX_NAME_LEN,"%s",bank->getname(slot).c_str());
+ //pthread_mutex_lock(&master->part[*npart]->load_mutex);
+ // bank->loadfromslot(slot,master->part[*npart]);
+ //pthread_mutex_unlock(&master->part[*npart]->load_mutex);
+ //master->part[*npart]->applyparameters();
+ //snprintf((char *)master->part[*npart]->Pname,PART_MAX_NAME_LEN,"%s",bank->getname(slot).c_str());
+ printf("throwing load to middleware\\n");
+ printf("osc is '%p'\\n", osc);
+ osc->write("/load-part", "is", *npart, bank->ins[slot].filename.c_str());
+ printf("something should be showing up...\\n");
+ osc->writeValue("/part"+to_s(*npart)+"/name", bank->getname(slot));
+ printf("fake load of part '%d' with name '%s' from slot '%d'\\n", *npart, bank->getname(slot).c_str(), slot);
cbwig->do_callback();
if (config.cfg.BankUIAutoClose!=0)
@@ -316,7 +330,8 @@ if (mode==4){//swap
bs[slot]->refresh();
};
};
-if (mode!=4) refreshmainwindow();} {}
+if (mode!=4) refreshmainwindow();} {selected
+ }
}
Function {refreshmainwindow()} {} {
code {bankuiwindow->label(bank->bankfiletitle.c_str());
@@ -358,11 +373,18 @@ removeselection();
if (beginnerui) modeselect->hide();
else modeselect->show();} {}
}
- decl {BankSlot *bs[BANK_SIZE];} {}
- decl {int slot,what;//"what"=what button is pressed} {}
- decl {int mode,*npart,nselected;} {}
- decl {Master *master;} {}
- decl {void (BankProcess_::* fnc)(void);} {}
- decl {Fl_Valuator *cbwig;} {public
+ decl {BankSlot *bs[BANK_SIZE];} {private local
+ }
+ decl {int slot,what;//"what"=what button is pressed} {private local
+ }
+ decl {int mode,*npart,nselected;} {private local
+ }
+ decl {Master *master;} {private local
+ }
+ decl {void (BankProcess_::* fnc)(void);} {private local
+ }
+ decl {Fl_Osc_Interface *osc;} {private local
+ }
+ decl {Fl_Valuator *cbwig;} {public local
}
}
diff --git a/src/UI/MasterUI.fl b/src/UI/MasterUI.fl
@@ -1505,7 +1505,7 @@ for (int i=0;i<NUM_SYS_EFX;i++)
microtonalui=new MicrotonalUI(&master->microtonal);
virkeyboard=new VirKeyboard(master);
-bankui=new BankUI(master,&npart);
+bankui=new BankUI(master, &npart, osc);
configui=new ConfigUI();
make_window();