zynaddsubfx

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

commit e29d503df7df55deb8d601db51a05d9249a5f9fa
parent 6634e39ecf07190434709db24aa83ed8761357d0
Author: fundamental <mark.d.mccurry@gmail.com>
Date:   Thu,  4 Apr 2013 09:51:30 -0400

WIP

Diffstat:
Msrc/Misc/Bank.h | 5++++-
Msrc/Misc/Master.cpp | 7++++++-
Msrc/Misc/Master.h | 4+++-
Msrc/Misc/MiddleWare.cpp | 80++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
Msrc/UI/BankUI.fl | 90+++++++++++++++++++++++++++++++++++++++++++++++++------------------------------
Msrc/UI/MasterUI.fl | 2+-
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();