Re: [linux-audio-dev] Basic MIDI question

From: Jens M Andreasen <jens.andreasen@email-addr-hidden>
Date: Wed Jul 26 2006 - 02:55:33 EEST

On Tue, 2006-07-25 at 21:55 +0200, Jacob wrote:
> Hmmm, does this really work? I don't think so.
>
> Example:
>
> 1. status: note on (-> thisByte -> runningStatus)
> 2. data: key (-> thisByte, ignored)
> 3. data: vel (-> thisByte, checked against 0, checked againt 0x80)
> 4. status: note off (read as key !!!)
> 5. data: key (read as vel, checked against 0x80 !!!)
> 6. data: vel (read as key !!!)
> 7. status: note on (read as vel, checked against 0x80 !!!)
>
> The Problem is, that the second data byte is used for the running status
> byte test.
>
> Yours,
>
> Jacob

Ehmm ... Right! Just checking if you were awake :-D

Furthermore, it did not do the single byte SysRt either. But there ought
to be a small, reasonable solution out there somewhere ... Giving it one
more try:

  
  for(;;)
    {
      thisByte = nextByte();
      
      if(thisByte & 0x80) // got new status
        runningStatus = thisByte, count = 0;
      
      if(runningStatus == NOTE_ON || runningStatus == NOTE_OFF)
        {
          while(count < 2) // we need data1 and data2
            {
              thisByte = nextByte();
              // filter out single byte SysRt
              count += !(thisByte & 0x80);
            }

          if(thisByte == 0 || runningStatus == NOTE_OFF)
            setLed(NOTE_OFF);
          else
            setLed(NOTE_ON);
          
          // assume we will keep runningStatus
          count = 1;
        }
    }
  

> On Tue, Jul 25, 2006 at 07:00:54PM +0200, Jens M Andreasen wrote:
> > Bzzzt ... My wrong!
> >
> >
> > thisByte = nextByte();
> >
> > for(;;)
> > {
> >
> > if(thisByte & 0x80)
> > runningStatus = thisByte;
> >
> > //... after which we get that:
> >
> > if(runningStatus == NOTE_ON || runningStatus == NOTE_OFF)
> > {
> > thisByte = nextByte();
> > thisByte = nextByte();
> >
> > // note_on with zero velocity is note_off
> > if(thisByte == 0 || runningStatus == NOTE_OFF)
> > setLed(NOTE_OFF);
> > else
> > setLed(NOTE_ON);
> > }
> > else
> > thisByte = nextByte();
> > }
> > > > Lee
> > > >
> > --
> >

-- 
Received on Wed Jul 26 04:15:09 2006

This archive was generated by hypermail 2.1.8 : Wed Jul 26 2006 - 04:15:09 EEST