Swadge 2024 2.0.0
APIs to develop games for the Magfest Swadge
Loading...
Searching...
No Matches
midiData.c File Reference

Macros

#define SAMPLE_NUM_CONV(count, origRate, targetRate)
 
#define SECONDS_CONV(whole, microseconds)
 
#define PITCH_HZ(whole, thousandths)
 

Variables

const midiTimbre_t acousticGrandPianoTimbre
 
const midiTimbre_t squareWaveTimbre
 
const midiTimbre_t sineWaveTimbre
 
const midiTimbre_t triangleWaveTimbre
 
const midiTimbre_t sawtoothWaveTimbre
 
const midiTimbre_t noiseTimbre
 
const midiTimbre_t magfestWaveTimbre
 
const midiTimbre_t magstockWaveTimbre
 
const midiTimbre_t squareHitWaveTimbre
 
const midiTimbre_t noiseHitTimbre
 
const midiTimbre_t colossusTimbre
 
const midiTimbre_t magTimbre
 
const midiTimbre_t festTimbre
 
const midiTimbre_t wilhelmTimbre
 
const midiTimbre_t noriTimbre
 
const midiTimbre_t *const magfestTimbres []
 
const size_t magfestTimbreCount = ARRAY_SIZE(magfestTimbres)
 
const midiTimbre_t defaultDrumkitTimbre
 
const midiTimbre_t donutDrumkitTimbre
 
const midiTimbre_t mmx011Vibraphone
 
const midiTimbre_t mmx017Organ
 
const midiTimbre_t mmx024AcousticGuitar
 
const midiTimbre_t mmx029OverdrivenGuitar
 
const midiTimbre_t mmx030DistortedGuitar
 
const midiTimbre_t mmx036SlapBass
 
const midiTimbre_t mmx038SynthBass
 
const midiTimbre_t mmx048Strings
 
const midiTimbre_t mmx055OrchestraHit
 
const midiTimbre_t mmx062SynthBrass
 
const midiTimbre_t mmx080SquareWave
 
const midiTimbre_t mmx081SawWave
 
const midiTimbre_t mmx082SynthLead
 
const midiTimbre_t mmx083SynthLead2
 
const midiTimbre_t mmx119ReverseCymbal
 
const midiTimbre_t mmxDrumkitTimbre
 
const midiTimbre_t *const mmxTimbres []
 
const uint8_t mmxTimbreMap []
 
const size_t mmxTimbreCount = sizeof(mmxTimbres) / sizeof(*mmxTimbres)
 

Macro Definition Documentation

◆ SAMPLE_NUM_CONV

#define SAMPLE_NUM_CONV ( count,
origRate,
targetRate )
Value:
((count) * (targetRate) / (origRate))

◆ SECONDS_CONV

#define SECONDS_CONV ( whole,
microseconds )
Value:
((whole) * 16384 + (microseconds) * 16384 / 1000000)

◆ PITCH_HZ

#define PITCH_HZ ( whole,
thousandths )
Value:
((whole) << 16 | ((thousandths) * (1 << 16) / 1000))

Variable Documentation

◆ acousticGrandPianoTimbre

const midiTimbre_t acousticGrandPianoTimbre

◆ squareWaveTimbre

const midiTimbre_t squareWaveTimbre
Initial value:
= {
.type = WAVE_SHAPE,
.flags = TF_NONE,
.shape = SHAPE_SQUARE,
.envelope = {
.sustainVol = 1,
.sustainVolVel = 0x200,
},
.name = "Square Wave",
}
@ WAVE_SHAPE
Definition midiPlayer.h:142
@ TF_NONE
No flags.
Definition midiPlayer.h:151
@ SHAPE_SQUARE
A square wave.
Definition swSynth.h:69

◆ sineWaveTimbre

const midiTimbre_t sineWaveTimbre
Initial value:
= {
.type = WAVE_SHAPE,
.flags = TF_NONE,
.shape = SHAPE_SINE,
.envelope = {
.sustainVol = 1,
.sustainVolVel = 0x200,
},
.name = "Sine Wave",
}
@ SHAPE_SINE
A sine wave.
Definition swSynth.h:66

