From c1bf577ccf95344d1a8b86865fd5d1f68e63dd58 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 17 Jan 2024 00:37:45 -0500 Subject: [PATCH] ESFM: documentation --- doc/4-instrument/fm-esfm.md | 77 +++++++++++++++++++++++++++ doc/7-systems/esfm.md | 101 ++++++++++++++++++++++++++++++++++++ 2 files changed, 178 insertions(+) create mode 100644 doc/4-instrument/fm-esfm.md create mode 100644 doc/7-systems/esfm.md diff --git a/doc/4-instrument/fm-esfm.md b/doc/4-instrument/fm-esfm.md new file mode 100644 index 000000000..50fdec3d8 --- /dev/null +++ b/doc/4-instrument/fm-esfm.md @@ -0,0 +1,77 @@ +# ESFM instrument editor + +the ESFM editor is divided into 6 tabs: + +- **FM**: for controlling the basic parameters of FM sound source. +- **Macros (OP1)**: for macros controlling FM parameters of operator 1. +- **Macros (OP2)**: for macros controlling FM parameters of operator 2. +- **Macros (OP3)**: for macros controlling FM parameters of operator 3. +- **Macros (OP4)**: for macros controlling FM parameters of operator 4. +- **Macros**: for other macros (volume/arp/pitch/pan/noise mode). + +## FM + +ESFM is four-operator, but it is different from the rest of FM chips. + +the concept of an algorithm does not exist in ESFM. instead, modulation routing is arbitrary, with each operator having output level and modulation input parameters. + +these apply to the instrument as a whole: +- **OP4 Noise Mode**: determines the mode used to produce noise in operator 4. + - Normal: noise is disabled. + - Snare: takes the snare noise generation mode from OPL. square + noise. + - HiHat: ring modulates with operator 3 and adds noise. + - Top: ring modulates with operator 3 and double pitch modulation input. + - this mode is not emulated correctly. subject to change! + +these apply to each operator: +- the crossed-arrows button can be dragged to rearrange operators. +- **Amplitude Modulation (AM)**: makes the operator affected by LFO tremolo. +- **Sustain flag (SUS)**: when enabled, value of Sustain Level is in effect. +- **AM Depth (AMD)**: when enabled, LFO tremolo is deeper. +- **Attack Rate (AR)**: determines the rising time for the sound. the bigger the value, the faster the attack (0 to 15). +- **Decay Rate (DR)**: determines the diminishing time for the sound. the higher the value, the shorter the decay. it's the initial amplitude decay rate (0 to 15). +- **Sustain Level (SL)**: determines the point at which the sound ceases to decay and changes to a sound having a constant level. the sustain level is expressed as a fraction of the maximum level (0 to 15). +- **Release Rate (RR)**: determines the rate at which the sound disappears after note off. the higher the value, the shorter the release (0 to 15). + +- **Total Level (TL)**: represents the envelope’s highest amplitude, with 0 being the largest and 63 (decimal) the smallest. a change of one unit is about 0.75 dB. +- **Output Level (OL)**: determines the volume at which the operator will be output. +- **Modulation Input (MI)**: determines how much to take from the previous operator for modulation. + - this controls feedback level in the case of operator 1. +- **Key Scale Level (KSL)**: also known as "Level Scale". determines the degree to which the amplitude decreases according to the pitch. + +![FM ADSR chart](FM-ADSRchart.png) + +- **Key Scale Rate (KSR)**: also known as "Rate Scale". determines the degree to which the envelope execution speed increases according to the pitch. +- **Frequency Multiplier (MULT)**: sets the coarse pitch offset in relation to the note (0 to 15). 0 is -1 octave, 1 is 0 octaves, 2 is 1 octave, 3 is 1 octave 7 semitones, and so on. + - note that values 11, 13 and 14 behave as 10, 12 and 12 respectively. +- **Waveform Select (WS)**: changes the waveform of the operator (0 to 7). +- **Vibrato (VIB)**: makes the operator affected by LFO vibrato. +- **FM Depth (FMD)**: when enabled, vibrato is deeper. + +- **Tune**: sets the coarse tune of the operator. +- **Detune**: sets the fine tune of the operator. + +- **Left (L)**: output on the left channel. +- **Right (R)**: output on the right channel. + +### fixed frequency mode + +each operator has a Fixed Frequency mode. once enabled, the operator runs at the specified frequency regardless of the note. + +## macros + +these macros allow you to control several parameters of FM per tick. + +## OP1-OP4 Macros + +all parameters are listed above. + +## Macros + +- **Volume**: volume sequence. +- **Arpeggio**: pitch sequence. +- **OP4 Noise Mode**: noise mode sequence. +- **Panning**: enables output on left/right channels. +- **Pitch**: fine pitch. + - **Relative**: when enabled, pitch changes are relative to the current pitch. +- **Phase Reset**: restarts all operators and resets the waveform to its start. diff --git a/doc/7-systems/esfm.md b/doc/7-systems/esfm.md new file mode 100644 index 000000000..bd53589a4 --- /dev/null +++ b/doc/7-systems/esfm.md @@ -0,0 +1,101 @@ +# ESS ESFM + +an enhanced version of Yamaha's OPL3, adding many features which weren't present on the original chip, such as 4-op on all channels, coarse/fine detune, per-op panning, envelope delay, noise generator and advanced modulation routing (no more algorithms!). + +the technology was present in many of ESS' sound cards (the ES1xxx series in particular). + +## effects + +- `10xy`: **set AM depth.** + - `x` is the operator from 1 to 4. a value of `0` means "all operators". + - `y` is either `0` (1dB, shallow) or `1` (4.8dB, deep). +- `12xx`: **set operator 1 level.** +- `13xx`: **set operator 2 level.** +- `14xx`: **set operator 3 level.** +- `15xx`: **set operator 4 level.** +- `16xy`: **set multiplier of operator.** + - `x` is the operator (1-4). + - `y` is the new MULT value.. +- `17xy`: **set vibrato depth.** + - `x` is the operator from 1 to 4. a value of `0` means "all operators". + - `y` is either `0` (normal) or `1` (double). +- `19xx`: **set attack of all operators.** +- `1Axx`: **set attack of operator 1.** +- `1Bxx`: **set attack of operator 2.** +- `1Cxx`: **set attack of operator 3.** +- `1Dxx`: **set attack of operator 4.** +- `20xy`: **set panning of operator 1.** + - `x` determines whether to output on left. + - `y` determines whether to output on right. +- `21xy`: **set panning of operator 2.** + - `x` determines whether to output on left. + - `y` determines whether to output on right. +- `22xy`: **set panning of operator 3.** + - `x` determines whether to output on left. + - `y` determines whether to output on right. +- `23xy`: **set panning of operator 4.** + - `x` determines whether to output on left. + - `y` determines whether to output on right. +- `24xy`: **set output level of operator.** + - `x` is the operator from 1 to 4. a value of `0` means "all operators". + - `y` is the value. +- `25xy`: **set modulation input level of operator.** + - `x` is the operator from 1 to 4. a value of `0` means "all operators". + - `y` is the value. +- `26xy`: **set envelope delay of operator.** + - `x` is the operator from 1 to 4. a value of `0` means "all operators". + - `y` is the value. +- `27xx`: **set operator 4 noise mode.** + - `0`: noise off + - `1`: square + noise + - `2`: ring mod from operator 3 + noise + - `3`: ring mod from operator 3 + double pitch modulation input + - note: emulation issues. subject to change! +- `2Axy`: **set waveform of operator.** + - `x` is the operator from 1 to 4. a value of `0` means "all operators". + - `y` is the value. +- `2Exx`: **enable envelope hard reset.** +- `2Fxy`: **set fixed frequency block (octave).** + - `x` is the operator from 1 to 4. + - `y` is the block/octave from 0 to 7. +- `3xyy`: **set fixed frequency f-num.** + - `x` contains operator number and high bits of f-num may be any of the following: + - `0` to `3` for operator 1 + - `4` to `7` for operator 2 + - `8` to `B` for operator 3 + - `C` to `F` for operator 4 + - `y` are the lower bits of f-num. +- `40xx`: **set operator 1 detune.** +- `41xx`: **set operator 1 detune.** +- `42xx`: **set operator 1 detune.** +- `43xx`: **set operator 1 detune.** +- `50xy`: **set AM of operator.** + - `x` is the operator from 1 to 4. a value of `0` means "all operators". + - `y` determines whether AM is on. +- `51xy`: **set SL of operator.** + - `x` is the operator from 1 to 4. a value of `0` means "all operators". + - `y` is the value. +- `52xy`: **set RR of operator.** + - `x` is the operator from 1 to 4. a value of `0` means "all operators". + - `y` is the value. +- `53xy`: **set VIB of operator.** + - `x` is the operator from 1 to 4. a value of `0` means "all operators". + - `y` determines whether VIB is on. +- `54xy`: **set KSL of operator.** + - `x` is the operator from 1 to 4. a value of `0` means "all operators". + - `y` is the value. +- `55xy`: **set SUS of operator.** + - `x` is the operator from 1 to 4. a value of `0` means "all operators". + - `y` determines whether SUS is on. +- `56xx`: **set DR of all operators.** +- `57xx`: **set DR of operator 1.** +- `58xx`: **set DR of operator 2.** +- `59xx`: **set DR of operator 3.** +- `5Axx`: **set DR of operator 4.** +- `5Bxy`: **set KSR of operator.** + - `x` is the operator from 1 to 4. a value of `0` means "all operators". + - `y` determines whether KSR is on. + +## info + +this chip uses the [FM (ESFM)](../4-instrument/fm-esfm.md) instrument editor.