Jump to content

Photo

How to convert WAV2CV sound data into Coleco BIOS sound format


No replies to this topic

#1 newcoleco OFFLINE  

newcoleco

    Stargunner

  • 1,323 posts
  • Always Tired
  • Location:Quebec

Posted Fri Feb 6, 2009 7:01 PM

Before reading, make sure you know how to write hexadecimal values in
C, and what they represent in decimal values.

THIS MESSAGE IS ABOUT CONVERTING (BY HAND) FROM MARCEL'S SOUND FORMAT
TO COLECO SOUND FORMAT FOR AUTOMATICALLY GENERATED SOUND TABLES (WITH
WAV2CV TOOL).

1. THE BASE CODE:

Before converting the sound, you have to decide on which tone channel
he will be played. Marcel's sound routines doesn't care which tone
channel, they choose for you, and because of that you don't have the
control of your sounds, and sometimes it creates overlaping sounds.

The base code is this :

Tone CH#1 = 0x40
Tone CH#2 = 0x80
Tone CH#3 = 0xC0

For the example, I will use the base code for Tone CH#1. (0x40)

2. THE UNNECESSARY STUFF.

The first line of the sound data is unnecessary, just delete it.

byte wav2cv_sound0[] = {0, 0x63, 0xf, 1,
0x83,0xE5,0x90,2, 0x83,0xE7,0x90,2, 0x83,0xEC,0x96,2, 0x83,0xF6,0x9A,2,
0x83,0xF5,0x9C,2, 0x83,0xF5,0x9E,2, 0x9f,4, 0x83,0xA3,0x9E,2,
0x83,0xD1,0x9C,2,
...
0,0,0};

Became this :

byte wav2cv_sound0[] = {
0x83,0xE5,0x90,2, 0x83,0xE7,0x90,2, 0x83,0xEC,0x96,2, 0x83,0xF6,0x9A,2,
0x83,0xF5,0x9C,2, 0x83,0xF5,0x9E,2, 0x9f,4, 0x83,0xA3,0x9E,2,
0x83,0xD1,0x9C,2,
...
0,0,0};

3. SIMPLE NOTES

Each code starting with 0x8?, 0xa? or 0xc? is a note. You deal with
them by first replacing it with your base code but keep in mind the
less significant nibble.

0x83, => 0x40, (keep in mind : 3)

Pass the second code.

0xE5, => 0xE5, (keep the same)

Delete de most significant nibble for the third code. Put as less
significant nibble the number you keep in mind previously.

0x90, => 0x03, ( 0 from 90 and 3 from 83 )

Pass the fourth code and you have converted the first note.

In our example, the conversion continue :

0x83,0xE7,0x90,2, => 0x40,0xE7,0x03,2,
0x83,0xEC,0x96,2, => 0x40,0xEC,0x63,2,
0x83,0xF6,0x9A,2, => 0x40,0xF6,0xA3,2,
0x83,0xF5,0x9C,2, => 0x40,0xF5,0xC3,2,
0x83,0xF5,0x9E,2, => 0x40,0xF5,0xE3,2,

And then we have this result :

byte wav2cv_sound0[] = {
0x40,0xE5,0x03,2, 0x40,0xE7,0x03,2, 0x40,0xEC,0x63,2, 0x40,0xF6,0xA3,2,
0x40,0xF5,0xC3,2, 0x40,0xF5,0xE3,2, 0x9f,4, 0x83,0xA3,0x9E,2,
0x83,0xD1,0x9C,2,
...
0,0,0};

4. REST CODE

0x9f,4, is a silence (0x9f = mute) during 4 cycles.

Add 0x20 to your base to get the base code for silence.

Silence for Tone CH#1 = 0x60
Silence for Tone CH#2 = 0xA0
Silence for Tone CH#3 = 0xE0

Now, you need your knowledge about hexadecimal values to deal with the
number of cycles. You need to add the number of cycles into the
silence code, but you can't add more than 30 cycles into the silence
code, so if you need more than 30 cycles of silence you can use more
than one rest code.

0x9f,4, => 0x64,

5. THE FINAL 0,0,0 BECOME...

In our example here, we are now at the end of the sound data.

byte wav2cv_sound0[] = {
0x40,0xE5,0x03,2, 0x40,0xE7,0x03,2, 0x40,0xEC,0x63,2, 0x40,0xF6,0xA3,2,
0x40,0xF5,0xC3,2, 0x40,0xF5,0xE3,2, 0x64, 0x40,0xA3,0xE3,2,
0x40,0xD1,0xC3,2,
...
0,0,0};

The 0,0,0 code became simple a single END CODE which is 0x10 more than
the BASE CODE for the tone CHANNEL.

END CODE for Tone CH#1 = 0x50
END CODE for Tone CH#2 = 0x90
END CODE for Tone CH#3 = 0xD0

So the conversion to Coleco sound format gives this :

byte wav2cv_sound0[] = {
0x40,0xE5,0x03,2, 0x40,0xE7,0x03,2, 0x40,0xEC,0x63,2, 0x40,0xF6,0xA3,2,
0x40,0xF5,0xC3,2, 0x40,0xF5,0xE3,2, 0x64, 0x40,0xA3,0xE3,2,
0x40,0xD1,0xC3,2,
...
0x50};

6. REPEAT CODE

Instead of putting the END CODE, you can put a REPEAT CODE which is
the same but with 8 at the less significant nibble instead of 0.

REPEAT CODE for Tone CH#1 = 0x58
REPEAT CODE for Tone CH#2 = 0x98
REPEAT CODE for Tone CH#3 = 0xD8

7. DECLARE SOUND IN SND_TABLE

When converted you need to declare all your sound tables into
snd_table. Each entry in this table is associated with an AREA which
also represent the priority of your sound. Higher is the AREA number,
higher is the priority. LIB4K already set 7 AREAs, you just need to
use them as you want.

Warning : To setup the sound areas in RAM, Coleco uses the first entry
of snd_table as a reference for the first AREA. So, whatever the order
you declare your sound tables into snd_table, the first entry should
be associated with AREA 1, like this :

const sound_t snd_table[] = {
{wav2cv_sound0,SOUNDAREA1},
...
};

8. PLAY AND STOP SOUND.

To start a sound, simply use play_sound. To stop a sound, simply use
stop_sound. To force replaying a sound already playing, stop then
start the sound.

play_sound(1); /* Play sound wav2cv_sound0 */
stop_sound(1); /* Stop sound wav2cv_sound0 (if already playing of
course) */

I hope you will find this information message about conversion useful
for your projects.




0 user(s) are browsing this forum

0 members, 0 guests, 0 anonymous users