◆ triangleWaveTimbre

const midiTimbre_t triangleWaveTimbre
Initial value:
= {
.type = WAVE_SHAPE,
.flags = TF_NONE,
.shape = SHAPE_TRIANGLE,
.envelope = {
.sustainVol = 1,
.sustainVolVel = 0x200,
},
.name = "Triangle Wave",
}
@ SHAPE_TRIANGLE
A triangle wave.
Definition swSynth.h:68

◆ sawtoothWaveTimbre

const midiTimbre_t sawtoothWaveTimbre
Initial value:
= {
.type = WAVE_SHAPE,
.flags = TF_NONE,
.shape = SHAPE_SAWTOOTH,
.envelope = {
.sustainVol = 1,
.sustainVolVel = 0x200,
},
.name = "Sawtooth Wave",
}
@ SHAPE_SAWTOOTH
A sawtooth wave.
Definition swSynth.h:67

◆ noiseTimbre

const midiTimbre_t noiseTimbre
Initial value:
= {
.type = NOISE,
.flags = TF_NONE,
.envelope = {
.sustainVol = 1,
.sustainVolVel = 0x200,
},
.name = "Noise",
}
@ NOISE
Definition midiPlayer.h:141

◆ magfestWaveTimbre

const midiTimbre_t magfestWaveTimbre
Initial value:
= {
.type = WAVETABLE,
.flags = TF_NONE,
.waveIndex = 0,
.waveFunc = magfestWaveTableFunc,
.envelope = {
.attackTime = MS_TO_SAMPLES(8),
.attackTimeVel = -0x80,
.decayTime = MS_TO_SAMPLES(16),
.decayTimeVel = 0,
.sustainVol = 1,
.sustainVolVel = 0x200,
.releaseTime = MS_TO_SAMPLES(320),
.releaseTimeVel = 0x800,
},
.effects = {
.chorus = 0,
},
.name = "MAGFest Wave",
}
@ WAVETABLE
Samples are generated by sampling a particular wave shape.
Definition midiPlayer.h:139
#define MS_TO_SAMPLES(ms)
Calculate the number of DAC samples in the given number of milliseconds.
Definition midiPlayer.h:108
int8_t magfestWaveTableFunc(uint16_t idx, void *data)
Definition waveTables.c:1895

◆ magstockWaveTimbre

const midiTimbre_t magstockWaveTimbre
Initial value:
= {
.type = WAVETABLE,
.flags = TF_NONE,
.waveIndex = 1,
.waveFunc = magfestWaveTableFunc,
.envelope = {
.attackTime = MS_TO_SAMPLES(8),
.attackTimeVel = -0x80,
.decayTime = MS_TO_SAMPLES(16),
.decayTimeVel = 0,
.sustainVol = 1,
.sustainVolVel = 0x200,
.releaseTime = MS_TO_SAMPLES(320),
.releaseTimeVel = 0x800,
},
.effects = {
.chorus = 0,
},
.name = "MAGStock Wave",
}

◆ squareHitWaveTimbre

const midiTimbre_t squareHitWaveTimbre
Initial value:
= {
.type = WAVE_SHAPE,
.flags = TF_NONE,
.shape = SHAPE_SQUARE,
.envelope = {
.attackTime = 0,
.attackTimeVel = 0,
.decayTime = MS_TO_SAMPLES(125),
.decayTimeVel = 0,
.sustainVol = 0,
.sustainVolVel = 0,
.releaseTime = 0,
.releaseTimeVel = 0,
},
.name = "Square Hit",
}

◆ noiseHitTimbre

