Skip to content

Instantly share code, notes, and snippets.

Last active Jun 12, 2022
What would you like to do?
Guide on how to use .wav sound effects in GB Studio 3.0 with GBVM. (Made by NalaFala/Yousurname)

.wav Sound Effects Guide for GB Studio 3

This guide is outdated as of v3.1. You can use the built in function instead. Note that .wav sound effects take a considerable amount of space in the ROM.


Once you have your .wav file you want to use ready (4 seconds or less), you have to convert it to 8kHz mono, Unsigned 8-bit PCM (unless it already is in that format) with your preferred audio editor. In Audacity, you can do this with Tracks > Mix Stereo Down to Mono, Tracks > Resample > 8000, and File > Export As WAV and choose "Unsigned 8-bit PCM" where it says "Encoding."

Download the below file and put it into the same folder as your .wav file. You will need Python to run this. To run it, first cd to the directory where is in, then use the command py wav_name.wav where wav_name is the name of your .wav file. A wav_name.c file will be created in this directory.


To insert wav_name.c file into your project, open your project in GB Studio and press Game > Advanced > Eject Engine. Once the assets/engine folder has been created, insert wav_name.c into assets/engine/src/data.


Now, select the scene where you want to play the .wav sound. Add the event named "GBVM Script." Inside the text box, type the command

VM_WAVE_PLAY             FRAMES, ___bank_wav_name, _wav_name, ___size_wav_name

where FRAMES is the amount of frames you want to play the sound for before it can be overridden. If you want to string together multiple sound effects, add a Wait 3.9 seconds event between them.

# This is a modified version of
#!/usr/bin/env python3
import sys
import wave
from pathlib import Path
def main(argv=None):
argv = argv or sys.argv
if len(argv) < 2:
print(" no filename; try --help")
infilename = Path(argv[1])
ident = argv[2] if len(argv) > 2 else str(infilename.with_suffix(''))
if infilename in ('--help', '-h'):
print("usage: SOURCE [IDENTIFIER]")
sHDR = "#pragma bank 255\n\n// Wave file: {:s}\n\nconst void __at(255) __bank_{:s};\nconst unsigned char {:s}[] = {{\n"
sFOOT = "}};\n\nconst void __at(sizeof({:s})) __size_{:s};\n"
sEMIT = "0x{:x}"
sNEW = ",\n"
sNONEW = ","
with, mode="rb") as f:
p = f.getparams()
if (p.nchannels == 1) and (p.sampwidth == 1) and (p.framerate >= 8000) and (p.framerate <= 8192) and (p.comptype == 'NONE'):
with open(str(infilename.with_suffix('.c')), "w") as d:
data = f.readframes(p.nframes)
c = 0
cnt = 0;
flag = False
d.write(sHDR.format(str(infilename), ident, ident))
for i in range(len(data) - len(data) % 32):
c = ((c << 4) | (data[i] >> 4)) & 0xFF
if flag:
cnt += 1
d.write(sNEW if (cnt % 16 == 0) else sNONEW)
flag = not flag
d.write(sFOOT.format(ident, ident))
print("Invalid WAV file format: must be MONO 8KHz (64KBit) PCM")
if __name__=='__main__':
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment