[Stk] Re: Polyphonic bug in STK's demo.cpp

Casey Muller caseymrm@mrl.nyu.edu
Sat, 22 Oct 2005 16:02:36 -0400 (EDT)


Oh, forgot to mention, the patch also changes the instrument creation loop 
in main to assign subsequent instruments to different channels.

This is just what I had to do to get multiple voices working, I'll leave 
the analysis of general-case utility to you guys.

Casey

On Sat, 22 Oct 2005, Casey Muller wrote:

> Hi,
>
> I recently grabbed STK to make a simple sound server that I could address 
> over the network. I was pleased to find out I could just use the demo app 
> with -or -is.
>
> However, I couldn't seem to get polyphony to work from a socket, which I 
> eventually traced back to demo.cpp's processMessage( TickData* data ).
>
> I don't know if it's worth submitting a patch, but other people may be 
> wanting the same thing as me, and of course example code often gets copied 
> into apps.
>
> Anyway, the problem is just that the 'channel' gets parsed into the TickData 
> structure properly, but then never gets passed into the noteOn, noteOff, 
> setFreq, controlChange functions in processMessage. So everything ends up in 
> the default channel, and when (for instance) you use two channels and then 
> setFrequency each in turn, the pitch goes back and forth like an old 
> videogame instead of being polyphonic.
>
> The simple fix is just to pass data.channel into those functions to override 
> the default of 0.
>
> I've included a diff below, but it's pretty straightforward.
>
> Anyway, just thought I'd mention it. Thanks for the library, it saved me a 
> lot of time. Philip Davidson is my officemate here, so I know I'm underusing 
> its capabilities ;-)
>
> Casey
>
> diff of demo.cpp:
>
> 78c78
> <       data->voicer->noteOff( value1, 64.0 );
> ---
>>       data->voicer->noteOff( value1, 64.0, data->message.channel );
> 80c80
> <       data->voicer->noteOn( value1, value2 );
> ---
>>       data->voicer->noteOn( value1, value2, data->message.channel );
> 84c84
> <     data->voicer->noteOff( value1, value2 );
> ---
>>     data->voicer->noteOff( value1, value2, data->message.channel );
> 93c93
> <       data->voicer->setFrequency( value2 );
> ---
>>       data->voicer->setFrequency( value2, data->message.channel );
> 95c95
> <       data->voicer->controlChange( (int) value1, value2 );
> ---
>>       data->voicer->controlChange( (int) value1, value2, 
> data->message.channel );
> 99c99
> <     data->voicer->controlChange( 128, value1 );
> ---
>>     data->voicer->controlChange( 128, value1, data->message.channel );
> 103c103
> <     data->voicer->setFrequency( value1 );
> ---
>>     data->voicer->setFrequency( value1, data->message.channel );
> 107c107
> <     data->voicer->pitchBend( value1 );
> ---
>>     data->voicer->pitchBend( value1, data->message.channel );
> 127c127
> <       data->voicer->addInstrument( data->instrument[i] );
> ---
>>       data->voicer->addInstrument( data->instrument[i], 
> data->message.channel );
> 222c222
> <     data.voicer->addInstrument( data.instrument[i] );
> ---
>>     data.voicer->addInstrument( data.instrument[i], i );
>