This article is outdated
Feel free to update it. Reason given: Add the mechanics Háčky researched
Arbitrary code execution can be used to create custom PCM sound effects (WAV like audio) in the Game Boy Pokémon games. This type of exploit was also previously achieved in MrWint's Pokémon Yellow multi-game TAS.
Note this method is outdated. A newer method was proposed for more accurate sounds.
1) Set up ACE
2) Set up an ACE memory editor
3) Write the following routine at your access point
(This is a modified version of 3C:4000; that plays the first PCM audio at 2:A000 in SRAM)
4) Get a very short music file you want to use as your Pikachu cry (about 1 second long)
5) Use ffmpeg and downgrade the music file to 4-bit uncompressed PCM, 6000hz.
If not familiar, put ffmpeg in the same folder as your music file, open Notepad and write the following;
ffmpeg -i "[original music filename with extension (e.g. .mp3) here]" -ac 1 -ar 6000 -acodec adpcm_ms [desired filename].wav(The pause is optional and is in case there are any errors, otherwise the command prompt will exit automatically. Here there is a new line before pause.)
Save this file as crymaker.bat or anything .bat.
Then, run the .bat file (again it will need to be in the same directory as ffmpeg and your music file).
(Note: This is not the correct file format Game Freak used, but this works)
6) The new .wav file will probably not work properly on some operating systems, but if everything went to plan it will work when you import it in the game. The file size of the wav file should be quite small. You will need to use a hex editor (such as HxD, it's free) to copy all the bytes after the "data" ANSI string (for my example this is at 0x98). Save this somewhere (e.g. Pastebin if you want).
7) Use ACE to write the following at 2:A000; 02 03 a0 (+two more bytes that represent the hexadecimal file size. Use Windows Calculator to take away the end of the file offset and e.g. 0x98 on the hex editor, then add 1 to get the file size. Then swap the digits.
In order to write at 2:A000, if you are using BGB emulator, go into the debugger and double click on DA8C (which is just after opening the SRAM bank in your code), then activate ACE early and BGB should pause. Afterwards you can right click and select "go to...". Enter 2:A000, and select OK to jump there in the debugger. From there you should be able to write those bytes (where otherwise they would likely be unchangable FF bytes due to locked SRAM). It is also possible to write to this region of SRAM without a debugger.
8) At 2:A005 paste the bytes from earlier. Usually, there should be just enough space in SRAM for this (SRAM is A000-BFFF or 8192 bytes). If not, get rid of unneeded groups of 00 bytes in the file and modify the file size in step 7 accordingly.
9) Save the game and reset. Now when you run your code, your custom cry should play.