Audio drivers

From NESdev Wiki
Revision as of 20:29, 13 May 2019 by Tepples (talk | contribs) (→‎Pently: ASM6 available)
Jump to navigationJump to search

An audio driver or replayer is a program that runs on a game console to play music. An audio driver for NES reads music sequences and instrument definitions from the ROM and writes to the APU ports, usually once per frame.

Tracker replayers

NSFs exported from FamiTracker and 0CC-FamiTracker contain replayers that can handle all tracker features, but they use a lot of ROM and RAM space and can't handle sound effects.

FamiTracker 0.4.2 replayer (0.4.6 is similar)

  • No sound effect support
  • Size: 245 bytes BSS, 20 bytes zero page, 5547 bytes ROM

Game replayers

Replayers intended for use in games have limits on the instrument, effect, and expansion features they can use. Most can't handle expansions at all, as NES games in an unmodified NES cannot use expansion audio. They usually operate by translating a text export into assembly language data files that are included into the game's source code.

FamiTone2

FamiTone2 by Shiru

  • Notes limited to C-1 through D-6
  • Instrument: volume, arpeggio, and pitch envelopes. Duty envelopes longer than 1 frame unsupported. Pitch limited to accumulated distance of 63 units in each direction. No release phase.
  • No volume column
  • Effects: tempo (Fxx), pattern cut (Dxx), and loop (Bxx) only
  • DPCM for instrument 0 only
  • Limit of 64 instruments, 17 songs, and 16 KiB of DPCM
  • Size: 186 bytes BSS, 3 bytes zero page, 1636 bytes ROM (source: README)

GGSound

GGSound by Gradual Games

  • Full note range
  • Instrument: volume, arpeggio, pitch, and duty envelopes, all looping
  • Effects: tempo (Fxx) and loop (Bxx, must be placed in all patterns) only
  • Size: ? [verify]
  • Compatible with NESASM3, ASM6, and ca65

Pently

Pently by Damian Yerrick

  • Notes limited to A-0 through C-7; changeable at build time
  • Instrument: volume, duty, and (absolute) arpeggio envelopes. Pitch envelopes unsupported. The volume envelope can't loop, and the duty and arpeggio envelopes stop at the end of the volume envelope. No release phase.
  • Volume column limited to 4 levels
  • Effects: vibrato (45x), portamento (3xx), grace note (Sxx and Gxx), legato (change note pitch without restarting envelope), arpeggio (0xy) with 1- or 2-frame arpeggio scheme, tempo, and loop (Bxx)
  • Vibrato and portamento use "linear pitch" model similar to that of 0CC-FamiTracker
  • "Rows per minute" tempo model allows runtime correction for NTSC, PAL, and Dendy
  • No DPCM
  • Limit of 51 instruments, 25 drums, and 255 patterns
  • Size: 32 bytes zero page, 112 bytes BSS, 1918 bytes ROM
  • Some effects are space-intensive and can be disabled at build time through a configuration file to reduce ROM and RAM size. A feature set comparable to FamiTone2 uses 1283 bytes of ROM.
  • Compatible with ca65. In 2019, an experimental ASM6 port was added. Python 3 is used to preprocess the score and generate the RAM map.

The native input format ("Pently score") is inspired by MML and intended to be familiar to users of PPMCK or LilyPond. Conversion from FT text export is through ft2pently by Joshua Hoffman. As Pently score was originally intended for human writability, some features don't map well onto FamiTracker features, requiring manual configuration of ft2pently or manual editing of the Pently score it produces:

  • Pattern start has row granularity, allowing a pattern such as a drum fill to replace the end of another pattern.
  • Pattern length is not fixed, allowing long melodic patterns and short drum loops.
  • Patterns are shared among channels. Use this with delayed pattern start for 2-channel echo.
  • Patterns can be transposed. Use this for parallel fourths, fifths, or octaves, or for gear changes like that in the Mermaids of Atlantis soundtrack.
  • Drum channel instead of noise channel. Drums are played as pairs of sound effects that interrupt a note played on the same channel, making Tim Follin style triangle+noise drums easy.
  • Envelope divided into an attack phase, similar to FT envelopes, and a decay phase with a constant duty and decreasing volume, similar to NerdTracker II envelopes.
  • "Attack track" mode, where the attack phase of a note on MMC5 channel 1 temporarily overrides the note on pulse channel 1. Useful for staccato ostinatos and occasionally 1-channel echo.
  • Automatic conversion doesn't use the newest features (linear portamento and 2-frame arpeggio) due to converter author's unfamiliarity with 0CC-FamiTracker.

Penguin

Penguin by pubby

  • Constant cycle count of 790, allowing use in a raster effect
  • Plays sound effects without using additional cycles
  • Famitracker Exported
  • Allegedly has most features of FamiTone2
  • No DPCM
  • 12 bytes ZP, 86 bytes RAM
  • Music data not particularly size-optimized
  • Sound effects are expensive in terms of size

NSD.Lib

To be written.

Uses linear pitch. Defaults to an uncommon A=442 tuning, though a third party has developed a tuning table generator in Python.

OFGS

Developed by OffGao, who is notorious for having already blocked you on Twitter. To be written.