SatouSynth v0.1.1

Next:   [Contents][Index]

SatouSynth

This manual is for SatouSynth (v0.1.1, 18 August 2025), a high-performance VGM playback and sound chip emulation library written entirely in Common Lisp.

Table of Contents

Short Table of Contents


Next: , Previous: , Up: SatouSynth   [Contents][Index]

1 Introduction

SatouSynth is a high-performance VGM playback and sound chip emulator library written entirely in Common Lisp without using any C bindings. It is based on VGMPlay, and has had been modified to be object-oriented. The goals of SatouSynth are to provide native VGM playback in Common Lisp without bindings to any C library; a cleaned-up and object-oriented version of VGMPlay, redesigned to be a library; and performance on par with its sister Crystal library, YunoSynth.

SatouSynth is designed exclusively for the SBCL implementation of Common Lisp. Additional Common Lisp implementations may be supported in the future, though performance may vary greatly.


1.1 Library Features

Some of the features of SatouSynth include:

  • Rendering of VGM files to PCM.
  • High quality resampling.
  • An extensible mechanism to load compressed VGM files. Built-in compression methods are:
    • GZip-compressed VGM files (.vgz)
    • BZip2-compressed VGMs (.vgb)
    • ZStandard-compressed VGMs (.vgzst)
  • Full GD3 tag support.
  • DAC support.

1.2 Emulated Chips

  • Bandai Wonderswan
  • Capcom DL-1425 QSound
  • General Instruments AY-1-8910 and derivatives
  • Hudson HuC6280 (two different cores)
  • Irem GA20
  • Konami K051649
  • Konami K053260
  • Konami K054539
  • NEC μPD7759
  • Namco C140 / Namco 219 ASIC
  • Namco C352
  • Nintendo GameBoy (DMG)
  • Nintendo NES (APU) and Famicom Disk System
  • Nintendo Virtual Boy (VSU-VUE)
  • OKI MSM6258
  • OKI MSM6295
  • Philips SAA1099
  • Sega 32x PWM
  • Sega MultiPCM
  • Sega SegaPCM
  • Seta X1-010
  • Texas Instruments SN76489 and related
  • Yamaha YM2151 (OPM)
  • Yamaha YM2203 (OPN)
  • Yamaha YM2608 (OPNA)
  • Yamaha YM2610 / YM2610B (OPNB)
  • Yamaha YM2612
  • Yamaha YMZ280B (PCMD8)

Next: , Previous: , Up: SatouSynth   [Contents][Index]

2 Using SatouSynth


2.1 Loading the Library

A small set of dependencies are needed before SatouSynth is loaded. Most of these can be installed using QuickLisp (though this hasn’t been tested).

  • chipz
  • closer-mop
  • zstd

One dependency that cannot be loaded via QuickLisp at the time of writing is CL-SDM. This must be obtained manually and placed somewhere where ASDF can locate it.

Once the dependencies are located, you can load SatouSynth in a REPL by doing the following:

(asdf:load-system :satou)

2.2 Playing a VGM File

Loading and playing a VGM file consists of a few steps: creating a vgm-file instance, creating a vgm-player instance, starting the player, then rendering audio data.

(let* (;; We start by creating a VGM-FILE by calling LOAD-VGM-FILE
       (vgm (satou:load-vgm-file "/path/to/file.vgm"))

       ;; Now we create a VGM-PLAYER that will be used to play
       ;; this file.
       (player (satou:make-vgm-player vgm)))
  ;; Now we start the VGM-PLAYER instance.
  (satou:vgm-player-play player)

  ;; Now we are ready to render audio data.
  )

Once we have our vgm-file loaded, and vgm-player created and playing, we can begin rendering audio data. SatouSynth only renders to single-float, and can either render stereo interleaved data, or render the left and right channels separately. In most cases you will want to render stereo interleaved data. In either case, you will need one or two (vector single-float) buffers to hold the rendered audio data.

Some VGM files have loop information embedded into them, while others are “one-shot” VGM files that only play through once. This is important if you need to determine when to stop playing a VGM file. For example, the music used in the first stage of the arcade game Sunset Riders is designed to loop continuously, and so that VGM has loop information contained within it. However, the music that plays during the stage introduction (the screen where the “Wanted!” poster is shown introducing the boss) is designed just to play once and then stop, and so that VGM does not have any loop information. SatouSynth will automatically loop VGMs that support looping.

Determining when to stop playing can be accomplished by using the vgm-player-times-played function. This is incremented by one each time a VGM file loops, or when a “one-shot” VGM player finishes playing.

Given this information, lets expand our code to create a very simple player that plays a VGM file once; if the VGM has loop information, then it’s played back only one time.

(let* (;; Load the VGM file as before
       (vgm (satou:load-vgm-file filename))

       ;; Create a player that will play the VGM
       (player (satou:make-vgm-player vgm))

       ;; Create a buffer of 256 single-floats that we will render audio
       ;; data into.  This will hold our stereo interleaved data.
       (buf (make-array 256 :element-type 'single-float
                            :initial-element 0.0)))

  ;; Start the player like before
  (satou:vgm-player-play player)

  ;; Now we loop until we've played through the VGM exactly once.
  (loop until (= (satou:vgm-player-times-played player) 1)
        do ;; Render audio data into BUF
           (satou:vgm-player-render player buf)

           ;; Normally we would now do something with the data in BUF.
           ))

Rendering data into a buffer is fine, but usually we want to hear something. So as a final example, we will expand the code to actually play our rendered audio through our speakers using the CL-RemiAudio library via libao. This is a separate library that we are just using for this example, not a dependency of SatouSynth. We will also wrap the player code inside of a function for easier use.

;; Let's make sure CL-RemiAudio's libao driver is loaded
(asdf:load-system :cl-remiaudio-drivers-ao)

;; Create a function that will play VGM files.
(defun play-vgm (filename)
  ;; Initialize CL-RemiAudio's libao driver.  We'll send audio data
  ;; to OUT.
  (cl-ra/drivers:with-driver (:ao)
    (cl-ra/drivers:with-open-device (out :ao)

      ;; Create the VGM-FILE, VGM-PLAYER, and buffer like before
      (let* ((vgm (satou:load-vgm-file filename))
             (player (satou:make-vgm-player vgm))
             (buf (make-array 256 :element-type 'single-float
                                  :initial-element 0.0)))
        ;; Start the player
        (satou:vgm-player-play player)

        ;; Now we loop until we've played through the VGM exactly once.
        (loop until (= (satou:vgm-player-times-played player) 1)
              do ;; Render audio data into BUF
                 (satou:vgm-player-render player buf)

                 ;; Send the rendered audio data to our speakers
                 (cl-ra/drivers:write-buffer out buf))))))

;; Now we can use this function to easily play a VGM file.
(play-vgm #P"/path/to/your/song.vgm")

3 API Reference


3.1 Globals and Constants

Variable: +satousynth-version+

A constant string containing the version of the library.

Variable: *max-allowed-file-size*

A special variable that defines the maximum size of a VGM file (before decompression) that will be loaded.

This variable exists to help prevent bad or malicious files from eating up end users’ RAM. The default size is 100 megabytes, which should be more than enough for any VGM file out there. One of the largest VGMs in the author’s collection, before decompression, is “After Burner (Extended)” from the 32X version of After Burner II, and it’s 11 megabytes.

This won’t totally prevent zip bombs, but it will at least help. API users can tune this to their needs.


3.2 Basic Types

Type: t/output-buffer

A buffer that is used during rendering to contain audio data generated by an emulation core. This is basically an alias for a simple-array that contains two additional simple-arrays representing the left and right channels.

The type is defined as an alias to: (simple-array (simple-array (signed-byte 32) (*)) (2))).

Type: t/chip :sn76489 :ym2413 :ym2612 :ym2151 :sega-pcm :rf5c69 :ym2203 :ym2608 :ym2610 :ym3812 :ym3526 :y8950 :ymf262 :ymf278b :ymf271 :ymz280b :rf5c164 :pwm :ay8910 :dmg :nes-apu :multipcm :upd7759 :oki-m6258 :oki-m6295 :k051649 :k054539 :huc6280 :c140 :k053260 :pokey :qsound :scsp :wonderswan :vsu :saa1099 :es5503 :es5506 :c352 :x1-010 :ga20 :unknown

A symbol that represents an emulated chip.

Function: t/chip->name chip

Returns a basic short name for a t/chip as a string.

Some chips have multiple names associated with their type. For the most accurate name when using a VGM file, instantiating a chip instance and using the chip-short-name (see chip-short-name) generic function will be much more accurate. This is because these names can only be determined after parsing the VGM.

Function: t/chip->long-name chip

Returns a basic long name for a t/chip as a string.

Some chips have multiple names associated with their type. For the most accurate name when using a VGM file, instantiating a chip instance and using the chip-name (see chip-name) generic function will be much more accurate. This is because these names can only be determined after parsing the VGM.

Condition: satou-error

This is the base condition type for all errors that can occur within SatouSynth.

Condition: unsupported-chip-error

A condition that indicates one or more requested chip emulators are unsupported by the library. This is a subclass of satou-error.

This is raised when attempting to play a VGM that uses chips that are not currently supported by SatouSynth. You can use the unsupported-chip-error-chips method to get the list of unsupported chips. This list is also reported when the condition instance is printed.

Generic Function: unsupported-chip-error-chips condition

A list of t/chip symbols that are not supported by SatouSynth.

Condition: vgm-error

A condition that indicates a problem within a VGM file. This is a subclass of satou-error.

Condition: vgm-too-large-error