const midiTimbre_t noiseHitTimbre
Initial value:
= {
.type = WAVE_SHAPE,
.flags = TF_NONE,
.shape = SHAPE_NOISE,
.envelope = {
.attackTime = 0,
.attackTimeVel = 0,
.decayTime = MS_TO_SAMPLES(125),
.decayTimeVel = 0,
.sustainVol = 0,
.sustainVolVel = 0,
.releaseTime = 0,
.releaseTimeVel = 0,
},
.name = "Noise Hit",
}
@ SHAPE_NOISE
Random noise from a linear feedback shift register.
Definition swSynth.h:70

◆ colossusTimbre

const midiTimbre_t colossusTimbre
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = COLOSSUS_BIN,
},
.loop = 1,
.rate = 8192,
.baseNote = FREQ_C_SHARP_5,
},
.name = "Colossus Roar",
}
#define FREQ_C_SHARP_5
Definition midiNoteFreqs.h:91
@ SAMPLE
Definition midiPlayer.h:140

◆ magTimbre

const midiTimbre_t magTimbre
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = DONUT_MAG_BIN,
},
.loop = 1,
.rate = 8192,
.baseNote = FREQ_A4,
},
.name = "MAG",
}
#define FREQ_A4
Definition midiNoteFreqs.h:75

◆ festTimbre

const midiTimbre_t festTimbre
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = DONUT_FEST_BIN,
},
.loop = 1,
.rate = 8192,
.baseNote = FREQ_A4,
},
.name = "FEST",
}

◆ wilhelmTimbre

const midiTimbre_t wilhelmTimbre
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = WILHELM_BIN,
},
.loop = 0,
.rate = 8192,
.baseNote = FREQ_A4,
},
.name = "Wilhelm",
}

◆ noriTimbre

const midiTimbre_t noriTimbre
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = NORI_2_BIN,
},
.loop = 0,
.rate = 8192,
.baseNote = FREQ_A4,
},
.name = "Nori",
}

◆ magfestTimbres

const midiTimbre_t* const magfestTimbres[]
Initial value:
= {
}
const midiTimbre_t magfestWaveTimbre
Definition midiData.c:98
const midiTimbre_t sawtoothWaveTimbre
Definition midiData.c:77
const midiTimbre_t triangleWaveTimbre
Definition midiData.c:66
const midiTimbre_t magTimbre
Definition midiData.c:195
const midiTimbre_t colossusTimbre
Definition midiData.c:178
const midiTimbre_t noiseTimbre
Definition midiData.c:88
const midiTimbre_t noriTimbre
Definition midiData.c:246
const midiTimbre_t squareWaveTimbre
Definition midiData.c:44
const midiTimbre_t squareHitWaveTimbre
Definition midiData.c:144
const midiTimbre_t wilhelmTimbre
Definition midiData.c:229
const midiTimbre_t festTimbre
Definition midiData.c:212
const midiTimbre_t noiseHitTimbre
Definition midiData.c:161
const midiTimbre_t sineWaveTimbre
Definition midiData.c:55
const midiTimbre_t magstockWaveTimbre
Definition midiData.c:121

◆ magfestTimbreCount

const size_t magfestTimbreCount = ARRAY_SIZE(magfestTimbres)

◆ defaultDrumkitTimbre

const midiTimbre_t defaultDrumkitTimbre
Initial value:
= {
.type = NOISE,
.flags = TF_PERCUSSION,
.percussion = {
.playFunc = defaultDrumkitFunc,
.data = NULL,
},
.envelope = { 0 },
.name = "Swadge Drums 0",
}
int8_t defaultDrumkitFunc(percussionNote_t drum, uint32_t idx, bool *done, uint32_t scratch[4], void *data)
Produces sounds for a standard drumkit according to the General MIDI standard.
Definition drums.c:213
@ TF_PERCUSSION
This timbre plays percussion sounds (percussionNote_t) rather than melodic notes.
Definition midiPlayer.h:153

◆ donutDrumkitTimbre

