[Cs-dev] tuning Jack server and external Midi callback
Date | 2011-06-09 13:04 |
From | Durga |
Subject | [Cs-dev] tuning Jack server and external Midi callback |
Dear Csound community I tinkered a dirty implementation of the csoundSetExternalMidiRead Callback: int midi_in_read(CSOUND * csound, void *userData, unsigned char *buf, int nBytes) { int i; int bytes = 0; ProjData * pFP = (ProjData *) userData; if(userData) { if(pFP->buf_fill > 0) { for(i=0; i < pFP->buf_fill; i++) { buf[i] = pFP->cs_midi_buf[i]; bytes++; } } } return bytes; } pFP->cs_midi_buf is filled by the Jack process callback which is called each Jack cycle. pFP->buf_fill is the amount of bytes written by the Jack process callback. I use a Jack buffer size of 1024 frames / period ksmps = 256 csound software buffer size (-b) = -4 So the Csound software buffer is also 1024 and synced with kr. I get a satisfying real time response to my keyboard strokes but unfortunately Csound outputs around 30: new alloc for instr 1: WARNING: MIDI note overlaps with key 71 on same channel messages. If I reduce the Jack buffer size to 64 (of course I also have to adjust ksmps to =< 64) I can reduce these messegas to around 3 each time I press a key on my keyboard. I dont understand this behavior. In the Csound Book CD chapter 2 “Real-time Synthesis in Csound with MIDI Control” I've learned “Csound looks to see if there are any new MIDI messages once per k-period.”. So for a -b -4 value I expect 4 “WARNING: MIDI note overlaps with key 71 on same channel” messages. Since I am pretty new to C programming I might have forgotten something fundamental. Do I have to lock the pFP->cs_midi_buf array while Jack is writing / Csound is reading? Any hints are appreciated, please tell me if you need more information about my code / setup. Thank you! Durga -- View this message in context: http://csound.1045644.n5.nabble.com/tuning-Jack-server-and-external-Midi-callback-tp4472479p4472479.html Sent from the Csound - Dev mailing list archive at Nabble.com. ------------------------------------------------------------------------------ EditLive Enterprise is the world's most technically advanced content authoring tool. Experience the power of Track Changes, Inline Image Editing and ensure content is compliant with Accessibility Checking. http://p.sf.net/sfu/ephox-dev2dev _______________________________________________ Csound-devel mailing list Csound-devel@lists.sourceforge.net https://lists.sourceforge.net/li |
Date | 2011-06-09 14:09 |
From | Victor Lazzarini |
Subject | Re: [Cs-dev] tuning Jack server and external Midi callback |
Well , if you are using a single buffer, I guess you should lock it, since the two threads might try to change it at the same time. Another solution is to use a double buffer, so each thread is reading/ writing to a different half of the buffer at a time. I suggest you have a look at the code in rtwinmm.c, which uses a callback for MIDI input (Windows MME lib). You could adapt it to your needs, it uses locks and a circular buffer. Note that 256 is far too high ksmps for any RT use. I should try to keep below 64. The default is 10, so you could try 16, if you want to use power of two sizes. Victor On 9 Jun 2011, at 13:04, Durga wrote: > Dear Csound community > > I tinkered a dirty implementation of the csoundSetExternalMidiRead > Callback: > int midi_in_read(CSOUND * csound, void *userData, unsigned char > *buf, int > nBytes) { > int i; > int bytes = 0; > ProjData * pFP = (ProjData *) userData; > if(userData) > { > if(pFP->buf_fill > 0) > { > for(i=0; i < pFP->buf_fill; i++) > { > buf[i] = pFP->cs_midi_buf[i]; > bytes++; > } > } > } > return bytes; > } > > pFP->cs_midi_buf is filled by the Jack process callback which is > called each > Jack cycle. > pFP->buf_fill is the amount of bytes written by the Jack process > callback. > > I use a Jack buffer size of 1024 frames / period > ksmps = 256 > csound software buffer size (-b) = -4 > So the Csound software buffer is also 1024 and synced with kr. > > I get a satisfying real time response to my keyboard strokes but > unfortunately Csound outputs around 30: > new alloc for instr 1: > WARNING: MIDI note overlaps with key 71 on same channel > messages. > > If I reduce the Jack buffer size to 64 (of course I also have to > adjust > ksmps to =< 64) I can reduce these messegas to around 3 each time I > press a > key on my keyboard. > > I dont understand this behavior. In the Csound Book CD chapter 2 > “Real-time > Synthesis in Csound with MIDI Control” I've learned “Csound looks to > see if > there are any new MIDI messages once per k-period.”. > > So for a -b -4 value I expect 4 “WARNING: MIDI note overlaps with > key 71 on > same channel” messages. > > Since I am pretty new to C programming I might have forgotten > something > fundamental. Do I have to lock the pFP->cs_midi_buf array while Jack > is > writing / Csound is reading? > > Any hints are appreciated, please tell me if you need more > information about > my code / setup. > Thank you! > Durga > > -- > View this message in context: http://csound.1045644.n5.nabble.com/tuning-Jack-server-and-external-Midi-callback-tp4472479p4472479.html > Sent from the Csound - Dev mailing list archive at Nabble.com. > > ------------------------------------------------------------------------------ > EditLive Enterprise is the world's most technically advanced content > authoring tool. Experience the power of Track Changes, Inline Image > Editing and ensure content is compliant with Accessibility Checking. > http://p.sf.net/sfu/ephox-dev2dev > _______________________________________________ > Csound-devel mailing list > Csound-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/csound-devel Dr Victor Lazzarini Senior Lecturer Dept. of Music NUI Maynooth Ireland tel.: +353 1 708 3545 Victor dot Lazzarini AT nuim dot ie ------------------------------------------------------------------------------ EditLive Enterprise is the world's most technically advanced content authoring tool. Experience the power of Track Changes, Inline Image Editing and ensure content is compliant with Accessibility Checking. http://p.sf.net/sfu/ephox-dev2dev _______________________________________________ Csound-devel mailing list Csound-devel@lists.sourceforge.net |
Date | 2011-06-09 15:49 |
From | Durga |
Subject | Re: [Cs-dev] tuning Jack server and external Midi callback |
Attachments | None None |
Victor, thanks a lot for your quick answer! Actually the Jack thread is only writing while the Csound thread is only reading. Thats why I didnt see the need of locking the thread. I am just looking for an explanation for the "WARNING: MIDI note overlaps with key 71 on same channel" messages. For sure I will check rtwinmm.c and reduce ksmps as soon as I am back home, thank you for the hints! Durga 2011/6/9 Victor Lazzarini [via Csound] <[hidden email]> Well , if you are using a single buffer, I guess you should lock it, View this message in context: Re: tuning Jack server and external Midi callback Sent from the Csound - Dev mailing list archive at Nabble.com. |
Date | 2011-06-10 21:05 |
From | Durga |
Subject | Re: [Cs-dev] tuning Jack server and external Midi callback |
ksmps is 16 now. I still get the same amount of “WARNING: MIDI note overlaps with key XX on same channel” messages (around 30). The only way I can reduce these messages is to size down the Frames/Period of Jack. Jack runs now with 256 Frames/Period (before 1024) and I get around 6 “WARNING: MIDI note overlaps with key XX on same channel” messages for each key stroke. Obviously Csound’s Midi callback gets called more frequently than Jack’s process callback. The question is now: How do I control the Csound Midi callback rate? For the moment I added this line after the for loop to the code above to filter the unwanted messages: pFP->buf_fill = 0; So Csound won’t read the buffer until it is filled again by Jack. Of course, this solution is not satisfying. I really would like to understand the Csound call and run it at the same speed as the Jack callback…..thanks for your help! Durga -- View this message in context: http://csound.1045644.n5.nabble.com/tuning-Jack-server-and-external-Midi-callback-tp4472479p4477154.html Sent from the Csound - Dev mailing list archive at Nabble.com. ------------------------------------------------------------------------------ EditLive Enterprise is the world's most technically advanced content authoring tool. Experience the power of Track Changes, Inline Image Editing and ensure content is compliant with Accessibility Checking. http://p.sf.net/sfu/ephox-dev2dev _______________________________________________ Csound-devel mailing list Csound-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/csound |