We've just updated MediaWiki and its underlying software. If anything doesn't look or work quite right, please mention it to us. --RanAS

H-Sound Engine

From SnesLab
Revision as of 21:06, 13 October 2020 by KungFuFurby (talk | contribs) (Adding VCMD documentation below $E0)
Jump to: navigation, search

H-Sound is a sound engine created by Tsutomu Hagiwara of Sol for the SPC700 [1] [2]. The sound driver was used in five games.

Only one version, 0.5, was ever used. However, there are technically three different builds, each with very minor differences:

  • Yuujin no Furi Furi Girls, compared to Kamen Rider SD, has extra valid percussion note slots and a single extra opcode that overwrites the timer value to use at the start, thus almost not even qualifying as a build variant.
  • The other three games, compared to Kamen Rider SD, are missing an optional inversion operation for the echo volume. This is not controlled by a VCMD within the song.
Game Name Build ID VCMD Table Location ($E0 and up) ROM Offset
Kamen Rider SD 1 0x0C3D 0x0C9B91
Yuujin no Furi Furi Girls 2 0x0C45 0x888000
Hisshou Pachi-Slot Fun 3 0x0C69 0x088000
Honkakuha Igo - Gosei 3 0x0C69 0x0C8000
Janyuuki Gokuu Randa 3 0x0C69 0x1D8000

Instrument Format

The instrument format is N-SPC/Kankichi-kun compatible minus noise support for SRCN values above 127.

The instrument format is defined as direct writes to DSP registers for the first four bytes, followed by two pitch-related bytes. They are defined in this order, from top to bottom...

  • SRCN
  • ADSR1
  • ADSR2
  • GAIN
  • Pitch Base Multiplier
  • Pitch Base Fractional Multiplier (in 256ths)

Header Format

Each song's header is a series of eight four byte entries, one per channel. Each entry contains the following bytes in order...

  • Two-byte little endian track pointer
  • Master track ID (Zero for music, non-zero for SFX)
  • Unused byte

Voice Command Format

VCMD ID Description Arguments
$00-$60 Note Length
$61-$71 Invalid Velocity
$72-$79 Velocity
$7A-$7F Quantization
$80-$C7 Note
$C8 Instant Slide To Note
$C9 Tie
$CA-$DF Percussion
$E0 Instrument xx
$E1 Panning xx
$E2 Note Volume xx
$E3 NOP xx
$E4 Pitch Offset xx
$E5 Absolute Transposition xx
$E6 Global Absolute Transposition xx
$E7 Loop Section Start
$E8 Loop Section End xx
$E9 Tempo xx
$EA NOP
$EB Activate Percussion Mode
$EC Echo On
$ED Echo Off
$EE ADSR xx yy
$EF GAIN xx
$F0-$F1 NOP
$F2 Jump xx xx
$F3 Noise Clock xx
$F4 Noise On
$F5 Noise Off
$F6 Key Off On Quantization Elapse Enable
$F7 Key Off On Quantization Elapse Disable
$F8 FIR Coefficient Table ID xx
$F9 Echo Volume xx
$FA Echo Feedback xx
$FB-$FD NOP
$FE End of Song
$FF NOP

Note Length (VCMD $00-$60)

Defines a note length in tempo ticks plus one.

Invalid Velocity (VCMD $61-$71)

These are invalid VCMD IDs. They technically work, just that they read invalid velocity parameters as a side effect.

Velocity (VCMD $72-$79)

Quantization (VCMD $7A-$7F)

Refers to an array that contains a percentage in 256ths for how far along the note to play before keying it off in tempo ticks.

NOTE: This affects all channels due to a bug in its implementation (specifically, there's no indexed loading when calculating the number of ticks before keying off), and it only works when the first channel defines the quantization.

Note (VCMD $80-$C7)

Plays a note and delays the channel for one note length before reading another VCMD.

Instant Slide To Note (VCMD $C8)

Sets up the next note to not be keyed on and instead merely changes the pitch to the next note indicated. Other VCMDs can be processed first prior to the note being defined.

Tie (VCMD $C9)

Continues playing the previous note and delays the channel for one note length before reading another VCMD.

Percussion (VCMD $CA-$DF)

Plays a percussion note. Each percussion note takes up an instrument slot starting at a hardcoded fixed offset, and has a dedicated fixed pitch to play at referred to via a separate table.

TODO VCMD documentation