const midiTimbre_t donutDrumkitTimbre
Initial value:
= {
.type = NOISE,
.flags = TF_PERCUSSION,
.percussion = {
.playFunc = donutDrumkitFunc,
.data = NULL,
},
.envelope = { 0 },
.name = "Donut Swadge Drums",
}
int8_t donutDrumkitFunc(percussionNote_t drum, uint32_t idx, bool *done, uint32_t scratch[4], void *data)
Produces sounds for the drumkit that was included on the King Donut synth swadge.
Definition drums.c:568

◆ mmx011Vibraphone

const midiTimbre_t mmx011Vibraphone
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = SF_MMX_011_VIBRAPHONE_BIN,
},
.loop = 0,
.loopStart = SAMPLE_NUM_CONV(79, 28928, 16384),
.loopEnd = SAMPLE_NUM_CONV(95, 28928, 16384),
.rate = 16384,
.baseNote = FREQ_A_SHARP_5 + (FREQ_B5 - FREQ_A_SHARP_5) / 2,
},
.name = "MMX Bell Synth",
.envelope = {
.attackTime = 0,
.decayTime = SECONDS_CONV(2, 70530),
.sustainVol = 1,
.releaseTime = 0,
},
}
#define SECONDS_CONV(whole, microseconds)
Definition midiData.c:297
#define SAMPLE_NUM_CONV(count, origRate, targetRate)
Definition midiData.c:296
#define FREQ_B5
Definition midiNoteFreqs.h:89
#define FREQ_A_SHARP_5
Definition midiNoteFreqs.h:88

◆ mmx017Organ

const midiTimbre_t mmx017Organ
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = SF_MMX_017_ORGAN_BIN,
},
.loop = 0,
.loopStart = SAMPLE_NUM_CONV(1839, 14336, 16384),
.loopEnd = SAMPLE_NUM_CONV(1903, 14336, 16384),
.rate = 16384,
.baseNote = FREQ_A_SHARP_4,
},
.name = "MMX Organ",
.envelope = {
.attackTime = SECONDS_CONV(0, 1000),
},
}
#define FREQ_A_SHARP_4
Definition midiNoteFreqs.h:76

◆ mmx024AcousticGuitar

const midiTimbre_t mmx024AcousticGuitar
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = SF_MMX_024_ACOUSTIC_GUITAR_BIN,
},
.loop = 0,
.loopStart = SAMPLE_NUM_CONV(559, 37760, 16384),
.loopEnd = SAMPLE_NUM_CONV(671, 37760, 16384),
.rate = 16384,
.baseNote = FREQ_F4,
},
.name = "MMX Acoustic Guitar",
.envelope = {
.attackTime = SECONDS_CONV(0, 1),
.decayTime = SECONDS_CONV(2, 70530),
},
}
#define FREQ_F4
Definition midiNoteFreqs.h:83

◆ mmx029OverdrivenGuitar

const midiTimbre_t mmx029OverdrivenGuitar
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = SF_MMX_029_OVERDRIVEN_GUITAR_BIN,
},
.loop = 0,
.loopStart = SAMPLE_NUM_CONV(1055, 25728, 16384),
.loopEnd = SAMPLE_NUM_CONV(1103, 25728, 16384),
.rate = 16384,
.baseNote = FREQ_C_SHARP_4,
},
.name = "MMX Overdrive Guitar",
.envelope = {
.attackTime = SECONDS_CONV(0, 1000),
},
}
#define FREQ_C_SHARP_4
Definition midiNoteFreqs.h:79

◆ mmx030DistortedGuitar

const midiTimbre_t mmx030DistortedGuitar
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = SF_MMX_030_DISTORTION_GUITAR_BIN,
},
.loop = 0,
.loopStart = SAMPLE_NUM_CONV(1311, 23168, 16384),
.loopEnd = SAMPLE_NUM_CONV(8271, 23168, 16834),
.rate = 16384,
.baseNote = FREQ_E2,
},
.name = "MMX Distortion Guitar",
.envelope = {
.attackTime = SECONDS_CONV(0, 1000),
},
}
#define FREQ_E2
Definition midiNoteFreqs.h:58

◆ mmx036SlapBass

