Duda SndLib

Al usar Play_Song() se puede seleccionar por que voice sacarlo? como?

Salu2 =D
Me parece que Play_Song() y PlayOgg() usan el canal 0, pero no me hagas mucho caso porque no me lo he mirado mucho.

PlayOgg() si te puedo asegurar que usa el 0.
¿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.
Hermes escribió: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()


Lo has clavado =P Pues si, era para eso pero mientras te leia he comprendido el uso de las voces en play_song. Gracias, utilizare PlaySongVoice ^^

Salu2 =3
pho escribió:
Hermes escribió: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()


Lo has clavado =P Pues si, era para eso pero mientras te leia he comprendido el uso de las voces en play_song. Gracias, utilizare PlaySongVoice ^^

Salu2 =3


Jeje, si ya suponía yo que iban por ahí los tiros [+risas]

De todas formas, recuerda que el mezclado de las voces se hace mediante suma saturada y eso significa que si no gestionas inteligentemente, el volumen de las voces o el tipo de voces a mezclar, el resultado no será bueno y tenderá a distorsionar.

Eso es algo que no se puede evitar, pues las señales se recortan al mezclar si se sobrepasan los límites y realmente, el hardware está trabajando con una única voz en estéreo
4 respuestas