¿Y para que quieres seleccionar una voz diferente?
Play_Song forma parte de song_lib, que es una librería que hace uso de la función SND_PlaySongVoice que puedes utilizar si quieres, para ejecutar notas musicales sueltas, eligiendo la voz que tu quieras.
La librería song_lib muestra un ejemplo de utilización de la funcion SND_PlaySongVoice y evidentemente, disponiendo de código fuente, puedes seleccionar las voces que tu quieras, pero la idea es la siguiente:
- SndLib supone la voz 0 como voz de audio stream, y la reserva para el Modplayer o el Oggplayer, de forma que si llamas a SND_GetFirstUnusedVoice(), será la ultima voz que te retorne (si está libre)
- song_lib utiliza las tres ultimas voces, las cuales deben quedar reservadas y no ser utilizadas para efectos.
Esto nos dejaria de las 16 voces que soporta la librería, (por defecto) 12 voces para efectos, la primera de las cuales, sería la voz 1 y te permite gestionar las voces de la 1 a la 12 a tu antojo. Esto suponiendo que utilizas song_lib, claro, porque si no la usas, pues tienes 15 para efectos.
Yo no se tu, pero yo veo esa organización bastante bien y menos problematica: song_lib debe encadenar las notas de la melodía, acompañamiento y batería en sus correspondientes voces y no tiene sentido que esas voces sean flotantes y eso no facilitaría precisamente, la gestion de las voces de efectos, si las voces estuvieran entremezcladas.
De todas formas, en el código fuente de song_lib puedes ver que la funcion Play_Song, hace un bucle de inicialización de forma que asigna la voz así: s->channel= (MAX_SND_VOICES-1-cont) | 128; donde lo que hay entre parentesis, representa la voz que se usará.
Si tu idea es ejecutar voces de forma interactiva (por ejemplo, simular una batería "golpeando" con el mando) y es por eso por lo que quieres controlar las voces, lo mejor es que utilices SND_PlaySongVoice()
En este caso, echale un ojo a las lineas 377 a 453 de song_lib.c, donde puedes ver como programo las diferentes "notas" de la batería.
Por ejemplo la nota "c" o "c#" se interpreta asi:
case 0:
case 1:
SND_SetSongSampleVoice(s->channel, VOICE_MONO_8BIT, drum_bass_smp, NULL, size_drum_bass_smp);
SND_PlaySongVoice(s->channel, Note2Freq(NOTE(NOTE_C,3), 8000, NOTE(NOTE_C,3)), 0, 0, time2, 0, s->lvolume, s->rvolume);
Como puedes ver, la primera funcion asigna los samples de batería , mientras que la segunda programa la voz (puede ser cualquiera), por la que sonará la nota (mira la declaración de las funciones en snd.h para obtener mas detalles). Si en vez de batería, fuera un juego tipo "Simón" pues es el mismo método.