News:

As a consequence of the forum being updated and repaired, the chatbox has been lost.
However, you can still come say hi on our Discord server!

Main Menu

Wav Insertion

Started by Blazer, 06, July, 2009, 10:27:00 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Blazer

Yeah. :\

Step 1 is to convert the WAV. It didn't bring up any errors so I'm assuming it did it correctly. I tried another WAV that was possibly compressed and it DID give an error, so yeah, I'm confident the file I am using is fine. I'm 99% sure ALL my pointers are 100% correct. I'd be shocked if it was a pointer problem.

My instrument map is very very simple...

00003C00 00701B09 00FF00FF

I used Atrius' format, and the pointer in the middle leads to 0x11B7000 where my instrument data is. The instrument data is what was in the "taunt.bin" file, my converted file. Yes, I'm trying to insert the voice of a characters' taunt. That's not important though, is it? :P

Now, the pointer to my header, in the pointer table. 48ECAD08 06000600

The last 4 bytes are part of the priority, I am inserting over what was originally a sound effect and I checked to see if the bytes looked right and they do; the other option would be to make it "07 00 07 00" but honestly, the sound should work REGARDLESS and the priority should only effect how it works out in-game. :\

01001400 50801C09 00801C09

The 1st part is what was originally there. I have also tried a header of "01000A80" but that didn't change much. :( I've already showed what's at the first pointer-- the instrument thing and the 2nd one is at 0x11C8000 and this is what is there.

011C8000  BE FF BC 00 BB 01 BD 00-CF 3C 7F B0 B1 00 00 00

I got those bytes from Atrius.

If anyone can help, please help. I'm really curious to insert some sound effects/voices. Especially voices. :P

Thanks in advance, although I'll be saying thanks after anyone helps me (if possible) and indebted to them as well. ^_^

This post has been edited by Blazer on Jul 6 2009, 09:28 PM

Atrius (He/Him)

You write your WORD values in a different endian format than I do.

00701B09 would be interpreted as 0x09B17000 by the GBA, correct?  That's how I would write it then, so you probably put in 0x00003C00, and 0x00FF00FF backwards.
[sprite=220,4,0]I'm shaking my head in general disapproval of everything[/sprite]

Blazer

Little endian.

Regardless, I just checked some existing voicegroups, you're right.

Let's see if it fixes it, thanks.

EDIT: By the way, an '08' is added to the end because the game needs to know to access the ROM part of the uh... RAM (I suck at terminology, excuse my lack of proper explanation). You probably know this, but I don't want to assume anything. Thus, the pointer is read as 0x11B7000

EDIT2: I got something; "BZZZTT, BZZZTT".

You wouldn't by any chance have one of the voice clips you inserted into GS that you know worked for the sake of me testing stuff, would you?

This post has been edited by Blazer on Jul 6 2009, 09:52 PM

Salanewt

Hello. I heard about big and little endian format when I was trying to make a hack for Link to the Past, but I did not understand them. When you both are done your conversation, could one of you please explain to me what they are? I learned a bit about them, but I find them confusing (this guide to Hyrule Magic does not help much about endian formats, but it mentions them).

Thank you in advance, and please have a nice day.
:MercurySet:  
Oh yeah baby, £ me harder.

Fusion is just a cheap tactic to make weak Adepts stronger.

Yoshi's Lighthouse is a hacking website in progress. Why not check it out if you like Yoshi or the Mario & Luigi games?

Blazer

@Atrius: If there's any data you need in order for you to help me, say so. I mainly want to get it working first; if I can get it working I can easily apply the concept.

I can't tell you much about big endian, but little endian is reversing the order of bytes in a word...

12 34 56 78 becomes 78 56 34 12

If I want the game to know the offset '0x08123456" I would need to type into a hex editor "56 34 12 08".

That's the jist of how it works, anyway. It gets easy with practice.  

Atrius (He/Him)

You did also reposition it so that it's WORD aligned right?

Yes, it would have been difficult to write an editor for a GBA game without knowing about how the pointers actually work.  Here's a complete list of GBA's memory map if you're curious about the rest of it.  There's a lot of good, extremely detailed information on how exactly the GBA works on that page, it really comes in handy sometimes.

