This shows you the differences between two versions of the page.
— |
super_mario_64:custom_music_sequence [2020/11/07 23:37] (current) Tenry created |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Custom music sequence ====== | ||
+ | |||
+ | For Super Mario 64 hacking, there are several ways to create a custom music sequence. | ||
+ | |||
+ | |||
+ | ===== Text file (decomp) ===== | ||
+ | |||
+ | If you are working with the decompilation project, you may write down a music sequence in assembly. The decompilation project provides macros that helps writing music files. See includes/seq_marcos.inc for available commands. | ||
+ | |||
+ | The following code snippet is a short version of the popular Tetris theme. Put this file into the sequences folder (e.g. sound/sequences/us), give it a unique hexadecimal ID in the filename or replace an existing track. Use .s (assembly) for the file extension. In sound/sequences.json you need to choose a sound bank to use. Since this snippet is using instrument 0 only, it works well with most sound banks by default. | ||
+ | |||
+ | <code asm 23_custom_tetris.s> | ||
+ | .include "seq_macros.inc" | ||
+ | .section .rodata | ||
+ | .align 0 | ||
+ | |||
+ | # instruments to use | ||
+ | .eqv INSTR_MELODY, 0 | ||
+ | .eqv INSTR_BASS, 0 | ||
+ | |||
+ | # note values | ||
+ | .eqv WHOLE, 192 | ||
+ | .eqv QUARTER, 48 | ||
+ | .eqv EIGHTH, 24 | ||
+ | .eqv QUARTER_DOTTET, 72 | ||
+ | .eqv HALF, 96 | ||
+ | |||
+ | # note pitches | ||
+ | .eqv A4, 48 | ||
+ | .eqv G4, 46 | ||
+ | .eqv F4, 44 | ||
+ | .eqv E4, 43 | ||
+ | .eqv D4, 41 | ||
+ | .eqv C4, 39 | ||
+ | .eqv B3, 38 | ||
+ | .eqv A3, 36 | ||
+ | .eqv E3, 31 | ||
+ | .eqv D3, 29 | ||
+ | .eqv B2, 26 | ||
+ | .eqv A2, 24 | ||
+ | .eqv E2, 19 | ||
+ | |||
+ | sequence_start: # this label is required at the beginning of the sequence | ||
+ | seq_settempo 125 # in BPM (beats per minute) | ||
+ | seq_setvol 127 # 0..255 | ||
+ | seq_initchannels 0x03 # bitmask; use channel 0 and 1 | ||
+ | |||
+ | seq_startchannel 0, .channel0 # we play melody here | ||
+ | seq_startchannel 1, .channel1 # we play bass here | ||
+ | |||
+ | seq_delay WHOLE * 8 | ||
+ | seq_jump sequence_start # endless loop | ||
+ | |||
+ | seq_end | ||
+ | |||
+ | .channel0: | ||
+ | chan_largenoteson | ||
+ | chan_setvol 127 | ||
+ | chan_setinstr INSTR_MELODY | ||
+ | |||
+ | chan_setlayer 0, .layer_melody1 | ||
+ | chan_delay WHOLE * 4 | ||
+ | |||
+ | chan_setlayer 0, .layer_melody2 | ||
+ | chan_delay WHOLE * 4 | ||
+ | |||
+ | chan_end | ||
+ | |||
+ | .channel1: | ||
+ | chan_largenoteson | ||
+ | chan_setvol 127 | ||
+ | chan_setinstr INSTR_BASS | ||
+ | |||
+ | chan_setlayer 0, .layer_bass1 | ||
+ | chan_delay WHOLE * 4 | ||
+ | |||
+ | chan_setlayer 0, .layer_bass2 | ||
+ | chan_delay WHOLE * 4 | ||
+ | |||
+ | chan_end | ||
+ | |||
+ | .layer_melody1: | ||
+ | layer_note1 E4, QUARTER, 100 | ||
+ | layer_note1 B3, EIGHTH, 100 | ||
+ | layer_note1 C4, EIGHTH, 100 | ||
+ | layer_note1 D4, QUARTER, 100 | ||
+ | layer_note1 C4, EIGHTH, 100 | ||
+ | layer_note1 B3, EIGHTH, 100 | ||
+ | |||
+ | layer_note1 A3, QUARTER_DOTTET, 100 | ||
+ | layer_note1 C4, EIGHTH, 100 | ||
+ | |||
+ | layer_note1 E4, QUARTER, 100 | ||
+ | layer_note1 D4, EIGHTH, 100 | ||
+ | layer_note1 C4, EIGHTH, 100 | ||
+ | layer_note1 B3, QUARTER_DOTTET, 100 | ||
+ | |||
+ | layer_note1 C4, EIGHTH, 100 | ||
+ | layer_note1 D4, QUARTER, 100 | ||
+ | layer_note1 E4, QUARTER, 100 | ||
+ | |||
+ | layer_note1 C4, QUARTER, 100 | ||
+ | layer_note1 A3, QUARTER, 100 | ||
+ | layer_note1 A3, HALF, 100 | ||
+ | |||
+ | layer_end | ||
+ | |||
+ | .layer_melody2: | ||
+ | layer_delay EIGHTH | ||
+ | layer_note1 D4, QUARTER, 100 | ||
+ | layer_note1 F4, EIGHTH, 100 | ||
+ | layer_note1 A4, QUARTER, 100 | ||
+ | layer_note1 G4, EIGHTH, 100 | ||
+ | layer_note1 F4, EIGHTH, 100 | ||
+ | |||
+ | layer_note1 E4, QUARTER_DOTTET, 100 | ||
+ | layer_note1 C4, EIGHTH, 100 | ||
+ | layer_note1 E4, QUARTER, 100 | ||
+ | layer_note1 D4, EIGHTH, 100 | ||
+ | layer_note1 C4, EIGHTH, 100 | ||
+ | |||
+ | layer_note1 B3, QUARTER, 100 | ||
+ | layer_note1 B3, EIGHTH, 100 | ||
+ | layer_note1 C4, EIGHTH, 100 | ||
+ | layer_note1 D4, QUARTER, 100 | ||
+ | layer_note1 E4, QUARTER, 100 | ||
+ | |||
+ | layer_note1 C4, QUARTER, 100 | ||
+ | layer_note1 A3, QUARTER, 100 | ||
+ | layer_note1 A3, QUARTER, 100 | ||
+ | layer_delay QUARTER | ||
+ | |||
+ | layer_end | ||
+ | |||
+ | .layer_bass1: | ||
+ | layer_call .layer_fn_bass_e | ||
+ | layer_call .layer_fn_bass_a | ||
+ | layer_call .layer_fn_bass_e | ||
+ | layer_call .layer_fn_bass_a | ||
+ | layer_end | ||
+ | |||
+ | .layer_bass2: | ||
+ | layer_call .layer_fn_bass_d | ||
+ | layer_call .layer_fn_bass_a | ||
+ | layer_call .layer_fn_bass_e | ||
+ | layer_call .layer_fn_bass_a | ||
+ | layer_end | ||
+ | |||
+ | .layer_fn_bass_e: | ||
+ | layer_loop 4 | ||
+ | layer_note1 E2, EIGHTH, 100 | ||
+ | layer_note1 B2, EIGHTH, 100 | ||
+ | layer_loopend | ||
+ | layer_end | ||
+ | |||
+ | .layer_fn_bass_a: | ||
+ | layer_loop 4 | ||
+ | layer_note1 A2, EIGHTH, 100 | ||
+ | layer_note1 E3, EIGHTH, 100 | ||
+ | layer_loopend | ||
+ | layer_end | ||
+ | |||
+ | .layer_fn_bass_d: | ||
+ | layer_loop 4 | ||
+ | layer_note1 D3, EIGHTH, 100 | ||
+ | layer_note1 A3, EIGHTH, 100 | ||
+ | layer_loopend | ||
+ | layer_end | ||
+ | |||
+ | </code> | ||