const midiTimbre_t mmx036SlapBass
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = SF_MMX_036_SLAP_BASS_BIN,
},
.loop = 0,
.loopStart = SAMPLE_NUM_CONV(2895, 13440, 16384),
.loopEnd = SAMPLE_NUM_CONV(3119, 13440, 16384),
.rate = 16384,
.baseNote = FREQ_B2,
},
.name = "MMX Slap Bass",
.envelope = {
.attackTime = SECONDS_CONV(0, 1000),
},
}
#define FREQ_B2
Definition midiNoteFreqs.h:53

◆ mmx038SynthBass

const midiTimbre_t mmx038SynthBass
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = SF_MMX_038_SYNTH_BASS_BIN,
},
.loop = 0,
.loopStart = SAMPLE_NUM_CONV(1247, 8960, 16384),
.loopEnd = SAMPLE_NUM_CONV(1391, 8960, 16384),
.rate = 16384,
.baseNote = FREQ_C2,
},
.name = "MMX Synth Bass",
.envelope = {
.attackTime = SECONDS_CONV(0, 1000),
}
}
#define FREQ_C2
Definition midiNoteFreqs.h:54

◆ mmx048Strings

const midiTimbre_t mmx048Strings
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = SF_MMX_048_STRINGS_BIN,
},
.loop = 0,
.loopStart = SAMPLE_NUM_CONV(911, 30720, 16384),
.loopEnd = SAMPLE_NUM_CONV(5711, 30720, 16384),
.rate = 16384,
.baseNote = FREQ_E4,
},
.name = "MMX Strings",
.envelope = {
.attackTime = SECONDS_CONV(0, 1000),
},
}
#define FREQ_E4
Definition midiNoteFreqs.h:82

◆ mmx055OrchestraHit

const midiTimbre_t mmx055OrchestraHit
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = SF_MMX_055_ORCHESTRA_HIT_BIN,
},
.loop = 1,
.rate = 16384,
.baseNote = FREQ_C_SHARP_3,
},
.name = "MMX Orchestra Hit",
.envelope = {
.attackTime = SECONDS_CONV(0, 1000),
},
}
#define FREQ_C_SHARP_3
Definition midiNoteFreqs.h:67

◆ mmx062SynthBrass

const midiTimbre_t mmx062SynthBrass
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = SF_MMX_062_SYNTH_BRASS_BIN,
},
.loop = 0,
.loopStart = SAMPLE_NUM_CONV(4479, 28928, 16384),
.loopEnd = SAMPLE_NUM_CONV(4543, 28928, 16384),
.rate = 16384,
.baseNote = FREQ_A_SHARP_3,
},
.name = "MMX Synth Brass",
.envelope = {
.attackTime = SECONDS_CONV(0, 1000),
},
}
#define FREQ_A_SHARP_3
Definition midiNoteFreqs.h:64

◆ mmx080SquareWave

const midiTimbre_t mmx080SquareWave
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = SF_MMX_080_SQUARE_WAVE_BIN,
},
.loop = 0,
.loopStart = SAMPLE_NUM_CONV(47, 28928, 16384),
.loopEnd = SAMPLE_NUM_CONV(79, 28928, 16384),
.rate = 16384,
.baseNote = FREQ_A_SHARP_5,
},
.name = "MMX Square Wave",
.envelope = {
.attackTime = SECONDS_CONV(0, 1000),
},
}

◆ mmx081SawWave

const midiTimbre_t mmx081SawWave
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = SF_MMX_081_SAWTOOTH_WAVE_BIN,
},
.loop = 0,
.loopStart = SAMPLE_NUM_CONV(47, 13696, 16384),
.loopEnd = SAMPLE_NUM_CONV(5887, 13696, 16384),
.rate = 16384,
.baseNote = FREQ_G3,
},
.name = "MMX Saw Wave",
.envelope = {
.attackTime = SECONDS_CONV(0, 1000),
},
}
#define FREQ_G3
Definition midiNoteFreqs.h:73

◆ mmx082SynthLead