Salanewt, endianess is how a processor interprets the order of bytes it reads.  Suppose you have a byte stream like 01 02 03 04.  That's the ordered they're actually stored in the file.  If a big endian processor read that file it would interpret that as 0x01020304, but if a little endian processor read it, it would interpret it backwards as 0x04030201.
[sprite=220,4,0]I'm shaking my head in general disapproval of everything[/sprite]

Blazer

Oh no, not GBATEK.

My worst fear. >_<

Yeah, GBATEK, ThumbRef, debuggers, we don't get along too well. Not actually my worst fear, but I'm just not good enough for that stuff, I'm afraid.

Right, it make sense for you to know all of this stuff, excuse my naivety (proper word use?).

The header is word aligned-- address at 0xADEC48

Pointer table, I don't even need to say

All other data starts at 0x~~~~~~0, thus word aligned. I copied the file "taunt.bin" from 0x00-0xDB0C and pasted at 0x11B7000 so no reason for it not to work. I'm confident I didn't overwrite any data or anything.

I think what's wrong here is either the instrument map or the audio track data-- how exactly do I go about getting that data? :\

And once again, is there some file I could use that we KNOW works so I could test it to get the process down? I'd hate for the problem to be some stupid problem specific to the WAV file itself, although it seems a tad unlikely.  

Salanewt

Oh, thank you, both of you. Now that you have kindly explained it to me, I am starting to understand it. Is there anything that I can do to practice with it (changing big endian to little endian, and vise versa (preferably with games that do not have harder coding))?

Thank you in advance, and have a nice day.
:MercurySet:  
Oh yeah baby, £ me harder.

Fusion is just a cheap tactic to make weak Adepts stronger.

Yoshi's Lighthouse is a hacking website in progress. Why not check it out if you like Yoshi or the Mario & Luigi games?

Atrius (He/Him)

If it's a problem with how the WAV file is being converted I need to fix my converter, I could probably do it easier if you send me a patch of what you've tried, and the original WAV file.

I got to go for the night though, I have to get up kinda early tomorrow for formation.
[sprite=220,4,0]I'm shaking my head in general disapproval of everything[/sprite]

Blazer

Yeah, there is-- change any offsets you deal with into little endian and eventually you'll get sick at it yet good at it at the same time.

EDIT: Just saw your post, Atrius... I'm going to try different wav's and see if Charon can help me. We can continue tomorrow, provided you and I have some free time. If not, then whatever works, you're doing me the favor here. I appreciate your help so far. ^_^

- Blazer

Good night.

This post has been edited by Blazer on Jul 6 2009, 10:20 PM

Salanewt

Thanks for the advice. Good night.

Have a nice day.
:MercurySet:  
Oh yeah baby, £ me harder.

Fusion is just a cheap tactic to make weak Adepts stronger.

Yoshi's Lighthouse is a hacking website in progress. Why not check it out if you like Yoshi or the Mario & Luigi games?

Atrius (He/Him)

QuoteI think what's wrong here is either the instrument map or the audio track data-- how exactly do I go about getting that data? :\

The audio track data is a list of commands and arguments for playing music/sound effects.

Anything below 0x80 is an argument, and anything 0x80 and above is a command.

0x80 - 0xB0 = Rest commands of varying lengths, to wait a certain amount of time before playing each note.

0xB1 = Stop command, to signal the end of the audio track.  From what I've noticed even if a song loops it has one of these after the loop command.

0xB2 = Jump command, to jump the playback pointer to another location in memory.  Often used to loop songs by jumping back to the beginning of it.

0xB3 = Jump command where playback can jump back to after it again later.  Used when you want to repeat part of a song before continuing with the rest of it.

0xB4 = Return to last 0xB3 command.

0xB5-0xBA = Unidentified

0xBB = Set Tempo

0xBC = Set Pitch offset

0xBD = Set instrument

0xBE = Set Volume

0xBF = Set Panning

0xC0 - 0xCE = Unidentified

0xCF - 0xFF = Play notes of varying lengths.


So to break apart the track information I gave you:

BE FF BC 00 BB 01 BD 00-CF 3C 7F B0 B1

BE FF = A volume command with an argument of 0xFF (Volume is an odd exception to the rule that arguments must be less than 0x80)

BC 00 = Set the pitch offset to zero

BB 01 = Very low tempo so that the note is drawn out long enough for voice samples to play their full length.

BD 00 = Set the instrument to the first entry in the instrument map.

CF 3C 7F = Play a note with a pitch of 0x3C (Right in the middle of the available range), and a volume of 0x7F (The maximum available)

B0 = Wait long enough for the note to finish playing

B1 = End the audio track
[sprite=220,4,0]I'm shaking my head in general disapproval of everything[/sprite]

Charon

@ Blazer - it also helps if your sound it 11,250 Hz, Mono, 8-bit and PCM WAV audio.

Wow, this is awesome.

I think I'll pitch in and define some things a little more by defining some common arguments:

:Venus: Pitch

Pitch is very easy to understand. As Atrius noted, it is follows the byte 0xBC (which is usually the first byte in a given track anyhow). Pitch works like this:

0x00 is the base, equivalent to Middle C.

0x0C is one octave higher; High C.

0xF4 is one octave lower; Low C.

If you haven't noticed, it goes by increments of 0x0C, so for higher increments, they would be 0x18, 0x24, ect, while for lower increments they would be 0xE8, 0xDC, ect.

Tracks can be transposed by any value, however, so if you wanted it to be in a different key, you could change these values. If done, make sure to add/subtract 0x0C when raising/lowering octaves.

:Mercury: Tempo
Tempo is simply the tempo transfered into Hex. So, if your original tempo was 80, you would put in 0x50. It follows a 0xBB byte.

:Mars: Instruments
The instruments correspond with the instruments of the voicegroup. Although the instruments can be anything you want, the typical way is to have the instruments correspond directly. It follows a 0xBD The direct map:

   PIANO
0x00    Acoustic Grand (often used as a drum kit)
0x01  Bright Acoustic
0x02    Electric Grand
0x03    Honky-Tonk
0x04    Electric Piano 1
0x05    Electric Piano 2
0x06    Harpsichord
0x07    Clav

       CHROMATIC PERCUSSION
0x08  Celesta
0x09  Glockenspiel
0x0A  Music Box
0x0B  Vibraphone
0x0C  Marimba
0x0D  Xylophone
0x0E  Tubular Bells
0x0F  Dulcimer

   ORGAN
0x10  Drawbar Organ
0x11  Percussive Organ
0x12    Rock Organ
0x13    Church Organ
0x14    Reed Organ
0x15    Accoridan
0x16    Harmonica
0x17    Tango Accordian

   GUITAR
0x18    Acoustic Guitar(nylon)
0x19    Acoustic Guitar(steel)
0x1A    Electric Guitar(jazz)
0x1B    Electric Guitar(clean)
0x1C    Electric Guitar(muted)
0x1D    Overdriven Guitar
0x1E    Distortion Guitar
0x1F     Guitar Harmonics

   BASS
0x20    Acoustic Bass
0x21    Electric Bass(finger)
0x22    Electric Bass(pick)
0x23    Fretless Bass
0x24    Slap Bass 1
0x25    Slap Bass 2
0x26    Synth Bass 1
0x27    Synth Bass 2

   STRINGS
0x28    Violin
0x29    Viola
0x2A    Cello
0x2B    Contrabass
0x2C    Tremolo Strings
0x2D    Pizzicato Strings
0x2E    Orchestral Strings
0x2F    Timpani

   ENSEMBLE
0x30  String Ensemble 1
0x31    String Ensemble 2
0x32    SynthStrings 1
0x33    SynthStrings 2
0x34    Choir Aahs
0x35    Voice Oohs
0x36    Synth Voice
0x37    Orchestra Hit

   BRASS
0x38    Trumpet
0x39    Trombone
0x3A    Tuba
0x3B    Muted Trumpet
0x3C    French Horn
0x3D    Brass Section
0x3E    SynthBrass 1
0x3F    SynthBrass 2

   REED
0x40    Soprano Sax
0x41    Alto Sax
0x42    Tenor Sax
0x43    Baritone Sax
0x44    Oboe
0x45    English Horn
0x46    Bassoon
0x47    Clarinet

   PIPE
0x48    Piccolo
0x49    Flute
0x4A    Recorder
0x4B    Pan Flute
0x4C    Blown Bottle
0x4D    Shakuhachi
0x4E    Whistle
0x4F    Ocarina

   SYNTH LEAD
0x50    Lead 1 (square)
0x51    Lead 2 (sawtooth)
0x52    Lead 3 (calliope)
0x53    Lead 4 (chiff)
0x54    Lead 5 (charang)
0x55    Lead 6 (voice)
0x56    Lead 7 (fifths)
0x57    Lead 8 (bass+lead)

   SYNTH PAD
