[PD] nanoKontrol2 dropping MIDI messages (OSX)

Ivica Ico Bukvic ico at vt.edu
Thu Jun 28 18:16:38 CEST 2012


BTW, this does not affect Linux, right? I ask this because my Linux 
build only uses s_midi_oss and s_midi_alsa source files...

On 06/24/2012 01:35 PM, Miller Puckette wrote:
> diff --git a/src/s_midi_pm.c b/src/s_midi_pm.c
> index fe123ff..856f121 100644
> --- a/src/s_midi_pm.c
> +++ b/src/s_midi_pm.c
> @@ -241,44 +241,51 @@ void nd_sysex_inword(int midiindev, int status, int data1, int data2, int data3)
>
>   void sys_poll_midi(void)
>   {
> -    int i, nmess;
> +    int i, nmess, throttle = 100;
>       PmEvent buffer;
>       for (i = 0; i<  mac_nmidiindev; i++)
>       {
> -        int nmess = Pm_Read(mac_midiindevlist[i],&buffer, 1);
> -        if (nmess>  0)
> +        while (1)
>           {
> -            int status = Pm_MessageStatus(buffer.message);
> -            int data1  = Pm_MessageData1(buffer.message);
> -            int data2  = Pm_MessageData2(buffer.message);
> -            int data3 = ((buffer.message>>  24)&  0xFF);
> -            int msgtype = (status>>  4) - 8;
> -            switch (msgtype)
> +            if (!throttle--)
> +                goto overload;
> +            nmess = Pm_Read(mac_midiindevlist[i],&buffer, 1);
> +            if (nmess>  0)
>               {
> -            case 0:
> -            case 1:
> -            case 2:
> -            case 3:
> -            case 6:
> -                sys_midibytein(i, status);
> -                sys_midibytein(i, data1);
> -                sys_midibytein(i, data2);
> -                break;
> -            case 4:
> -            case 5:
> -                sys_midibytein(i, status);
> -                sys_midibytein(i, data1);
> -                break;
> -            case 7:
> -                nd_sysex_mode=1;
> -                nd_sysex_inword(i, status, data1, data2, data3);
> -                break;
> -            default:
> -                if (nd_sysex_mode)
> +                int status = Pm_MessageStatus(buffer.message);
> +                int data1  = Pm_MessageData1(buffer.message);
> +                int data2  = Pm_MessageData2(buffer.message);
> +                int data3 = ((buffer.message>>  24)&  0xFF);
> +                int msgtype = (status>>  4) - 8;
> +                switch (msgtype)
> +                {
> +                case 0:
> +                case 1:
> +                case 2:
> +                case 3:
> +                case 6:
> +                    sys_midibytein(i, status);
> +                    sys_midibytein(i, data1);
> +                    sys_midibytein(i, data2);
> +                    break;
> +                case 4:
> +                case 5:
> +                    sys_midibytein(i, status);
> +                    sys_midibytein(i, data1);
> +                    break;
> +                case 7:
> +                    nd_sysex_mode=1;
>                       nd_sysex_inword(i, status, data1, data2, data3);
> +                    break;
> +                default:
> +                    if (nd_sysex_mode)
> +                        nd_sysex_inword(i, status, data1, data2, data3);
> +                }
>               }
> +            else break;
>           }
>       }
> +    overload: ;
>   }
>
>   void midi_getdevs(char *indevlist, int *nindevs,


-- 
Ivica Ico Bukvic, D.M.A
Composition, Music Technology
Director, DISIS Interactive Sound&  Intermedia Studio
Director, L2Ork Linux Laptop Orchestra
Head, ICAT IMPACT Studio
Virginia Tech
Department of Music
Blacksburg, VA 24061-0240
(540) 231-6139
(540) 231-5034 (fax)
disis.music.vt.edu
l2ork.music.vt.edu
ico.bukvic.net




More information about the Pd-list mailing list