long size (MidiSeqPtr s) { long n; MidiEvPtr e; for (n = 0, e = FirstEv(s); e; e = e->link) n++; return n; }
void test21 () { long n; printf("\n\n<TEST 21> record and playback a sequence\n"); DebugStr ("--> use g or G to start recording\n"); ourSequence = MidiNewSeq(); ourFilter = MidiNewFilter(); InstallFilter(ourRefNum,ourFilter); MidiFlushEvs(ourRefNum); MidiSetRcvAlarm(ourRefNum, record); MidiConnect(0, ourRefNum, true); MidiConnect(ourRefNum, 0, true); printf("Now play on the Midi keyboard, every thing is recorded\n"); DebugStr ("--> use g or G to stop recording\n"); MidiConnect(0, ourRefNum, false); MidiSetRcvAlarm(ourRefNum, 0); printf (" %ld events where recorded\n", size(ourSequence)); DebugStr ("--> use g or G to play back the sequence\n"); stopFlag = 0; if (FirstEv(ourSequence)) { MidiCall(play, MidiGetTime(), ourRefNum, (long) FirstEv(ourSequence), 0, 0); } printf("Now playing the sequence\n"); DebugStr ("--> use g or G to stop play back and go to the next test\n"); stopFlag = 1; MidiFreeSeq(ourSequence); }
// preplanuje prave aktivni proces na cas Time + T void CProcess::Hold(TIME T) { if (this != Current()) return; // pracuje jen s prave aktivnim procesem if (T <= 0) return; // pokud je T <= 0, nedelej nic CEventNotice* e = FirstEv(); // prave zpracovavanou udalost e->evTime += T; // naplanuj na dobu Time()+T if (e->Suc() != NULL) // pokud to neni posledni pl. udalost { if (((CEventNotice*) e->Suc())->evTime <= e->evTime) { // pokud nasledujici udalost nastane driv e->Out(); // vyrad soucasnou prvni udalost e->Rank(false); // zarad ji na spravne misto podle casu } } else e->SetName(); // nastavi name v CLinkage ResumeCurrent(); // predej rizeni prvnimu procesu }
/*---------------------------------------------------*/ void STS_WriteScore (long s, ScorePtr sp) { MidiEvPtr e = 0; float p2, p3; long param; int ref, chan, type; FILE *f; char scoreline[1024]; char str[25]; char str2[25]; if((f = fopen(sp->scorefile, "wt")) != NULL){ if(sp->addinfile != "NULL") STS_AppendToScoreFile(sp->addinfile, f); e = FirstEv(s); if(e){ while(e){ type = EvType(e); if(!sp->events[type]){e = Link(e); continue;} if(sp->ab == abTrack){ ref = RefNum(e); if(sp->shiftref) ref += 1; if(!sp->trkchn[ref]){e = Link(e); continue;} else sprintf(scoreline, "i%u \t", ref); } if(sp->ab == abChan){ chan = Chan(e); if(!sp->trkchn[chan]){e = Link(e); continue;} else sprintf(scoreline, "i%u \t", chan + 1); } p2 = (float)Date(e) / 1000.; sprintf(str, "%.3f \t", p2); strcat(scoreline, str); switch(type){ case typeNote: p3 = (float)MidiGetField(e, 2) / 1000.; sprintf(str, "%.3f \t", p3); strcat(scoreline, str); STS_ConvertPitch(sp, str, MidiGetField(e, 0)); STS_ConvertAmpli(sp, str2, MidiGetField(e, 1)); STS_OrderParams(sp, scoreline, str, str2); break; case typeKeyPress: sprintf(str, "%.3f \t", sp->defdur / 1000.); strcat(scoreline, str); STS_ConvertPitch(sp, str, MidiGetField(e, 0)); STS_ConvertAmpli(sp, str2, MidiGetField(e, 1)); STS_OrderParams(sp, scoreline, str, str2); break; case typeCtrlChange: case typeCtrl14b: case typeNonRegParam: case typeRegParam: sprintf(str, "%.3f \t", sp->defdur / 1000.); strcat(scoreline, str); sprintf(str, "%03u \t", MidiGetField(e, 0)); strcat(scoreline, str); sprintf(str, "%03u \t", MidiGetField(e, 1)); strcat(scoreline, str); break; case typeProgChange: case typeChanPress: sprintf(str, "%.3f \t", sp->defdur / 1000.); strcat(scoreline, str); sprintf(str, "%03u \t", MidiGetField(e, 0)); strcat(scoreline, str); break; case typePitchWheel: sprintf(str, "%.3f \t", sp->defdur / 1000.); strcat(scoreline, str); param = STS_Build14BitValue((long)e) - 8192; sprintf(str, "%03li \t", param); strcat(scoreline, str); break; default: if(type >= typePrivate && type <= typeLastPrivate){ sprintf(str, "%.3f \t", sp->defdur / 1000.); strcat(scoreline, str); sp->CFunc(sp, str, (long)e); strcat(scoreline, str); } break; } strcat(scoreline, "\n"); fputs(scoreline, f); e = Link(e); } } if(sp->writesection){ if(sp->padout > 0.){ sprintf(str, "f0 %.3f\n", sp->padout / 1000.); fputs(str, f); } fputs("s", f); } else fputs("e", f); fclose(f); } }
//okamzita hodnota modeloveho casu TIME CProcess::Time() { if (FirstEv()==NULL) return 0; else return FirstEv()->evTime; }
// vraci prave aktivni proces CProcess* CProcess::Current() { if (FirstEv() == NULL) return NULL; else return FirstEv()->proc; }