0x58    Pad 1 (new age)
0x59    Pad 2 (warm)
0x5A    Pad 3 (polysynth)
0x5B    Pad 4 (choir)
0x5C    Pad 5 (bowed)
0x5D    Pad 6 (metallic)
0x5E    Pad 7 (halo)
0x5F    Pad 8 (sweep)

   SYNTH EFFECTS
0x60    FX 1 (rain)
0x61    FX 2 (soundtrack)
0x62    FX 3 (crystal)
0x63    FX 4 (atmosphere)
0x64    FX 5 (brightness)
0x65    FX 6 (goblins)
0x66    FX 7 (echoes)
0x67    FX 8 (sci-fi)

   ETHNIC
0x68    Sitar
0x69    Banjo
0x6A    Shamisen
0x6B    Koto
0x6C    Kalimba
0x6D    Bagpipe
0x6E    Fiddle
0x6F    Shanai

   PERCUSSIVE
0x70    Tinkle Bell
0x71    Agogo
0x72    Steel Drums
0x73    Woodblock
0x74    Taiko Drum
0x75    Melodic Tom
0x76    Synth Drum
0x77    Reverse Cymbal

   SOUND EFFECTS
0x78    Guitar Fret Noise
0x79    Breath Noise
0x7A    Seashore
0x7B    Bird Tweet
0x7C    Telephone Ring
0x7D    Helicopter
0x7E    Applause
0x7F    Gunshot (also commonly used as a drum kit)


:Jupiter: Volume
Volume is a simple concept as well, but unlike most of the song arguments, it must be a value less than 0x80, or else (for some whacked out reason) it acts as a rest o.o

It follows 0xBE.

 Panning
I need to investigate panning a little more, but I do believe that 0x00 is the neutral value. Either that, or it's 0x0C. I believe that pan's range is from 0x00 to 0x0F; Atrius, correct me if I'm wrong.

Also, about 0xB1 - if your track doesn't end in it, it will cause the game to crash and make that horrible noise some of us know too well o-o

Blazer

Wow, good stuff.

Thanks for the break down of the data. I felt a little helpless you just giving me stuff and me not knowing how it works...

Regardless, the problem seems to have been in the WAV, when it was converted from 2 channels to 1 channel. I used another one that was only 1 channel, re-inserted data, and it worked perfectly. ^_^

Do you still want me to send you the WAV, in order to fix any possible problems in your program? It's not a huge problem for me, or at least it shouldn't be, but if it helps you/others... well, whatever works I guess. XP

Thanks again to Charon for all the other information and the instrument list. Really useful and helpfull, I seriously appreciate it. ^_^

Successful Blazer is successful.

Charon

I think the only problem with Atrius's editor is that he forgot to mention what the 0x40 byte does at the begining of the WAV (which I know what it does, but others may not) and that for some reason, you need to switch around the 0xCA byte to a 0xAC... all at the beginning.

Blazer

A README could fix the former, and I've never encountered the problem with the latter part. :P

Salanewt

Hello. I am not fully sure if I should post this here, but I might as well...

Do you know how I can tell what an instrument is in a game's audio file? I would look at that neat list, but Superstar Saga uses a different audio format.

Well, thanks for at least reading this.

Have a nice day.
Oh yeah baby, £ me harder.

Fusion is just a cheap tactic to make weak Adepts stronger.

Yoshi's Lighthouse is a hacking website in progress. Why not check it out if you like Yoshi or the Mario & Luigi games?

Atrius (He/Him)

The only way you can tell for sure is by listening to it.
[sprite=220,4,0]I'm shaking my head in general disapproval of everything[/sprite]

Salanewt

That I know, but is there any way to determine which instrument is is, if I do not know which instrument the sound belongs to (like an intrument reference guide or something, since there are several instruments which I am not sure what they are)?

Have a nice day.
Oh yeah baby, £ me harder.

Fusion is just a cheap tactic to make weak Adepts stronger.

Yoshi's Lighthouse is a hacking website in progress. Why not check it out if you like Yoshi or the Mario & Luigi games?

Atrius (He/Him)

By asking someone that knows more about how different instruments sound?  You'd be lucky to even find a list of the song names in the game's data.
[sprite=220,4,0]I'm shaking my head in general disapproval of everything[/sprite]