A condition that indicates a VGM file is too large to load (see *max-allowed-file-size*. This is a subclass of vgm-error.


Next: , Previous: , Up: API Reference   [Contents][Index]

3.3 Miscellaneous Functions

Function: supported-chips

Returns a list of t/chip symbols indicating the chips that are supported by SatouSynth.

Function: unsupported-chips

Returns a list of t/chip symbols indicating the chips that are not yet supported by SatouSynth.

Function: pcm-sample->vgm-sample sample-num sample-rate-div sample-rate-mul

Converts a playback sample number into a VGM file sample number. All parameters must be (signed-byte 64).

Function: vgm-sample->pcm-sample sample-num sample-rate-div sample-rate-mul

Converts a VGM file sample number into a playback sample number. All parameters must be (signed-byte 64).

Function: calc-resampling-values sample-rate vgm

Calculates the resampling values needed so that vgm can be played back at sample-rate. Returns two 32-bit unsigned integer values: the sample rate multiplier, and the sample rate divider.

Function: calc-resampling-values* sample-rate vgm &key playback-rate vgm-sample-rate

Calculates the resampling values needed so that vgm can be played back at sample-rate, using a speed multiplier of playback-rate. If playback-rate is zero (the default), then it acts as a playback rate of 1x.

The sample-rate, playback-rate, and vgm-sample-rate parameters must be 32-bit unsigned integers.

Returns two 32-bit unsigned integer values: the sample rate multiplier, and the sample rate divider.


3.4 VGM Files

VGM is a music format that logs the sound output from various sound chips so that it can be reproduced in a sample-accurate manner. This is accomplished by capturing the commands and data sent from a running program to sound chips, then storing these so that they may be replayed either on real hardware, or through emulators of the original sound chips. SatouSynth only supports emulated sound chips.

Many VGM files store music captured from various arcade, console, and home computer games. There is also a very large number that have been created from scratch to hold original compositions.

The official specification for VGM files can be found at this address: https://vgmrips.net/wiki/VGM_Specification. Some of the documentation found in this section is taken from these specifications, and is under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported license.


3.4.1 VGM File Classes

Class: vgm-file

This class is a virtual representation of a VGM file. You can load a file from disk using the load-vgm-file function (see load-vgm-file).

A VGM file consists of a main header, which mainly contains offsets and clock values; a GD3 tag for metadata; optional c sample data, which may be compressed in various formats, depending on the chips used; and the actual instructions for playback. Some VGM files also have an “extra header”, which is a second header that contains additional clock and volume information.

Class: vgm-file-metaclass

Class precedence list: closer-mop:standard-class

This metaclass is used by the vgm-file-header class to provide additional keywords for slots. Unless you’re wanting to subclass vgm-file-header, you should not need to use this.

Class: vgm-file-metaclass-slot

Class precedence list: closer-mop:standard-direct-slot-definition

This metaclass is used by the vgm-file-header class to provide additional keywords for slots. This one is specifically for direct slots. Unless you’re wanting to subclass vgm-file-header, you should not need to use this.

Class: vgm-file-metaclass-slot/effective

Class precedence list: closer-mop:standard-effective-slot-definition

This metaclass is used by the vgm-file-header class to provide additional keywords for slots. This one is specifically for effective slots. Unless you’re wanting to subclass vgm-file-header, you should not need to use this.

Class: vgm-file-header

Class precedence list: t

The vgm-file-header class contains all of the header values for a VGM file. This includes offsets, clock values, the number of samples, loop information, VGM format version, and many other fields. All functions which access slots of this class are prefixed with vgm-header-.

Class: extra-header-clock

Class precedence list: t

This class stores additional clock information, as found within the “extra headers” field of a VGM file. All functions related to this class are prefixed with extra-header-clock-.

Class: extra-header-volume

Class precedence list: t

This class stores additional volume information, as found within the “extra headers” field of a VGM file. All functions related to this class are prefixed with extra-header-volume-.

Class: extra-header

Class precedence list: t

This class stores the “extra headers” field of a VGM file. All functions related to this class are prefixed with extra-header-.


3.4.2 Basic VGM File Functions

Generic Function: vgm-file-header vgm

Returns the vgm-file-header instance stored in vgm.

Generic Function: vgm-file-gd3 vgm

Returns the gd3-tag instance stored in vgm.

When a VGM file is loaded and does not contain GD3 data, this will still return a gd3-tag, but all of its fields will be blank.

Generic Function: vgm-file-data vgm

Returns the (simple-array (unsigned-byte 8) (*)) containing the raw non-header data stored in vgm.

Generic Function: vgm-file-data-offset vgm

Returns the offset where the raw non-header data is located in the original VGM file that was loaded to produce vgm.

Generic Function: vgm-file-extra-header vgm

Returns the extra-header instance stored in vgm, or nil if there is none.

Generic Function: vgm-file-version vgm

Returns the VGM format version that vgm conforms to.

Function: vgm-file-chip-used-p vgm chip

Returns t if chip (which must be a t/chip symbol) is used in the VGM file, or nil otherwise.

Function: vgm-file-get-chip-clock vgm chip

Returns the clock value, in hertz, for chip as found in the header fields of vgm. If the chip is not used, this will return zero. chip must be a t/chip symbol.

Function: vgm-file-chips-used vgm

Returns a hash table where the keys are t/chip symbols, and the values are the number of instances of that chip that are used in vgm. Chips that are not used do not appear in the returned table.

Function: vgm-file-check-for-unsupported-chips vgm

Checks to see if vgm uses any chips that are currently unsupported by SatouSynth. This returns a list of t/chip symbols for the chips that are unsupported.

Function: vgm-file-total-play-time vgm &optional loops

Calculates the total play time for vgm, in milliseconds. loops is the total number of times the VGM will play through, and is only taken into account of vgm has loop information. It must be at least 1, which is the default (zero would mean “don’t play the VGM even once,” and is thus meaningless).


3.4.3 VGM File Headers

VGM files start with a 256 byte header that contains information such as chip clock speeds, offsets, and flags. It also contains the version of the VGM format of the file. SatouSynth has an almost 1:1 abstraction of this header.

When it comes to the clock values, bit 30 has a special meaning. When this bit is set, it indicates that the VGM expects that chip to be a “dual chip”. Chips that support this flag are: SN76479, YM2413, YM2612, YM2151, YM2203, YM2608, YM2610, YM3812, YM3526, Y8950, YMZ280B, YMF262, YMF278B, YMF271, AY8910, Game Boy DMG, NES APU, MultiPCM, µPD7759, OKIM6258, OKIM6295, K051649, K054539, HuC6280, C140, K053260, Pokey, SCSP, Wonderswan, VSU, SAA1099, ES5503, ES5506, X1-010, C352, and GA20.

Generic Function: vgm-header-version header

Returns the version of the VGM format reported in header.

The version number is coded as a binary coded decimal. For example, version 1.71 is encoded as 0x00000171. The version field is used for backwards compatibility with players, and also defines which fields are present in the header.

Generic Function: vgm-header-sn76489-clock header

Returns the clock value, in hertz, for the SN76489 chip. If this is zero, then the SN76489 is not used by the VGM file.

When bit 31 of the returned value is set, and the “dual chip” bit is also set (bit 30), then it indicates that the VGM expects the T6W28 variant of the SN76489 to be present instead of a normal SN76489. This is used, for example, in VGM files logged from NeoGeo Pocket games.

Generic Function: vgm-header-ym2413-clock header

Returns the clock value, in hertz, for the YM2413 chip. If this is zero, then the YM2413 is not used by the VGM file.

For VGM versions 1.01 and earlier, this may actually be the clock for the YM2151 or YM2612. If the value returned is over 5,000,000, then it must be the clock value for the YM2612.

Generic Function: vgm-header-gd3-offset header

Returns the offset of the GD3 tag relative to where this field is in the header. If this is zero, then the VGM does not contain a GD3 tag.

Generic Function: vgm-header-total-samples header

Returns the total number of samples in the VGM. This is equivalent to how many audio samples are generated per-channel when the VGM is played back and not allowed to loop.

Generic Function: vgm-header-loop-offset header

Returns the the relative offset to the loop point, or zero if there is no loop in the VGM file.

For example, if the data for the one-off introduction segment in a song was in bytes 0x0040 through 0x3FFF of the file, and then the main looping section started at 0x4000, this would contain the value

0x4000 - 0x1C = 0x3FE4

(A value of 0x1C is subtracted here because this header field is located at that byte).

Generic Function: vgm-header-loop-samples header

Returns the number of samples in the loop section of a VGM, or zero if there is no loop. This is equivalent to how many audio samples are generated per-channel when the looping section of a VGM is played back exactly once.

Generic Function: vgm-header-rate header

The rate of recording, in hertz, of the VGM file. This is mainly used for rate scaling on playback, and is typically either 50 for VGMs recorded from PAL systems, or 60 for NTSC systems. Some VGMs set this to zero if rate scaling is not needed. VGM files that follow format version 1.00 will always have a value of zero here.

Generic Function: vgm-header-sn76489-feedback header

Returns the amount of white noise feedback for the SN76489 chip.

Known values are:

0x0003

SN76489, SN94624

0x0006

Used incorrectly by some packs to refer to SN76489A, SN76494, SN76496, and Y204 in combination with the LFSR width value of 16. Should be feedback pattern 0xC and LFSR width of 17. The latter correctly reflects 1 additional bit of latency between shift register and output.

0x0009

Sega Master System 2/Game Gear/Mega Drive (SN76489/SN76496 integrated into Sega VDP chip)

0x000C

SN76489A, SN76494, SN76496, Y204

0x0022

NCR8496, PSSJ3

Generic Function: vgm-header-sn76489-shift-register-width header

Returns the noise feedback shift register width for the SN76480 chip.

Known values are:

15

SN76489, SN94624

16

Sega Master System 2/Game Gear/Mega Drive (SN76489/SN76496 integrated into Sega VDP chip), NCR8496, PSSJ3

17

SN76489A, SN76494, SN76496, Y204

Generic Function: vgm-header-sn76489-flags header

Returns the flags for the SN76480 chip.

bit 0

Frequency 0 is 0x400 (this should set for all chips but the Sega PSG)

bit 1

Output negation flag

bit 2

GameGear stereo on/off (on when bit clear)

bit 3

Clock Divider is divided by 8 when on, or not when off (on when bit clear)

bit 4

XNOR noise mode (for NCR8496/PSSJ-3)

bit 5-7

Reserved (must be zero)

Generic Function: vgm-header-ym2612-clock header

Returns the clock value, in hertz, of the YM2612, or zero if no YM2612 is used in the VGM file.

Note that for VGM versions 1.01 and earlier, the YM2413 clock rate should be used instead if its value is over 5,000,000 (see vgm-header-ym2413-clock).

In VGM file versions 1.51 and later, when bit 31 of the value returned by this function is set, then it indicates that the chip should be the YM3438 variant of the YM2612.

Generic Function: vgm-header-ym2151-clock header

Returns the clock value, in hertz, of the YM2151, or zero if no YM2151 is used in the VGM file.

For VGM versions 1.01 and earlier, if the YM2413 clock rate is greater than zero and less than 5,000,000, then that header value should be used for the clock rate of the YM2151 instead (see vgm-header-ym2413-clock).

For VGM versions 1.51 and later, if bit 31 in the value returned by this function is set, then it indicates the VGM expects the YM2164 variant of the YM2151.

Generic Function: vgm-header-data-offset header

Returns the relative offset to the VGM data stream, i.e. the data that contains the playback instructions.

If this value is 0x0C, then the data offset is actually at absolute offset 0x40.

For VGM versions prior to 1.50, this field should be zero, and the data is expected to start at absolute offset 0x40.

Generic Function: vgm-header-spcm-clock header

Returns the clock value, in hertz, for the Sega PCM chip. This is zero if no Sega PCM chip is used in the VGM.

Generic Function: vgm-header-spcm-interface-reg header

Returns the interface register for the Sega PCM chip. This should be zero if no Sega PCM chip is used.

Generic Function: vgm-header-rf5c69-clock header

Returns the clock value, in hertz, for the RF5C69 chip. This is zero if no RF5C69 chip is used in the VGM.

Generic Function: vgm-header-ym2203-clock header

Returns the clock value, in hertz, for the YM2203 chip. This is zero if no YM2203 chip is used in the VGM.

Generic Function: vgm-header-ym2608-clock header

Returns the clock value, in hertz, for the YM2608 chip. This is zero if no YM2608 chip is used in the VGM.

Generic Function: vgm-header-ym2610-clock header

Returns the clock value, in hertz, for the YM2610 chip. This is zero if no YM2610 chip is used in the VGM.

When bit 31 of the value returned by this function is set, then the VGM expects the YM2610B variant of the chip, otherwise it expects the normal YM2610 variant.

Generic Function: vgm-header-ym3812-clock header

Returns the clock value, in hertz, for the YM3812 chip. This is zero if no YM3812 chip is used in the VGM.

Generic Function: vgm-header-ym3526-clock header

Returns the clock value, in hertz, for the YM3526 chip. This is zero if no YM3526 chip is used in the VGM.

Generic Function: vgm-header-y8950-clock header

Returns the clock value, in hertz, for the Y8950 chip. This is zero if no Y8950 chip is used in the VGM.

Generic Function: vgm-header-ymf262-clock header

Returns the clock value, in hertz, for the YMF262 chip. This is zero if no YMF262 chip is used in the VGM.

Generic Function: vgm-header-ymf278b-clock header

Returns the clock value, in hertz, for the YMF268B chip. This is zero if no YMF268B chip is used in the VGM.

Generic Function: vgm-header-ymf271-clock header

Returns the clock value, in hertz, for the YMF271 chip. This is zero if no YMF271 chip is used in the VGM.

Generic Function: vgm-header-ymz280b-clock header

Returns the clock value, in hertz, for the YMZ278B chip. This is zero if no YMZ278B chip is used in the VGM.

Generic Function: vgm-header-rf5c164-clock header

Returns the clock value, in hertz, for the RF5C164 chip. This is zero if no RF5C164 chip is used in the VGM.

Generic Function: vgm-header-pwm-clock header

Returns the clock value, in hertz, for the Sega PWM chip. This is zero if no Sega PWM chip is used in the VGM.

Generic Function: vgm-header-ay8910-clock header

Returns the clock value, in hertz, for the AY-1-8910 chip. This is zero if no AY-1-8910 chip is used in the VGM.

Generic Function: vgm-header-ay8910-chip-type header

Returns the type/variant of the AY-1-8910 chip that the VGM expects.

The possible values are:

0x00

AY-1-8910

0x01

AY-1-8912

0x02

AY-1-8913

0x03

AY-1-8930

0x04

AY-1-8914

0x10

YM2149

0x11

YM3439

0x12

YMZ284

0x13

YMZ294

Generic Function: vgm-header-ay8910-flags header

Returns various flags for the AY-1-8910 chip, encoded in the bits of the returned value. For additional information, see ay8910.h in the MAME source code.

The default value is 0x01. Other values are:

bit 0

Legacy output

bit 1

Single output

bit 2

Discrete output

bit 3

RAW output

bit 4

YTMxxxx pin 26 (clock divider) is low

bit 5-7

Reserved (must be zero)

Generic Function: vgm-header-ay-ym2203-flags header

Returns various flags for the AY-1-8910 chip that is part of the YM2203, encoded in the bits of the returned value. This is separate from the flags for the normal AY-1-8910.

Generic Function: vgm-header-ay-ym2608-flags header

Returns various flags for the AY-1-8910 chip that is part of the YM2608, encoded in the bits of the returned value. This is separate from the flags for the normal AY-1-8910.

Generic Function: vgm-header-volume-modifier header

A global volume modifier for the entire VGM file. The value returned by this function is not a direct volume modifier, but an encoded value, where 0xC1 is equal to a modifier value of -63, 0x00 is zero, and 0xC0 is 192. However, a decoded value of -63 should be replaced with a value of -64 so that a factor of 0.25 is possible.

To calculate the output volume, use this formula:

Volume = 2^{(DecodedModifier / 0x20)}.

The default is zero, which is equal to a factor of 1, or 100%.

Generic Function: vgm-header-loop-base header

How many times a VGM file should loop before playback ends.

The resulting number of loops that are played is calculated as following:

NumLoops = NumLoopsModified - LoopBase

The Default is 0. Negative numbers are possible.

This field is not used by SatouSynth’s VGM player code.

Generic Function: vgm-header-loop-modifier header

Modifies the number of loops that are played before playback ends. The resulting number of loops that are played is calculated using:

NumLoops = ProgramNumLoops * LoopModifier / 0x10

The default is zero, which is equal to 0x10.

This field is not used by SatouSynth’s VGM player code.

Generic Function: vgm-header-dmg-clock header

Returns the clock value, in hertz, for the DMG chip. This is zero if no DMG chip is used in the VGM.

Generic Function: vgm-header-nes-apu-clock header

Returns the clock value, in hertz, for the NES APU chip. This is zero if no NES APU chip is used in the VGM.

When bit 31 of the value returned by this function is set, then the Famicom Disk System sound add-on is expected to be present and enabled as well.

Generic Function: vgm-header-multi-pcm-clock header

Returns the clock value, in hertz, for the MultiPCM chip. This is zero if no MultiPCM chip is used in the VGM.

Generic Function: vgm-header-upd7759-clock header

Returns the clock value, in hertz, for the µPD7759 chip. This is zero if no µPD7759 chip is used in the VGM.

Generic Function: vgm-header-oki-m6258-clock header

Returns the clock value, in hertz, for the OKI MSM6258 chip. This is zero if no OKI MSM6258 chip is used in the VGM.

Generic Function: vgm-header-oki-m6258-flags header

Additional flags for the OKI MSM6258 chip. The default is zero. Other values are:

bit 0-1

A two-bit value indicating the clock divider to use. A value of zero means a clock divider of 1024, a value of one is a divider of 768, and a divider of 2 or 3 is a divider of 512.

bit 2

3-bit ADPCM when clear, 4-bit ADPCM when set (default is 4-bit, doesn’t work currently)

bit 3

10-bit output when clear, 12-bit output when set

bit 4-7

Reserved (must be zero)

Generic Function: vgm-header-k054539-flags header

Extra flags for the K054539 chip. The default is 0x01. Other values are:

bit 0

Reverse stereo

bit 1

Disable reverb

bit 2

Update at KeyOn

bits 3-7

Reserved (must be zero)

See k054539.h in the MAME source code for more information.

Generic Function: vgm-header-c140-chip-type header

Defines the variant of the C140 chip that the VGM expects to use. Possible values are:

0x00

Namco C140, as found in the Namco System 2 arcade board.

0x00

Namco C140, as found in the Namco System 21 arcade board.

0x00

Namco 219 ASIC, as found in the Namco NA-1 and NA-2 arcade boards.

Generic Function: vgm-header-oki-m6295-clock header

Returns the clock value, in hertz, for the OKI MSM6295 chip. This is zero if no OKI MSM6295 chip is used in the VGM.

Generic Function: vgm-header-k051649-clock header

Returns the clock value, in hertz, for the K051649 chip. This is zero if no K051649 chip is used in the VGM.

Generic Function: vgm-header-k054539-clock header

Returns the clock value, in hertz, for the K054539 chip. This is zero if no K054539 chip is used in the VGM.

When bit 31 of the value returned by this function is set, then the VGM expects the K052539 variant of the chip.

Generic Function: vgm-header-huc6280-clock header

Returns the clock value, in hertz, for the HuC6280 chip. This is zero if no HuC6280 chip is used in the VGM.

Generic Function: vgm-header-c140-clock header

Returns the clock value, in hertz, for the C140 chip. This is zero if no C140 chip is used in the VGM.

Generic Function: vgm-header-k053260-clock header

Returns the clock value, in hertz, for the K052360 chip. This is zero if no K052360 chip is used in the VGM.

Generic Function: vgm-header-pokey-clock header

Returns the clock value, in hertz, for the POKEY chip. This is zero if no POKEY chip is used in the VGM.

Generic Function: vgm-header-qsound-clock header

Returns the clock value, in hertz, for the QSound chip. This is zero if no QSound chip is used in the VGM.

Generic Function: vgm-header-scsp-clock header

Returns the clock value, in hertz, for the SCSP (Saturn Custom Sound Processor, aka YMF292) chip. This is zero if no SCSP chip is used in the VGM.

Generic Function: vgm-header-extra-header-offset header

The relative offset to the “extra header” section. This is zero if there is no “extra header” present.

Generic Function: vgm-header-wonderswan-clock header

Returns the clock value, in hertz, for the Wonderswan chip. This is zero if no Wonderswan chip is used in the VGM.

Generic Function: vgm-header-vsu-clock header

gReturns the clock value, in hertz, for the VSU-VUE chip. This is zero if no VSU-VUE chip is used in the VGM.

Generic Function: vgm-header-saa1099-clock header

Returns the clock value, in hertz, for the SAA1099 chip. This is zero if no SAA1099 chip is used in the VGM.

Generic Function: vgm-header-es5503-clock header

Returns the clock value, in hertz, for the ES5503 chip. This is zero if no ES5503 chip is used in the VGM.

Generic Function: vgm-header-es5506-clock header

Returns the clock value, in hertz, for the ES5506/ES5505 chip. This is zero if no ES5506/ES5505 chip is used in the VGM.

If bit 31 of the value returned by this function is set, then the VGM expects an ES5506 variant of this chip, otherwise it expects the ES5505 variant.

Generic Function: vgm-header-es5503-num-channels header

The number of output channels for the ES5503 chip. Possible values are 1 to 8, and a typical value is 2.

Generic Function: vgm-header-es5506-num-channels header

The number of output channels for the ES5506/ES5505 chip. Possible values are 1 to 4 for the ES5505, and 1 to 8 for the ES5506. A typical value is 1.

Generic Function: vgm-header-c352-clock-div header

Returns the clock divider value for the C352 chip, divided by four.

The value stored in the VGM is divided by four in order to achieve a divider range of 0 to 1020.

Generic Function: vgm-header-x1-010-clock header

Returns the clock value, in hertz, for the X1-010 chip. This is zero if no X1-010 chip is used in the VGM.

Generic Function: vgm-header-c352-clock header

Returns the clock value, in hertz, for the C352 chip. This is zero if no C352 chip is used in the VGM.

Generic Function: vgm-header-ga20-clock header

Returns the clock value, in hertz, for the GA20 chip. This is zero if no GA20 chip is used in the VGM.

Generic Function: vgm-header-mikey-clock header

Returns the clock value, in hertz, for the MIKEY chip. This is zero if no MIKEY chip is used in the VGM.

Generic Function: extra-header-clock-chip-type header

Returns the t/chip of the chip that uses this clock value.

Generic Function: extra-header-clock-value header

Returns the clock value, in hertz.

Generic Function: extra-header-volume-chip-id header

Returns the numeric chip ID of the chip that uses this volume value.

Generic Function: extra-header-volume-flags header

Extra flags for this extra chip volume header. Possible values:

bit 0

When set, then the volume is for the second chip, otherwise it is for the first/primary chip.

bits 1-7

Reserved

Generic Function: extra-header-volume-value header

Returns the volume modification value.

Note that if bit 15 of this value is zero, then this is an absolute volume setting. If bit 15 is 1, then this is a relative volume value, and the chip volume gets multiplied:

NewChipVolume = OrigChipVolume * ((Value & 0x7FFF) / 0x0100)

Generic Function: extra-header-clocks header

A hash table containing the extra-header-clock instances. The keys of this table are t/chip symbols, and the values are a (vector extra-header-clock).

Generic Function: extra-header-volumes header

A hash table containing the extra-header-volume instances. The keys of this table are t/chip symbols, and the values are a (vector extra-header-volume).


Previous: , Up: VGM Files   [Contents][Index]

3.4.4 VGM File Loading

Generic Function: load-vgm-file source &optional hint

Creates a new vgm-file instance by reading from the given source. source can be a pathname, a pathname containing a path, or an open stream. The data in the source may be compressed.

hint can be a keyword which will be passed to the satou/decompression:maybe-decompress method (see satou/decompression::maybe-decompress).

The size of source (in bytes) must be less than or equal to *max-allowed-file-size* before decompression (see *max-allowed-file-size*. If it’s greater, then a vgm-too-large-error will be raised. When this happens, a restart called load-anyway will be active that will allow loading to continue regardless. This restart is in the satou package.

Function: make-vgm-file stream

Creates a new vgm-file instance by reading data from stream. This data must not be compressed. stream must be an open stream, and must able to seek using file-position.

Generic Function: valid-vgm-p source

Checks to see if source is a valid VGM file. source may be a string containing a path, a pathname, or an open stream. If it’s a stream, it must be able to seek using file-position.

The size of source must be less than or equal to *max-allowed-file-size* before decompression (see *max-allowed-file-size*). If it is not, nil is returned.


Next: , Previous: , Up: API Reference   [Contents][Index]

3.5 VGM Compression

SatouSynth is able to load compressed VGM files. These are files that have been compressed in their entirety using one of the methods supported by SatouSynth. These methods (and the suggested file extensions) are:

  • GZip (.vgz)
  • BZip2 (.vgb)
  • ZStandard (.vgzst)

The VGM Specification only lists GZip as a compression scheme. BZip2 and ZStandard were added to SatouSynth because these compress files better, ZStandard decompresses very quickly, and to give users more control over their data.

Here is a table showing some compression results based on a collection of 4493 VGM files:

FormatSize (MB)Size (Bytes)
Uncompressed1126.21209206332
GZip389408244197
GZip + Advdef374392424223
ZStandard343360470153
BZip2336352141578

Note: “GZip + Advdef” means “GZipped, then recompressed using AdvanceCOMP”.

In addition to the above formats, SatouSynth’s decompression system is also extensible. This allows users of the library to extend the supported compression methods without needing to modify SatouSynth directly. This is accomplished using the register function (see satou/decompression::register).


3.5.1 VGM Compression Functions and Types

All functions and types listed below reside in the satou/decompression package.

Type: t/extension-list

A list that only contains simple-strings.

Structure: func-set

Defines a decompression scheme, as well as a list of file extensions commonly associated with the scheme. Normally users do not create instances of func-set directly, but rather use the register function to implicitly create one and register it with the decompression system (see satou/decompression::register).

Function: func-set-p thing

Returns t if thing is a func-set, or nil otherwise.

Function: func-set-extensions func-set

Returns the t/extension-list of common file extensions for the compression scheme defined by func-set. These file extensions should not have the initial dot (e.g., "vgb", not ".vgb").

Function: (setf func-set-extensions) value func-set

Sets the t/extension-list of common file extensions for the compression scheme defined by func-set. These file extensions should not have the initial dot (e.g., "vgb", not ".vgb").

Function: func-set-checker func-set

Returns the function that is called to see if a stream uses the compression scheme defined in func-set.

Function: (setf func-set-checker) value func-set

Sets the function that is called to see if a stream uses the compression scheme defined in func-set. This function must take a single argument, an open stream, and must return a truthy value if the stream can be decompressed by func-set, or nil otherwise. This function must also be sure to rewind the stream to the position it was at before returning.

Function: func-set-decompressor func-set

Returns the function that is called to decompress data from a stream.

Function: (setf func-set-checker) value func-set

Sets the a function that is called to decompress data from a stream. This function must take a single argument, an open stream, and must return a (sdm:memory-stream) that will return decompressed data.

Function: all-known-schemes

Returns all of the identifiers for the currently registered decompression schemes as a list of keyword symbols.

Function: get-func-set ident

Checks to see if identifier is a registered compression scheme. Returns the func-set if it’s a known scheme, or nil otherwise.

Function: register identifier check-fn decomp-fn get-stream-fn &rest extensions

Registers a new method for checking for compressed data, and decompressing that data. identifier can be used to reference the func-set using get-func-set after registering.

extensions must consist entirely of strings, and is a set of file extensions that can be used by get-hint for this compression scheme (see satou/decompression::get-hint). The extensions should not include the leading period, and should be entirely lowercase, e.g. "vgz". extensions cannot contain the string "vgm", regardless of case.

check-fn must be a function that accepts a single argument (an open stream), and returns a generalized boolean indicating whether the stream contains compressed data or not.

decomp-fn must be a function that accepts a single argument (an open stream), and returns an sdm:memory-stream that is ready to be read from, and that contains the decompressed data.

get-stream-fn must be a function that accepts a single argument (an open stream), and returns a stream that can be used for on-the-fly decompression.

Note that identifier cannot be :none.

This may raise a duplicate-func-set-error condition. When it does, a restart called replace-fn-set will be active. When this restart is invoked, then the old information representing the decompression scheme will be replaced with the newly registered information. This restart resides in the satou/decompression package.

Generic Function: maybe-decompress stream &optional hint

Checks to see if stream needs to be decompressed. If it does, this decompresses the stream into RAM. This then returns either an sdm:memory-stream that can be used to read uncompressed data, or the original stream if it was not compressed. stream must support the file-position function.

If hint is provided and is keyword representing a known decompression scheme (see satou/decompression::get-func-set), then that scheme will be tried first to offer a speedup in load times. You can get a hint by using get-hint.

Function: maybe-get-decompression-stream some-stream

Checks to see if some-stream needs to be decompressed. If it does, this returns a new stream that will return decompressed data when something reads from it. If some-stream does not need to be decompressed, then this returns some-stream.

some-stream must support seeking using file-position.

Function: get-hint filename

Looks at the extension of filename using pathname-type and attempts to guess the compression method used on the file (if any). This will return a keyword with its best guess, or nil otherwise.

If a keyword is returned, it will reference one of the registered compression methods (see satou/decompression::get-func-set, see satou/decompression::register). This keyword can then be passed to the maybe-decompress function as its hint parameter for faster checking of the decompression scheme.

This returns nil if it thinks that filename is an uncompressed VGM file.


3.5.2 Custom VGM Decompression Scheme Example

This example registers a new compression scheme, XZ, with SatouSynth. It assumes that you have some package, xz, that allows you to decompress XZ-compressed streams.

;; This will be our "checker function".  It returns T if it's an
;; XZ-compressed file, or NIL otherwise.
(defun xz-compressed-p (stream)
  (let ((buf (make-array 6 :element-type '(unsigned-byte 8)
                           :initial-element 0))
        (pos (file-position stream)))
    ;; Read the first six bytes, then return the file position to where
    ;; it was before reading.
    (unwind-protect
         (read-sequence buf stream)
      (file-position stream pos))

    ;; Check that we have the magic XZ value.
    (and (= (aref buf 0) #xFD)
         (= (aref buf 1) #x37)
         (= (aref buf 2) #x7A)
         (= (aref buf 3) #x58)
         (= (aref buf 4) #x5A)
         (= (aref buf 5) #x00))))

(defun decompress-xz-stream (stream)
  ;; Create an SDM:MEMORY-STREAM.  We'll store the decompressed data in
  ;; DECOMPRESSED.
  (let ((decompressed (make-instance 'sdm:memory-stream)))
    ;; Decompress from STREAM into DECOMPRESSED.
    (xz:decompress-stream stream decompressed)
    ;; Rewind and return
    (file-position decompressed 0)
    decompressed))

(defun get-xz-stream (stream)
  (xz:make-decompressing-stream stream))

;; Register the decompression scheme.  We'll assume that files ending
;; in .vgx or .xz are XZ-compressed.
(register :xz #'xz-compressed-p #'decompress-xz-stream #'get-xz-stream
          "vgx" "xz")

3.6 GD3 Tags

GD3 tags store metadata about VGM files. These are analogous to Vorbis Comments, APE Tags, or ID3v2 tags in other audio formats.

Class: gd3-tag

Class precedence list: t

A virtual representation of a GD3 tag.

Condition: gd3-tag-error

Class precedence list: satou-error, simple-error, simple-condition, error, serious-condition, condition, t

Represents an error with a GD3 tag.

Condition: gd3-tag-error-size-mismatch

Class precedence list: gd3-tag-error, satou-error, simple-error, simple-condition, error, serious-condition, condition, t

A special subtype of gd3-tag-error that indicates an invalid GD3 tag was possibly read because the stream or GD3 data ended early before reaching the reported length of the tag.

Condition: gd3-tag-error-junk-at-end

Class precedence list: gd3-tag-error-size-mismatch, gd3-tag-error, satou-error, simple-error, simple-condition, error, serious-condition, condition, t

A special subtype of gd3-tag-error-size-mismatch that indicates a valid GD3 tag was read, but there was leftover junk data after the GD3 was fully read.

Generic Function: gd3-tag-version tag

Returns the version of the GD3 tag data for tag.

Generic Function: gd3-tag-track-name-en tag

Returns the English name of the song’s title from tag.

Generic Function: gd3-tag-track-name-jp tag

Returns the Japanese name of the song’s title from tag.

Generic Function: gd3-tag-game-name-en tag

Returns the English name of the song’s source game from tag.

Generic Function: gd3-tag-game-name-jp tag

Returns the Japanese name of the song’s source game from tag.

Generic Function: gd3-tag-system-name-en tag

Returns the English name of the song’s source system from tag.

Generic Function: gd3-tag-system-name-jp tag

Returns the Japanese name of the song’s source system from tag.

Generic Function: gd3-tag-author-name-en tag

Returns the English name of the song’s artist from tag.

Generic Function: gd3-tag-author-name-jp tag

Returns the Japanese name of the song’s artist from tag.

Generic Function: gd3-tag-artist-name-en tag

This is just an alias for gd3-tag-author-en.

Generic Function: gd3-tag-artist-name-jp tag

This is just an alias for gd3-tag-author-jp.

Generic Function: gd3-tag-release-date tag

Returns the release date of the song from tag.

Generic Function: gd3-tag-creator tag

Returns the creator of the VGM from tag.

Generic Function: gd3-tag-notes tag

Returns any additional notes for the song from tag.

Function: read-gd3-tag stream

Creates a new gd3-tag instance by reading data from stream, which should already be at the position of the raw GD3 data.

This may raise a gd3-tag-error-size-mismatch or gd3-tag-error-junk-at-end condition if the reported size of the GD3 tag data does not match what was read. When this happens, two restarts will be active:

ignore-difference

This will ignore the difference in size and continue as if there was no error.

return-empty-tag

This will discard what was read and instead return a new gd3-tag instance with empty fields.

These restarts reside in the satou package.


Next: , Previous: , Up: API Reference   [Contents][Index]

3.7 Playing VGM Files

VGM files are played back by first loading a VGM file (see VGM File Loading), then using the vgm-player structure to render audio to a buffer. Audio in SatouSynth is always rendered as single-float values (which are 32-bit floating point in SBCL), and can be stored as either interleaved stereo, or as separate left and right channels.

When playing VGM files, you must always use one player instance per VGM file. Thus, if you need to change songs, you must first create a new vgm-player instance.

Structure: vgm-player

Used to render audio data from vgm-file instances. Use make-vgm-player to construct a new instance.

Function: make-vgm-player vgm &optional settings

Creates a new vgm-player instance that will play the given VGM file, vgm. The settings parameter can be a vgm-player-settings instance, which will be used to control a few settings related to how the new vgm-player instance will play back the VGM.

Before returning, this function will check to see if the given VGM uses any unsupported chips. If it does, this will raise an unsupported-chip-error.

Function: vgm-player-play player &optional low-quality-resampling?

Prepares player to play the VGM file loaded into it by setting up various internal values and tables, then initializing all of the required emulation cores. This must be called before rendering any audio.

When low-quality-resampling? is truthy, then a lower-quality (but faster) resampling method will be used if any resampling is required.

Function: vgm-player-stop player

Stops the VGM player. Technically all this does is set an internal flag to indicate the song is at the end (see vgm-player-at-end-p).

Function: vgm-player-playing-p player

Returns t if vgm-player-play has been called with player, or nil otherwise.

Function: vgm-player-render player left right

Renders stereo audio to left and right. This will always fill the buffers completely.

left and right must both be (vector single-float) instances or a subtype.

Function: vgm-player-render player dest

Renders interleaved stereo audio to dest. This will always fill the buffer completely.

dest must be a (vector single-float) or a subtype.

Function: vgm-player-times-played player

Returns the number of times the VGM has looped. If the VGM has no loop data, then this reaches a value of 1 or greater once it reaches the end of the song.

This is the best function to use to determine when to end a song.

Function: vgm-player-at-end-p player

Returns t if player has reached the end of the VGM file, or nil otherwise.

Note that this value is only set when a VGM has no loop data, or when vgm-player-stop is called.

Function: vgm-player-reset player

Resets player back to its initial state. It does not unload the VGM.

Function: vgm-player-get-chip-names player &optional use-short

Gets a nicely formatted list of chip names and their counts for all of the chips used in the loaded VGM. When use-short is truthy, then the short name is returned for each chip, otherwise the long names are returned.

The format used is simply the chip name when there is only one instance of a chip, or the format <number>x <chip name> when there is one or more instance of a chip.

Function: vgm-player-seek player offset &optional relative

Seeks the VGM file loaded into player. If relative is truthy, then it will go either forward or backward by offset samples, depending on if offset is positive or negative. Otherwise, if relative is nil (the default), then it will seek to an absolute sample.

These samples are “PCM samples”, meaning they are based on the output sample rate, not the native VGM recording rate.

Function: vgm-player-get-chip-names player &optional use-short

Returns a list of all the fancy names for the chips that are used in this VGM. This only returns a valid set after the vgm-player-play has been called.

If short-names is truthy, then the short names are returned for each chip, otherwise their full names are returned.

The format is the same as vgm-player-get-chip-names.

Function: vgm-player-get-chip-names* player

Returns a list of conses where the car of each is a t/chip, and the cdr is the number of chips of that type.

Function: vgm-player-settings player

Returns the vgm-player-settings instance loaded into player.

Function: vgm-player-vgm player

Returns the vgm-file instance loaded into player.

Function: vgm-player-main-volume player

The main output volume of player. All samples are multiplied by this value before being returned by the rendering functions.

This is also setf-able. The value can be any real value, and will be coerced to a single-float internally. Setting this will automatically update the vgm-player-volume-modifier.

Function: vgm-player-volume-modifier player

Returns the calculated global volume modifier value from player. This is automatically calculated based on the loaded chips, and is not the main output volume.

Function: vgm-player-sample-rate player

Returns the output sample rate of player.

Function: vgm-player-min-buffer-size player

Returns the minimum buffer size for player that will be accepted during rendering. This is the total size of the buffer, not per-channel.

Function: vgm-player-samples-per-buffer player

Returns the minimum buffer size for player that will be accepted during rendering. This is the size per-channel, not the total size of the buffer.

Function: vgm-player-play-time player

Returns the number of samples-per-channel rendered so far.

Function: vgm-player-chip-table player

Returns the internal table that contains the actual chip emulators. You should not modify this unless you know exactly what you are doing.


3.7.1 VGM Player Settings

The playback of VGM files can be customized using the vgm-player-settings class. This controls various aspects such as the output sample rate, the emulation core used for various chips, chip options, and more.

Class: vgm-player-settings

Class precedence list: t

A set of settings that controls how VGM files are played back by the vgm-player structure.

Generic Function: settings-sample-rate settings

Returns the target sample rate to use for playback.

This is also setf-able. It must be an unsigned 32-bit integer.

Generic Function: settings-dmg-boost-wave-chan-p settings

When t, then the wave channel on the DMG chip is boosted. When this is nil, then it is not.

This is also setf-able. It must be a boolean.

Generic Function: settings-ym2151-core settings

The emulation core to use for the YM2151 chip.

This is also setf-able. It must be one of the supported YM2151 emulation cores.

Generic Function: settings-huc6280-core settings

The emulation core to use for the HuC6280 chip.

This is also setf-able. It must be one of the supported HuC6280 emulation cores.

Generic Function: settings-ym2612-pseudo-stereo-p settings

When t, and you are using the :mame core for the YM2612, this instructs the chip emulator to update the left/right channels alternatively, creating a nice pseudo-stereo effect

This is also setf-able. It must be a boolean.

Generic Function: vgm-player-settings-dup settings

Creates a deep copy of settings and returns the new instance.


3.8 Chips

All chip emulators in SatouSynth derive from the abstract-chip structure, and this in conjunction with the associated generic functions make up the Chip API. In nearly all cases, if you are only interested in playing VGM files, you do not need to use the Chip API.

Structure: abstract-chip

The abstract-chip structure is the base class for all public-facing emulators. All functions related to this type are prefixed with chip-.

Class: chip-flags

This is the base class for all classes that represent “flags” for the various emulation cores.

Generic Function: make-chip chip-type

Creates a new chip of the given t/chip type. You will still need to initialize the chip using chip-init before using it (see chip-init).

Function: chip-core chip

Returns the selected emulation core for chip.

Generic Function: chip-default-emu-core chip

Returns the default emulation core for chip.

All types that derive from abstract-chip have at least one possible emulation core.

Generic Function: chip-init chip chip-num abs-chip-count vgm playback-sample-rate sampling-mode player-sample-rate &key emu-core flags &allow-other-keys

Initializes chip and various internal values, preparing it for use.

Function: chip-paired-p chip

Whether or not chip is paired with another chip.

An example of a commonly paired chip is the YM2203, which has an internal YM2149 associated with it. This YM2149 is the “paired chip” of the YM2203.

Generic Function: (setf chip-mute-mask) value chip

Sets the mute mask for chip’s channels. The value should be an unsigned integer where the least significant bit is channel one, and so on, where each bit set to 1 means “mute this corresponding channel”.

Generic Function: chip-name

Returns an accurate long name describing the type of chip.

Note that you must call chip-init first for this to return an accurate value, otherwise it will return a generic string. See chip-init

Generic Function: chip-short-name

Returns an accurate short name describing the type of chip.

Function: chip-paired chip

Accesses chip’s “paired chip”. If this chip is not paired, this returns nil.

Generic Function: chip-start chip clock &key flags &allow-other-keys

Starts the emulation core for chip, with the given clock rate.

Some chip emulators require “start flags”, which are passed using the flags parameter. A set of start flags can be retrieved using the chip-start-flags function (see chip-start-flags).

Generic Function: chip-start-flags chip vgm

Gets start flags (a subclass of chip-flags) for chip based on the header values in the given vgm.

Generic Function: chip-reset chip

Resets chip to an initial state.

Generic Function: (setf chip-stereo-mask) value chip

Sets the stereo mask for chip, allowing you to mute the left and/or right channels. The exact meaning of value depends on the type of chip.

Generic Function: chip-type chip

Returns the t/chip type for chip (see t/chip).

Generic Function: chip-update chip outputs start samples

Renders audio data using chip. This will render to each channel in outputs, starting at the offset start and continuing for samples elements. Note that samples does not mean “stereo samples”, but rather indicies into each channel in outputs.

The outputs parameter must be a t/output-buffer (see t/output-buffer)

Generic Function: chip-update-paired chip outputs start samples

Renders audio data using chip’s “paired chip”. If there is no paired chip, this does nothing.

This will render to each channel in outputs, starting at the offset start and continuing for samples elements. Note that samples does not mean “stereo samples”, but rather indicies into each channel in outputs.

The outputs parameter must be a t/output-buffer (see t/output-buffer)

Generic Function: chip-read chip offset

Read internal data from the emulation core within chip at offset. The exact meaning of offset depends on the chip.

Not all chip emulators implement this function.

Generic Function: chip-write chip offset data &optional port

Writes data to the internal emulation core within chip. The exact meaning of offset, data, and port depend on the type of chip.

Generic Function: chip-write-dac chip port command data

Writes DAC data to chip. The exact meaning of port, command, and data depend on the type of chip.

Generic Function: chip-write-ram chip data-start data-length ram-data &key &allow-other-keys)

Writes ram-data, starting at data-start and continuing for data-length elements, to chip.

Generic Function: chip-write-rom chip rom-size data-start data-length rom-data &key &allow-other-keys)

Writes rom-data, starting at data-start and continuing for data-length elements, to chip. The meaning of rom-size depends on the type of chip.

Generic Function: chip-output-volume chip

Returns the output volume of chip.


Up: Chips   [Contents][Index]

3.8.1 Chip Classes

All chip emulators (i.e., subclasses of abstract-chip) are contained within the satou-chips package, and so all names in this section are found in that package. Each chip emulator subclass has one or more emulation cores associated with it, a numeric ID, and a predicate function.

AY-1-8910

Structure: ay8910

A class that emulates an General Instruments AY-1-8910 sound chip and related chips. This was used in a very large number of arcade games, consoles, and home computers.

Supported subtypes are:

  • AY-1-8910
  • AY-1-8912
  • AY-1-8913
  • AY-1-8930
  • YM2149
  • YM3439
  • YMZ284
  • TMZ294
Variable: +chip-id/ay8910+

The numeric ID for the AY-1-8910 emulator.

Type: t/ay8910-core :emu2149

The set of available emulation cores for the AY-1-8910 emulator.

C140

Structure: c140

A class that emulates a Namco C140 sound chip. This was used in various arcade games such as Valkyrie Densetsu.

Variable: +chip-id/c140+

The numeric ID for the C140 emulator.

Type: t/c140-core :mame

The set of available emulation cores for the C140 emulator.

C352

Structure: c352

A class that emulates a Namco C352 sound chip. This was used in various arcade games such as Burning Force and SoulCalibur.

Variable: +chip-id/c352+

The numeric ID for the C352 emulator.

Type: t/c352-core :mame

The set of available emulation cores for the C352 emulator.

DMG

Structure: dmg

A class that emulates a Nintendo Game Boy sound chip.

Variable: +chip-id/dmg+

The numeric ID for the DMG emulator.

Type: t/dmg-core :mame

The set of available emulation cores for the DMG emulator.

ES5503

Structure: es5503

A class that emulates an Ensoniq ES5503 sound chip. This was used in various devices, such as the Apple IIGS.

Variable: +chip-id/es5503+

The numeric ID for the ES5503 emulator.

Type: t/es5503-core :mame

The set of available emulation cores for the ES5503 emulator.

GA20

Structure: ga20

A class that emulates an Irem GA20 sound chip. This was used in various arcade games such as R-Type Leo and Ninja Baseball Bat Man.

Variable: +chip-id/ga20+

The numeric ID for the GA20 emulator.

Type: t/ga20-core :mame

The set of available emulation cores for the GA20 emulator.

HuC6280

Structure: huc6280

A class that emulates the sound portion of a Hudson Soft HuC6280 CPU. This was used in the PC Engine/TurboGrafx-16 and SuperGrafx consoles.

Variable: +chip-id/huc6280+

The numeric ID for the HuC6280 emulator.

Type: t/huc6280-core :ootake

The set of available emulation cores for the HuC6280 emulator.

K051649

Structure: k051649

A class that emulates a Konami K051649 sound chip. This was used in various iterations of the MSX, as well as various arcade games.

Variable: +chip-id/k051649+

The numeric ID for the K051649 emulator.

Type: t/k051649-core :mame

The set of available emulation cores for the K051649 emulator.

K053260

Structure: k053260

A class that emulates a Konami K053260 sound chip. This was used in various arcade games such as Sunset Riders and Thunder Cross II.

Variable: +chip-id/k053260+

The numeric ID for the K053260 emulator.

Type: t/k053260-core :mame

The set of available emulation cores for the K053260 emulator.

K054539

Structure: k054539

A class that emulates a Konami K054539 sound chip. This was used in various arcade games such as X-Men and Lethal Enforcers.

Variable: +chip-id/k054539+

The numeric ID for the K054539 emulator.

Type: t/k054539-core :mame

The set of available emulation cores for the K054539 emulator.

MultiPCM

Structure: multipcm

A class that emulates a Sega MultiPCM sound chip. This was used in various arcade games such as Virtua Racing and Virtual Cop.

Variable: +chip-id/multipcm+

The numeric ID for the MultiPCM emulator.

Type: t/multipcm-core :mame

The set of available emulation cores for the MultiPCM emulator.

NES APU and Famicom Disk System

Structure: nes

A class that emulates the sound chip found in Nintendo Famicom/Nintendo Entertainment System (APU+DMC), as well as the Nintendo Famicom Disk System (FDS).

Variable: +chip-id/nes+

The numeric ID for the NES APU+DMC/FDS emulator.

Type: t/nes-core :nsfplay

The set of available emulation cores for the NES APU+DMC/FDS emulator.

OKI MSM6258

Structure: okimsm6258

A class that emulates an OKI MSM6258 sound chip. This was most prominently used in the Sharp X68000 home computer.

Variable: +chip-id/okumsm6258+

The numeric ID for the OKI MSM6258 emulator.

Type: t/okumsm6258-core :mame

The set of available emulation cores for the OKI MSM6258 emulator.

OKI MSM6295

Structure: oki-msm6295

A class that emulates an OKI MSM6295 sound chip. This was used in a large number of arcade games, including Street Fighter II: Champion Edition and Bad Dudes vs. Dragonninja.

Variable: +chip-id/okumsm6295+

The numeric ID for the OKI MSM6295 emulator.

Type: t/okumsm6295-core :mame

The set of available emulation cores for the OKI MSM6295 emulator.

PWM

Structure: pwm

A class that emulates Sega’s PWM sound chip found in their 32X add-on for the Sega Genesis/Mega Drive.

Variable: +chip-id/pwm+

The numeric ID for the PWM emulator.

Type: t/pwm-core :gens

The set of available emulation cores for the PWM emulator.

QSound DL-1425

Structure: qsound

A class that emulates Capcom’s/QSound’s DL-1425 sound chip. This was used in various arcade games such as Night Warriors: Darkstalker’s Revenge.

Variable: +chip-id/qsound+

The numeric ID for the QSound emulator.

Type: t/qsound-core :ctr

The set of available emulation cores for the QSound emulator.

RF5C614

Structure: rf5c614

A class that emulates the Ricoh RF5C614 sound chip. This was used in the Sega CD add-on for the Sega Genesis/Mega Drive.

Variable: +chip-id/rf5c614+

The numeric ID for the RF5C614 emulator.

Type: t/rf5c614-core :gens

The set of available emulation cores for the RF5C614 emulator.

SAA1099

Structure: saa1099

A class that emulates a Philips SAA1099 sound chip. This was used in various arcade games such as Xor World.

Variable: +chip-id/saa1099+

The numeric ID for the SAA1099 emulator.

Type: t/saa1099-core :mame

The set of available emulation cores for the SAA1099 emulator.

Sega PCM

Structure: segapcm

A class that emulates a Sega PCM sound chip. This was used in various arcade games such as Space Harrier.

Variable: +chip-id/segapcm+

The numeric ID for the segapcm emulator.

Type: t/segapcm-core :mame

The set of available emulation cores for the Sega PCM emulator.

SN76489

Structure: sn76489

A class that emulates a Texas Instruments SN76489 sound chip and related chips. This was used in a large number of arcade games, as well as the Sega Genesis/Mega Drive.

Supported subtypes are:

  • SN76489
  • SN76489A
  • SN76494
  • SN76496
  • SN94624
  • Sega PSG
  • NCR 8496
  • PSSJ-3
Variable: +chip-id/sn76489+

The numeric ID for the SN76489 emulator.

Type: t/sn76489-core :mame

The set of available emulation cores for the SN76489 emulator.

µPD7759

Structure: upd7759

A class that emulates an NEC µPD7759 sound chip. This was used in various arcade games such as Cotton: Fantastic Night Dreams, Riot City, and Aurail.

Variable: +chip-id/upd7759+

The numeric ID for the µPD7759 emulator.

Type: t/upd7759-core :mame

The set of available emulation cores for the µPD7759 emulator.

VSU-VUE

Structure: vsu-vue

A class that emulates Nintendo’s VSU-VUE sound chip. This was used in their Virtual Boy console.

Variable: +chip-id/vsu-vue+

The numeric ID for the VSU-VUE emulator.

Type: t/vsu-vue-core :mednafen

The set of available emulation cores for the VSU-VUE emulator.

Wonderswan

Structure: Wonderswan

A class that emulates the sound chip found in the Bandai Wonderswan.

Variable: +chip-id/wonderswan+

The numeric ID for the Wonderswan emulator.

Type: t/wonderswan-core :in-wsr

The set of available emulation cores for the Wonderswan emulator.

X1-010

Structure: x1-010

A class that emulates a Seta X1-010 sound chip. This was used in various arcade games such as Daioh.

Variable: +chip-id/x1-010+

The numeric ID for the X1-010 emulator.

Type: t/x1-010-core :mame

The set of available emulation cores for the X1-010 emulator.

Y8950

Structure: y8950

A class that emulates a Yamaha Y8950 (OPL) sound chip, also known as MSX-AUDIO. This was used in some MSX variants, as well as various arcade games such as Psycho Soldier and Ikari Warriors.

Variable: +chip-id/y8950+

The numeric ID for the Y8950 emulator.

Type: t/y8950-core :mame

The set of available emulation cores for the Y8950 emulator.

YM2151

Structure: ym2151

A class that emulates a Yamaha YM2151 (OPM) sound chip. This was used in many arcade games, such as Street Fighter II: Champion Edition, as well as other systems such as the Sharp X68000 home computer.

Variable: +chip-id/ym2151+

The numeric ID for the YM2151 emulator.

Type: t/ym2151-core :mame

The set of available emulation cores for the YM2151 emulator.

YM2203

Structure: ym2203

A class that emulates a Yamaha YM2203 (OPN) sound chip. This was used in various arcade games, such as Space Harrier, as well as various home computers such as the NEC PC-88 and PC-98.

Variable: +chip-id/ym2203+

The numeric ID for the YM2203 emulator.

Type: t/ym2203-core :mame

The set of available emulation cores for the YM2203 emulator.

YM2413

Structure: ym2413

A class that emulates a Yamaha YM2413 (OPLL) sound chip. This was used in some arcade games, such as Space Harrier, as well as various MSX variants.

Variable: +chip-id/ym2413+

The numeric ID for the YM2413 emulator.

Type: t/ym2413-core :emu2413

The set of available emulation cores for the YM2413 emulator.

YM2608

Structure: ym2608

A class that emulates a Yamaha YM2608 (OPNA) sound chip. This was used in various arcade games, such as Space Harrier, as well as various home computers such as the NEC PC-88 and PC-98.

Variable: +chip-id/ym2608+

The numeric ID for the YM2608 emulator.

Type: t/ym2608-core :mame

The set of available emulation cores for the YM2608 emulator.

YM2610

Structure: ym2610

A class that emulates a Yamaha YM2610 (OPNB) sound chip. This was used in the SNK NeoGeo platform, as well as various arcade games such as Darius II.

Variable: +chip-id/ym2610+

The numeric ID for the YM2610 emulator.

Type: t/ym2610-core :mame

The set of available emulation cores for the YM2610 emulator.

YM2612

Structure: ym2612

A class that emulates a Yamaha YM2612 (OPN2) sound chip. This was used in the Sega Genesis/Mega Drive home console.

Variable: +chip-id/ym2612+

The numeric ID for the YM2612 emulator.

Type: t/ym2612-core :mame

The set of available emulation cores for the YM2612 emulator.

YM3526

Structure: ym3526

A class that emulates a Yamaha YM3526 (OPL) sound chip. This was used in various arcade games such as Bubble Bobble and Psycho Soldier.

Variable: +chip-id/ym3526+

The numeric ID for the YM3526 emulator.

Type: t/ym3526-core :mame

The set of available emulation cores for the YM3526 emulator.

YM3812

Structure: ym3812

A class that emulates a Yamaha YM3812 (OPL2) sound chip. This was used in the Adlib sound card for IBM PCs, as well as various arcade games such as Vimana and Raiden.

Variable: +chip-id/ym3812+

The numeric ID for the YM3812 emulator.

Type: t/ym3812-core :dosbox

The set of available emulation cores for the YM3812 emulator.

YMF262

Structure: ymf262

A class that emulates a Yamaha YMF262 (OPL3) sound chip. This was used in various sound cards for the IBM PC, some add-ons for the NEC PC-98, as well as some arcade games such as Touki Denshou -Angel Eyes-.

Variable: +chip-id/ymf262+

The numeric ID for the YMF262 emulator.

Type: t/ymf262-core :dosbox

The set of available emulation cores for the YMF262 emulator.

YMZ280B

Structure: ymz280b

A class that emulates a Yamaha YMZ280B (PCMD8) sound chip. This was used in various arcade games, such as DoDonPachi, Cyvern: The Dragon Weapons, and Skull Fang.

Variable: +chip-id/ymz280b+

The numeric ID for the YMZ280B emulator.

Type: t/ymz280b-core :mame

The set of available emulation cores for the YMZ280B emulator.


Next: , Previous: , Up: SatouSynth   [Contents][Index]

Appendix A Concept Index

Jump to:   A   C   D   E   F   G   H   K   M   N   O   P   Q   R   S   U   V   W   X   Y  
Index Entry  Section

A
AY-1-8910: Chip Classes

C
C140: Chip Classes
C352: Chip Classes
Capcom DL-1425 QSound: Chip Classes
chips, emulated: Emulated Chips
compressed VGMs: Library Features

D
dependencies: Loading the Library
DMG: Chip Classes

E
ES5503: Chip Classes

F
Famicom Disk System: Chip Classes
features: Library Features

G
GA20: Chip Classes

H
HuC6280: Chip Classes

K
K051649: Chip Classes
K053260: Chip Classes
K054539: Chip Classes

M
MSX-AUDIO: Chip Classes
MultiPCM: Chip Classes

N
NES APU: Chip Classes

O
OKI MSM6258: Chip Classes
OKI MSM6295: Chip Classes

P
player, basic example: Playing a VGM File
player, full example: Playing a VGM File
PWM: Chip Classes

Q
QSound DL-1425: Chip Classes

R
RF5C614: Chip Classes

S
SAA1099: Chip Classes
Sega PCM: Chip Classes
SN76489: Chip Classes

U
uPD7759, µPD7759: Chip Classes

V
VSU-VUE: Chip Classes

W
Wonderswan: Chip Classes

X
X1-010: Chip Classes

Y
Y8950: Chip Classes
YM2151: Chip Classes
YM2203: Chip Classes
YM2413: Chip Classes
YM2608: Chip Classes
YM2610: Chip Classes
YM2612: Chip Classes
YM3526: Chip Classes
YM3812: Chip Classes
YMF262: Chip Classes
YMZ280B: Chip Classes

Jump to:   A   C   D   E   F   G   H   K   M   N   O   P   Q   R   S   U   V   W   X   Y  

Next: , Previous: , Up: SatouSynth   [Contents][Index]

Appendix B Function Index

Jump to:   (  
A   C   E   F   G   L   M   P   R   S   T   U   V  
Index Entry  Section

(
(setf: VGM Compression Functions and Types
(setf: VGM Compression Functions and Types
(setf: VGM Compression Functions and Types
(setf: Chips
(setf: Chips

A
all-known-schemes: VGM Compression Functions and Types

C
calc-resampling-values: Miscellaneous Functions
calc-resampling-values*: Miscellaneous Functions
chip-core: Chips
chip-default-emu-core: Chips
chip-init: Chips
chip-name: Chips
chip-output-volume: Chips
chip-paired: Chips
chip-paired-p: Chips
chip-read: Chips
chip-reset: Chips
chip-short-name: Chips
chip-start: Chips
chip-start-flags: Chips
chip-type: Chips
chip-update: Chips
chip-update-paired: Chips
chip-write: Chips
chip-write-dac: Chips
chip-write-ram: Chips
chip-write-rom: Chips

E
extra-header-clock-chip-type: VGM File Headers
extra-header-clock-value: VGM File Headers
extra-header-clocks: VGM File Headers
extra-header-volume-chip-id: VGM File Headers
extra-header-volume-flags: VGM File Headers
extra-header-volume-value: VGM File Headers
extra-header-volumes: VGM File Headers

F
func-set-checker: VGM Compression Functions and Types
func-set-decompressor: VGM Compression Functions and Types
func-set-extensions: VGM Compression Functions and Types
func-set-p: VGM Compression Functions and Types

G
gd3-tag-artist-name-en: GD3 Tags
gd3-tag-artist-name-jp: GD3 Tags
gd3-tag-author-name-en: GD3 Tags
gd3-tag-author-name-jp: GD3 Tags
gd3-tag-creator: GD3 Tags
gd3-tag-game-name-en: GD3 Tags
gd3-tag-game-name-jp: GD3 Tags
gd3-tag-notes: GD3 Tags
gd3-tag-release-date: GD3 Tags
gd3-tag-system-name-en: GD3 Tags
gd3-tag-system-name-jp: GD3 Tags
gd3-tag-track-name-en: GD3 Tags
gd3-tag-track-name-jp: GD3 Tags
gd3-tag-version: GD3 Tags
get-func-set: VGM Compression Functions and Types
get-hint: VGM Compression Functions and Types

L
load-vgm-file: VGM File Loading

M
make-chip: Chips
make-vgm-file: VGM File Loading
make-vgm-player: Playing VGM Files
maybe-decompress: VGM Compression Functions and Types
maybe-get-decompression-stream: VGM Compression Functions and Types

P
pcm-sample->vgm-sample: Miscellaneous Functions

R
read-gd3-tag: GD3 Tags
register: VGM Compression Functions and Types

S
settings-dmg-boost-wave-chan-p: VGM Player Settings
settings-huc6280-core: VGM Player Settings
settings-sample-rate: VGM Player Settings
settings-ym2151-core: VGM Player Settings
settings-ym2612-pseudo-stereo-p: VGM Player Settings
supported-chips: Miscellaneous Functions

T
t/chip->long-name: Basic Types
t/chip->name: Basic Types

U
unsupported-chip-error-chips: Basic Types
unsupported-chips: Miscellaneous Functions

V
valid-vgm-p: VGM File Loading
vgm-file-check-for-unsupported-chips: Basic VGM File Functions
vgm-file-chip-used-p: Basic VGM File Functions
vgm-file-chips-used: Basic VGM File Functions
vgm-file-data: Basic VGM File Functions
vgm-file-data-offset: Basic VGM File Functions
vgm-file-extra-header: Basic VGM File Functions
vgm-file-gd3: Basic VGM File Functions
vgm-file-get-chip-clock: Basic VGM File Functions
vgm-file-header: Basic VGM File Functions
vgm-file-total-play-time: Basic VGM File Functions
vgm-file-version: Basic VGM File Functions
vgm-header-ay-ym2203-flags: VGM File Headers
vgm-header-ay-ym2608-flags: VGM File Headers
vgm-header-ay8910-chip-type: VGM File Headers
vgm-header-ay8910-clock: VGM File Headers
vgm-header-ay8910-flags: VGM File Headers
vgm-header-c140-chip-type: VGM File Headers
vgm-header-c140-clock: VGM File Headers
vgm-header-c352-clock: VGM File Headers
vgm-header-c352-clock-div: VGM File Headers
vgm-header-data-offset: VGM File Headers
vgm-header-dmg-clock: VGM File Headers
vgm-header-es5503-clock: VGM File Headers
vgm-header-es5503-num-channels: VGM File Headers
vgm-header-es5506-clock: VGM File Headers
vgm-header-es5506-num-channels: VGM File Headers
vgm-header-extra-header-offset: VGM File Headers
vgm-header-ga20-clock: VGM File Headers
vgm-header-gd3-offset: VGM File Headers
vgm-header-huc6280-clock: VGM File Headers
vgm-header-k051649-clock: VGM File Headers
vgm-header-k053260-clock: VGM File Headers
vgm-header-k054539-clock: VGM File Headers
vgm-header-k054539-flags: VGM File Headers
vgm-header-loop-base: VGM File Headers
vgm-header-loop-modifier: VGM File Headers
vgm-header-loop-offset: VGM File Headers
vgm-header-loop-samples: VGM File Headers
vgm-header-mikey-clock: VGM File Headers
vgm-header-multi-pcm-clock: VGM File Headers
vgm-header-nes-apu-clock: VGM File Headers
vgm-header-oki-m6258-clock: VGM File Headers
vgm-header-oki-m6258-flags: VGM File Headers
vgm-header-oki-m6295-clock: VGM File Headers
vgm-header-pokey-clock: VGM File Headers
vgm-header-pwm-clock: VGM File Headers
vgm-header-qsound-clock: VGM File Headers
vgm-header-rate: VGM File Headers
vgm-header-rf5c164-clock: VGM File Headers
vgm-header-rf5c69-clock: VGM File Headers
vgm-header-saa1099-clock: VGM File Headers
vgm-header-scsp-clock: VGM File Headers
vgm-header-sn76489-clock: VGM File Headers
vgm-header-sn76489-feedback: VGM File Headers
vgm-header-sn76489-flags: VGM File Headers
vgm-header-sn76489-shift-register-width: VGM File Headers
vgm-header-spcm-clock: VGM File Headers
vgm-header-spcm-interface-reg: VGM File Headers
vgm-header-total-samples: VGM File Headers
vgm-header-upd7759-clock: VGM File Headers
vgm-header-version: VGM File Headers
vgm-header-volume-modifier: VGM File Headers
vgm-header-vsu-clock: VGM File Headers
vgm-header-wonderswan-clock: VGM File Headers
vgm-header-x1-010-clock: VGM File Headers
vgm-header-y8950-clock: VGM File Headers
vgm-header-ym2151-clock: VGM File Headers
vgm-header-ym2203-clock: VGM File Headers
vgm-header-ym2413-clock: VGM File Headers
vgm-header-ym2608-clock: VGM File Headers
vgm-header-ym2610-clock: VGM File Headers
vgm-header-ym2612-clock: VGM File Headers
vgm-header-ym3526-clock: VGM File Headers
vgm-header-ym3812-clock: VGM File Headers
vgm-header-ymf262-clock: VGM File Headers
vgm-header-ymf271-clock: VGM File Headers
vgm-header-ymf278b-clock: VGM File Headers
vgm-header-ymz280b-clock: VGM File Headers
vgm-player-at-end-p: Playing VGM Files
vgm-player-chip-table: Playing VGM Files
vgm-player-get-chip-names: Playing VGM Files
vgm-player-get-chip-names: Playing VGM Files
vgm-player-get-chip-names*: Playing VGM Files
vgm-player-main-volume: Playing VGM Files
vgm-player-min-buffer-size: Playing VGM Files
vgm-player-play: Playing VGM Files
vgm-player-play-time: Playing VGM Files
vgm-player-playing-p: Playing VGM Files
vgm-player-render: Playing VGM Files
vgm-player-render: Playing VGM Files
vgm-player-reset: Playing VGM Files
vgm-player-sample-rate: Playing VGM Files
vgm-player-samples-per-buffer: Playing VGM Files
vgm-player-seek: Playing VGM Files
vgm-player-settings: Playing VGM Files
vgm-player-settings-dup: VGM Player Settings
vgm-player-stop: Playing VGM Files
vgm-player-times-played: Playing VGM Files
vgm-player-vgm: Playing VGM Files
vgm-player-volume-modifier: Playing VGM Files
vgm-sample->pcm-sample: Miscellaneous Functions

Jump to:   (  
A   C   E   F   G   L   M   P   R   S   T   U   V  

Next: , Previous: , Up: SatouSynth   [Contents][Index]

Appendix C Variable Index

Jump to:   *   +
Index Entry  Section

*
*max-allowed-file-size*: Globals and Constants

+
+chip-id/ay8910+: Chip Classes
+chip-id/c140+: Chip Classes
+chip-id/c352+: Chip Classes
+chip-id/dmg+: Chip Classes
+chip-id/es5503+: Chip Classes
+chip-id/ga20+: Chip Classes
+chip-id/huc6280+: Chip Classes
+chip-id/k051649+: Chip Classes
+chip-id/k053260+: Chip Classes
+chip-id/k054539+: Chip Classes
+chip-id/multipcm+: Chip Classes
+chip-id/nes+: Chip Classes
+chip-id/okumsm6258+: Chip Classes
+chip-id/okumsm6295+: Chip Classes
+chip-id/pwm+: Chip Classes
+chip-id/qsound+: Chip Classes
+chip-id/rf5c614+: Chip Classes
+chip-id/saa1099+: Chip Classes
+chip-id/segapcm+: Chip Classes
+chip-id/sn76489+: Chip Classes
+chip-id/upd7759+: Chip Classes
+chip-id/vsu-vue+: Chip Classes
+chip-id/wonderswan+: Chip Classes
+chip-id/x1-010+: Chip Classes
+chip-id/y8950+: Chip Classes
+chip-id/ym2151+: Chip Classes
+chip-id/ym2203+: Chip Classes
+chip-id/ym2413+: Chip Classes
+chip-id/ym2608+: Chip Classes
+chip-id/ym2610+: Chip Classes
+chip-id/ym2612+: Chip Classes
+chip-id/ym3526+: Chip Classes
+chip-id/ym3812+: Chip Classes
+chip-id/ymf262+: Chip Classes
+chip-id/ymz280b+: Chip Classes
+satousynth-version+: Globals and Constants

Jump to:   *   +

Previous: , Up: SatouSynth   [Contents][Index]

Appendix D Type Index

Jump to:   A   C   D   E   F   G   H   K   M   N   O   P   Q   R   S   T   U   V   W   X   Y  
Index Entry  Section

A
abstract-chip: Chips
ay8910: Chip Classes

C
c140: Chip Classes
c352: Chip Classes
chip-flags: Chips

D
dmg: Chip Classes

E
es5503: Chip Classes
extra-header: VGM File Classes
extra-header-clock: VGM File Classes
extra-header-volume: VGM File Classes

F
func-set: VGM Compression Functions and Types

G
ga20: Chip Classes
gd3-tag: GD3 Tags
gd3-tag-error: GD3 Tags
gd3-tag-error-junk-at-end: GD3 Tags
gd3-tag-error-size-mismatch: GD3 Tags

H
huc6280: Chip Classes

K
k051649: Chip Classes
k053260: Chip Classes
k054539: Chip Classes

M
multipcm: Chip Classes

N
nes: Chip Classes

O
oki-msm6295: Chip Classes
okimsm6258: Chip Classes

P
pwm: Chip Classes

Q
qsound: Chip Classes

R
rf5c614: Chip Classes

S
saa1099: Chip Classes
satou-error: Basic Types
segapcm: Chip Classes
sn76489: Chip Classes

T
t/ay8910-core: Chip Classes
t/c140-core: Chip Classes
t/c352-core: Chip Classes
t/chip: Basic Types
t/dmg-core: Chip Classes
t/es5503-core: Chip Classes
t/extension-list: VGM Compression Functions and Types
t/ga20-core: Chip Classes
t/huc6280-core: Chip Classes
t/k051649-core: Chip Classes
t/k053260-core: Chip Classes
t/k054539-core: Chip Classes
t/multipcm-core: Chip Classes
t/nes-core: Chip Classes
t/okumsm6258-core: Chip Classes
t/okumsm6295-core: Chip Classes
t/output-buffer: Basic Types
t/pwm-core: Chip Classes
t/qsound-core: Chip Classes
t/rf5c614-core: Chip Classes
t/saa1099-core: Chip Classes
t/segapcm-core: Chip Classes
t/sn76489-core: Chip Classes
t/upd7759-core: Chip Classes
t/vsu-vue-core: Chip Classes
t/wonderswan-core: Chip Classes
t/x1-010-core: Chip Classes
t/y8950-core: Chip Classes
t/ym2151-core: Chip Classes
t/ym2203-core: Chip Classes
t/ym2413-core: Chip Classes
t/ym2608-core: Chip Classes
t/ym2610-core: Chip Classes
t/ym2612-core: Chip Classes
t/ym3526-core: Chip Classes
t/ym3812-core: Chip Classes
t/ymf262-core: Chip Classes
t/ymz280b-core: Chip Classes

U
unsupported-chip-error: Basic Types
upd7759: Chip Classes

V
vgm-error: Basic Types
vgm-file: VGM File Classes
vgm-file-header: VGM File Classes
vgm-file-metaclass: VGM File Classes
vgm-file-metaclass-slot: VGM File Classes
vgm-file-metaclass-slot/effective: VGM File Classes
vgm-player: Playing VGM Files
vgm-player-settings: VGM Player Settings
vgm-too-large-error: Basic Types
vsu-vue: Chip Classes

W
Wonderswan: Chip Classes

X
x1-010: Chip Classes

Y
y8950: Chip Classes
ym2151: Chip Classes
ym2203: Chip Classes
ym2413: Chip Classes
ym2608: Chip Classes
ym2610: Chip Classes
ym2612: Chip Classes
ym3526: Chip Classes
ym3812: Chip Classes
ymf262: Chip Classes
ymz280b: Chip Classes

Jump to:   A   C   D   E   F   G   H   K   M   N   O   P   Q   R   S   T   U   V   W   X   Y