zynaddsubfx

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

commit ab38a0a9bef662362b2bf2c7eea4f882699fd9ee
parent e88a3f74cf27a981c0127d422e1e9fef492f5e27
Author: paulnasca <paulnasca>
Date:   Sat, 27 Mar 2004 21:23:49 +0000

*** empty log message ***

Diffstat:
MChangeLog | 5++++-
Msrc/Makefile | 2+-
Msrc/Misc/Master.C | 26++++++++++++++++++--------
Msrc/Seq/MIDIFile.C | 22+++++++++++++---------
Msrc/Seq/Sequencer.C | 35++++++++++++++++++-----------------
Msrc/Seq/Sequencer.h | 6+++---
Msrc/main.C | 34+++++++++++++++++++++++++++++++---
7 files changed, 88 insertions(+), 42 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -561,6 +561,9 @@ 15 Mar 2004 - Inceput sa scriu partea de incarcare MIDI - Inlaturata partea de recording din Sequencer 16 Mar 2004 - Inceput sa scriu partea de analiza midi -25 Mar 2004 - Continuat partea de analiza midi +25 Mar 2004 - Continuat partea de analiza midi +28 Mar 2004 - Scris partea de incarcat fisier midi + - Merge partial playerul + diff --git a/src/Makefile b/src/Makefile @@ -50,9 +50,9 @@ objects=main.o subdirs=DSP Effects Input Misc Output Params Synth Seq all: + yes " " | head $(MAKE) -C UI $@ rm -f Make.deps - yes " " | head @for name in $(subdirs); do sh -c "cd $$name ; $(CXX) -MM -MG -w *.C >> ../Make.deps ; cd .."; done @for name in $(subdirs); do sh -c "make -C $$name $@"; done $(MAKE) objs diff --git a/src/Misc/Master.C b/src/Misc/Master.C @@ -218,18 +218,28 @@ void Master::partonoff(int npart,int what){ void Master::AudioOut(REALTYPE *outl,REALTYPE *outr){ int i,npart,nefx; - //test!!!!!!!!!!!!! se poate bloca aici (mutex) - while (1){ +/* //test!!!!!!!!!!!!! se poate bloca aici (mutex) + if (seq.play){ int type,par1,par2,again,midichan; - char chan=1;//deocamdata - again=seq.getevent(chan,&midichan,&type,&par1,&par2); - if (type!=0) printf("%d %d %d %d %d\n",type,midichan,chan,par1,par2); + int ntrack=1; +// do{ + again=seq.getevent(ntrack,&midichan,&type,&par1,&par2); + if (type>0) { +// printf("aaa\n"); - if (again<=0) break; + if (type==1){//note_on or note_off + if (par2!=0) NoteOn(midichan,par1,par2); + else NoteOff(midichan,par1); + }; + }; +// } while (again); }; - //test end +*/ + + +// printf("zzzz\n"); + - //Swaps the Left channel with Right Channel (if it is asked for) if (swaplr!=0){ REALTYPE *tmp=outl; diff --git a/src/Seq/MIDIFile.C b/src/Seq/MIDIFile.C @@ -131,8 +131,10 @@ int MIDIFile::parsetrack(int ntrack){ while(!midieof){ unsigned int msgdeltatime=getvarint32(); - dt+=msgdeltatime; + printf("MSGDELTATIME = %d\n",msgdeltatime); + dt+=msgdeltatime; + int msg=peekbyte(); printf("raw msg=0x%x ",msg); if (msg<0x80) { @@ -147,7 +149,7 @@ int MIDIFile::parsetrack(int ntrack){ switch(msg){ case 0x80 ... 0x8f://note on off - parsenoteon(ntrack,msg & 0x0f,dt); + parsenoteoff(ntrack,msg & 0x0f,dt); dt=0; break; case 0x90 ... 0x9f://note on (or note off) @@ -194,8 +196,6 @@ int MIDIFile::parsetrack(int ntrack){ if (midieof) return(-1); - dt=msgdeltatime; - if ((midifilek-oldmidifilek)==size) break; else if((midifilek-oldmidifilek)>size) return(-1); // if (size!=6) return(-1);//header is always 6 bytes long @@ -208,7 +208,7 @@ int MIDIFile::parsetrack(int ntrack){ void MIDIFile::parsenoteoff(char ntrack,char chan,unsigned int dt){ - unsigned char note,vel; + unsigned char note; note=getbyte(); if (chan>=NUM_MIDI_CHANNELS) return; @@ -217,6 +217,7 @@ void MIDIFile::parsenoteoff(char ntrack,char chan,unsigned int dt){ me->tmpevent.type=1; me->tmpevent.par1=note; me->tmpevent.par2=0; + me->tmpevent.channel=chan; ///test @@ -227,6 +228,7 @@ void MIDIFile::parsenoteoff(char ntrack,char chan,unsigned int dt){ printf("Note off:%d ",note); }; + void MIDIFile::parsenoteon(char ntrack,char chan,unsigned int dt){ unsigned char note,vel; note=getbyte(); @@ -238,9 +240,12 @@ void MIDIFile::parsenoteon(char ntrack,char chan,unsigned int dt){ me->tmpevent.type=1; me->tmpevent.par1=note; me->tmpevent.par2=vel; + me->tmpevent.channel=chan; me->writeevent(&me->miditrack[ntrack].record,&me->tmpevent); printf("[dt %d ] Note on:%d %d\n",dt,note,vel); + + }; void MIDIFile::parsecontrolchange(char ntrack,char chan,unsigned int dt){ @@ -256,6 +261,7 @@ void MIDIFile::parsecontrolchange(char ntrack,char chan,unsigned int dt){ me->tmpevent.type=2; me->tmpevent.par1=control;//???????????? ma uit la Sequencer::recordnote() din varianele vechi de zyn me->tmpevent.par2=value; + me->tmpevent.channel=chan; me->writeevent(&me->miditrack[ntrack].record,&me->tmpevent); }; @@ -285,8 +291,8 @@ void MIDIFile::parsemetaevent(unsigned char mtype,unsigned char mlength){ unsigned int MIDIFile::convertdt(unsigned int dt){ double result=dt; - - return((int) (result*3.0)); + + return((int) (result*30.0)); }; @@ -296,9 +302,7 @@ void MIDIFile::clearmidifile(){ midifilesize=0; midifilek=0; midieof=false; - data.tick=0.05; - }; unsigned char MIDIFile::getbyte(){ diff --git a/src/Seq/Sequencer.C b/src/Seq/Sequencer.C @@ -42,11 +42,11 @@ Sequencer::Sequencer(){ miditrack[i].record.current=NULL; miditrack[i].record.size=0; miditrack[i].record.length=0.0; + + nextevent[i].time=0.0; + resettime(&playtime[i]); }; - resettime(&rectime); - resettime(&playtime); - nextevent.time=0.0;//must be less than 0 }; Sequencer::~Sequencer(){ @@ -79,9 +79,8 @@ int Sequencer::importmidifile(char *filename){ void Sequencer::startplay(){ if (play!=0) return; play=1; - resettime(&playtime); + for (int i=0;i<NUM_MIDI_TRACKS;i++) resettime(&playtime[i]); - //test - canalul 1, deocamdata for (int i=0;i<NUM_MIDI_TRACKS;i++){ rewindlist(&miditrack[i].track); }; @@ -94,30 +93,32 @@ void Sequencer::stopplay(){ // ************ Player stuff *************** -int Sequencer::getevent(char chan,int *midich, int *type,int *par1, int *par2){ +int Sequencer::getevent(char ntrack,int *midich, int *type,int *par1, int *par2){ *type=0; if (play==0) return(-1); - updatecounter(&playtime); + updatecounter(&playtime[ntrack]); -// printf("%g %g\n",nextevent.time,playtime.abs); +// printf("%g %g\n",nextevent[ntrack].time,playtime[ntrack].abs); - if (nextevent.time<playtime.abs) readevent(&miditrack[chan].track,&nextevent.ev); + if (nextevent[ntrack].time<playtime[ntrack].abs) readevent(&miditrack[ntrack].track,&nextevent[ntrack].ev); else return(-1); - if (nextevent.ev.type==-1) return(-1); + if (nextevent[ntrack].ev.type==-1) return(-1); // printf("********************************\n"); + if (ntrack==1) printf("_ %.2f %.2f\n",nextevent[ntrack].time/0.32*80.0,playtime[ntrack].abs/0.32*80.0); + + *type=nextevent[ntrack].ev.type; + *par1=nextevent[ntrack].ev.par1; + *par2=nextevent[ntrack].ev.par2; + *midich=nextevent[ntrack].ev.channel; - *type=nextevent.ev.type; - *par1=nextevent.ev.par1; - *par2=nextevent.ev.par2; - *midich=nextevent.ev.channel; - double dt=nextevent.ev.deltatime*0.001; - nextevent.time+=dt; + double dt=nextevent[ntrack].ev.deltatime*0.0001; + nextevent[ntrack].time+=dt; -// printf("%f - %d %d \n",nextevent.time,par1,par2); +// printf("%f - %d %d \n",nextevent[ntrack].time,par1,par2); return(0);//?? sau 1 }; diff --git a/src/Seq/Sequencer.h b/src/Seq/Sequencer.h @@ -39,7 +39,7 @@ class Sequencer:public MIDIEvents{ //it returns 1 if this must be called at least once more //it returns 0 if there are no more notes for the current time //or -1 if there is no note - int getevent(char chan, int *midich,int *type,int *par1, int *par2); + int getevent(char ntrack, int *midich,int *type,int *par1, int *par2); //returns 0 if ok or -1 if there is a error loading file int importmidifile(char *filename); @@ -61,7 +61,7 @@ class Sequencer:public MIDIEvents{ double last;//the time of the last event (absolute, since 1 Jan 1970) //theese must be double, because the float's precision is too low //and all theese represents the time in seconds - } rectime,playtime; + } playtime[NUM_MIDI_TRACKS]; void resettime(timestruct *t); void updatecounter(timestruct *t);//this updates the timer values @@ -71,7 +71,7 @@ class Sequencer:public MIDIEvents{ struct { event ev; double time; - } nextevent; + } nextevent[NUM_MIDI_TRACKS]; }; #endif diff --git a/src/main.C b/src/main.C @@ -177,9 +177,36 @@ void *thread3(void *arg){ */ void *thread4(void *arg){ while (Pexitprogram==0){ - pthread_mutex_lock(&master->mutex); -//????????????????????????????????????????????? - pthread_mutex_unlock(&master->mutex); + int type,par1,par2,again,midichan; + for (int ntrack=0;ntrack<NUM_MIDI_TRACKS;ntrack++){ + if (master->seq.play==0) break; + do{ + again=master->seq.getevent(ntrack,&midichan,&type,&par1,&par2); +// printf("ntrack=%d again=%d\n",ntrack,again); + if (type>0) { +// printf("%d %d %d %d %d\n",type,midichan,chan,par1,par2); + +// if (cmdtype==MidiController) master->SetController(cmdchan,cmdparams[0],cmdparams[1]); + + + + pthread_mutex_lock(&master->mutex); + if (type==1){//note_on or note_off + if (par2!=0) master->NoteOn(midichan,par1,par2); + else master->NoteOff(midichan,par1); + }; + pthread_mutex_unlock(&master->mutex); + }; + } while (again>0); + + }; +//if (!realtime player) atunci fac asta +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +#ifdef OS_LINUX + usleep(1000); +#elif OS_WINDOWS + Sleep(1); +#endif }; return(0); @@ -421,6 +448,7 @@ int main(int argc, char *argv[]){ */ if (noui==0) pthread_create(&thr3,NULL,thread3,NULL); + pthread_create(&thr4,NULL,thread4,NULL); #ifdef WINMIDIIN InitWinMidi(master); #endif