示例#1
0
long size (MidiSeqPtr s)
{
        long            n;
        MidiEvPtr       e;
        
        for (n = 0, e = FirstEv(s); e; e = e->link) n++;
        return n;
}
示例#2
0
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);
}
示例#3
0
// 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
}
示例#4
0
/*---------------------------------------------------*/
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);
 }
}
示例#5
0
//okamzita hodnota modeloveho casu
TIME CProcess::Time()
{
    if (FirstEv()==NULL) return 0;
    else return FirstEv()->evTime;
}
示例#6
0
// vraci prave aktivni proces
CProcess* CProcess::Current()
{
    if (FirstEv() == NULL) return NULL;
    else return FirstEv()->proc;
}