const midiTimbre_t mmx082SynthLead
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = SF_MMX_082_SYNTH_LEAD_BIN,
},
.loop = 0,
.loopStart = SAMPLE_NUM_CONV(47, 87040, 16384),
.loopEnd = SAMPLE_NUM_CONV(111, 87040, 16384),
.rate = 16384,
.baseNote = FREQ_F5,
},
.name = "MMX Synth Lead",
.envelope = {
.attackTime = SECONDS_CONV(0, 1000),
},
}
#define FREQ_F5
Definition midiNoteFreqs.h:95

◆ mmx083SynthLead2

const midiTimbre_t mmx083SynthLead2
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = SF_MMX_083_SYNTH_LEAD_2_BIN,
},
.loop = 0,
.loopStart = SAMPLE_NUM_CONV(47, 12032, 16384),
.loopEnd = SAMPLE_NUM_CONV(79, 12032, 16384),
.rate = 16384,
.baseNote = FREQ_G3,
},
.name = "MMX Synth Lead 2",
.envelope = {
.attackTime = SECONDS_CONV(0, 1000),
},
}

◆ mmx119ReverseCymbal

const midiTimbre_t mmx119ReverseCymbal
Initial value:
= {
.type = SAMPLE,
.flags = TF_NONE,
.sample = {
.config = {
.fIdx = CRASHCYMBAL_BIN,
},
.loop = 0,
.loopStart = SAMPLE_NUM_CONV(2095, 16640, 16384),
.loopEnd = SAMPLE_NUM_CONV(4575, 16640, 16384),
.rate = 16384,
.baseNote = FREQ_C3,
},
.name = "MMX Reverse Cymbal",
.envelope = {
.attackTime = 1 * 16384 + 38032 * 16384 / 100000,
},
}
#define FREQ_C3
Definition midiNoteFreqs.h:66

◆ mmxDrumkitTimbre

const midiTimbre_t mmxDrumkitTimbre
Initial value:
= {
.type = NOISE,
.flags = TF_PERCUSSION,
.percussion = {
.playFunc = mmxDrumkitFunc,
.data = NULL,
},
.envelope = { 0 },
.name = "MMX Drumkit",
}
int8_t mmxDrumkitFunc(percussionNote_t drum, uint32_t idx, bool *done, uint32_t scratch[4], void *data)
Definition drums.c:881

◆ mmxTimbres

const midiTimbre_t* const mmxTimbres[]
Initial value:
= {
}
const midiTimbre_t mmx030DistortedGuitar
Definition midiData.c:391
const midiTimbre_t mmx048Strings
Definition midiData.c:451
const midiTimbre_t mmx080SquareWave
Definition midiData.c:510
const midiTimbre_t mmx055OrchestraHit
Definition midiData.c:471
const midiTimbre_t mmx081SawWave
Definition midiData.c:530
const midiTimbre_t mmx119ReverseCymbal
Definition midiData.c:589
const midiTimbre_t mmx036SlapBass
Definition midiData.c:411
const midiTimbre_t mmx083SynthLead2
Definition midiData.c:569
const midiTimbre_t mmx011Vibraphone
Definition midiData.c:300
const midiTimbre_t mmx024AcousticGuitar
Definition midiData.c:349
const midiTimbre_t mmx062SynthBrass
Definition midiData.c:490
const midiTimbre_t mmx082SynthLead
Definition midiData.c:549
const midiTimbre_t mmx038SynthBass
Definition midiData.c:430
const midiTimbre_t mmx017Organ
Definition midiData.c:325
const midiTimbre_t mmx029OverdrivenGuitar
Definition midiData.c:371

◆ mmxTimbreMap

const uint8_t mmxTimbreMap[]
Initial value:
= {
11, 17, 24, 29, 30, 36, 38, 48, 50, 62, 80, 81, 82, 83, 119,
}

◆ mmxTimbreCount

const size_t mmxTimbreCount = sizeof(mmxTimbres) / sizeof(*mmxTimbres)