commit ab38a0a9bef662362b2bf2c7eea4f882699fd9ee
parent e88a3f74cf27a981c0127d422e1e9fef492f5e27
Author: paulnasca <paulnasca>
Date: Sat, 27 Mar 2004 21:23:49 +0000
*** empty log message ***
Diffstat:
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