[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 );
>