diff --git a/CHANGELOG.md b/CHANGELOG.md index b4df1e8a..866eec63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,31 @@ GitHub are its section here (`tools/release.sh` copies them), so add to ## Unreleased +- **The SM-24 Mono has a patch panel.** Its new PATCH page holds four + cords. Drag a jack from the dock onto a ringed knob (LPF CUT, HPF CUT, + PW, VCO2 PITCH, LVL, MG FREQ), or pick SRC and DEST on a cord row. The + jacks are FENV, AENV and AENV inverted, MG, MG PUL, S&H, NOISE, KBD, VEL, + PRESS, VCO1, VCO2 and VCA OUT. The cords run at audio rate, so VCO2 can + FM the cutoff and the output can feed back into the filter. A patch + with no cords sounds exactly as before. Five new patches show it off + (`patch-*`), with the demo `songs/ms20_patch_bay.py`. + +- **Squelch 33, an acid bassline synth.** A new mono machine built on the + HOT/WET filter the SM-24 Mono used to have: one SAW or SQR oscillator, + CUT, RES, ENV MOD, DECAY, ACCENT and SLIDE. Loud notes (the `!` in a + slabkit seq) are accented: louder, brighter, and a run of them climbs + higher with RES up. Overlapping notes slide. Presets: `classic-squelch`, + `square-bounce`, `wet-scream`, `round-line`; demo `songs/squelch_acid.py`. + +- **SM-24 Mono sounds like an MS-20.** Its LPF MODE gains **K35** and + **OTA**, the early and late MS-20 filters. Bass stays full at any PEAK, + the peak sits on CUT, and both the HPF and LPF resonate up to + self-oscillation. K35 is the default: grittier and lopsided when driven. + OTA is cleaner and sings. HOT and WET are still there for the acid + sound. New presets: `k35-scream`, `k35-round-bass`, `ota-singing-lead`. + A new SM-24 starts from a re-voiced init patch; saved songs and presets + keep their mode and sound as before. + - **A harsh effects pack** (docs/43). - **Octaver** gives one and two octaves down the way analog divider pedals do, with a GLITCH knob to make it chatter, plus an diff --git a/bench/golden/acid.txt b/bench/golden/acid.txt new file mode 100644 index 00000000..e238c495 --- /dev/null +++ b/bench/golden/acid.txt @@ -0,0 +1,5 @@ +# bench goldens for acid: case sha256(f32 L ++ f32 R) [nonharm_db thd_db] +notes 8bc59d45b766ad9007c4db1dbfcdd24b75f1c631ccc33814cc4ea2cc68ca9f61 +velocity b52ab388bda9c4e65b9ebf3b22a557d2771ad44628677afb3fd1ac0e190fccfd +held 35a9aa5abc0a2babbc8df5521f5f2bd9614e162a47bd05b034765f7a33802a9c -76.1 5.5 +high 0cd64ed21d5ec2f2fb40eb5b4fbcf3d60c2435d8efaf6f3f7a79a694ac46c5b1 -48.3 1.5 diff --git a/bench/golden/ms20.txt b/bench/golden/ms20.txt index b0bb8712..c568b5d9 100644 --- a/bench/golden/ms20.txt +++ b/bench/golden/ms20.txt @@ -1,5 +1,5 @@ # bench goldens for ms20: case sha256(f32 L ++ f32 R) [nonharm_db thd_db] -notes a07508ad06ee8723008c3675e0ba735e56105fb80a75298e29acc4df1704d188 -velocity ad9081885f858b343993a2bae2a8933f8152e0db0c9e95a3136cf678511c3859 -held 78fe628e416bc871081d2d1aaaeb60b0df256d812f9314579f7cddebdcfd6ae8 -23.3 -0.8 -high df662da24d2dd7cf90588facedc1e490e6250e35e1621b48657b76468bce0c68 -12.2 0.2 +notes cb771ada7c0d5dde3546729c14c16efa53ee4191994848fccd503cdbe36c67e3 +velocity 8e0cde2f8a794f10a1329f8f17f2ce2742c182977515a8e6ca3dda7acf5fd062 +held 90baac0913232f60198a2b81cae395d4d31eb7cb17e4620418b6cd5026087a15 -50.0 -5.2 +high 0de9e0cb902d5539ae2eff6c17697f52e0c239fc3122aab1a3a93a5db79f56d3 -30.1 -13.7 diff --git a/docs/14-ms20-machine.md b/docs/14-ms20-machine.md index aa8430ec..2740f09a 100644 --- a/docs/14-ms20-machine.md +++ b/docs/14-ms20-machine.md @@ -10,6 +10,72 @@ Scope call: **no full semi-modular patch bay.** We implement the MS-20's *hardwired* routing (MG/EG→pitch, MG→cutoff, EG→cutoff/VCA, PWM, ring) with fixed intensity controls. A general routing matrix can come later. +## K35 and OTA: the MS-20's own filters (2026-10-21) + +HOT and WET sound acid: a TB-303, not an MS-20. Their loop subtracts a +clipped, 18 Hz high-passed copy of the lowpass from the input. That is the +ladder structure (the 303 even has the high-pass in its loop). Measured +with a numpy port of `ms20_lpf.fy` at CUT 500 Hz and a quiet input: + +- PEAK costs 16 dB of bass at its old default (0.7), and 22–25 dB at the + acid presets. +- The peak sits 1.5–2.2 octaves above CUT. +- The peak moves about 0.7 octave with input level, which is the rubbery + squelch. +- The slope is −8 to −11 dB/oct. + +Stinchcombe's study of the MS-10/MS-20 filters +([MS20_study.pdf](http://www.timstinchcombe.co.uk/synth/MS20_study.pdf)) +gives both hardware generations LP = 1/(s² + (a − k)s + 1) and +HP = s²/(same). Here a = 2⅓ for the Korg35 Sallen-Key and 2 for the +LM13600 OTA pair. So the DC gain doesn't depend on PEAK, the cutoff +doesn't move, and the slope is 12 dB/oct. +`kernels/04-filters/ms20_sk.fy` implements it as **MODE K35** and +**MODE OTA**. HOT and WET stay as they were. + +``` +v = x − (a + g)·s1 − s2 +bp-lin = (g·h·v + s1) / (1 − g·h·k) h = 1/(1 + a·g + g²) +fb = vd·tanh(k·bp-lin / vd) feedback diodes +u = vf·(tanh((drive·x + fb)/vf + fo) − tanh fo) +TPT SVF with base damping a → hp, bp, lp +``` + +- **K35:** the diodes sit in the forward amplifier (vf 0.55), so loud + input distorts every frequency. A small offset (fo 0.12) makes the + resonance lopsided: the self-oscillation's 2nd harmonic is −37 to + −46 dB. Both are Stinchcombe §4–5. +- **OTA:** the feedback diodes set the peak and the forward stage is soft + (vf 1.6), so the passband stays clean at normal DRIVE. The + self-oscillation is symmetric (2nd harmonic below −115 dB). +- **Both filters resonate.** In these modes the HPF is the same core with + its own PEAK. The series HPF → LPF pair runs at 4× between `up4` and + `dec4`, and both cutoffs stop at 15 kHz (Korg's spec). +- **PEAK taper:** k = a·(1 − u²) with u = 1 − (PEAK/2)/0.9, rising + linearly past 90%. This is a design choice, not a measured pot. A linear + pot repeats the 2026-09-26 OTA probe's "resonance invisible until the + top" (+1 dB at noon). This taper gives +6 dB at noon, and + self-oscillation from 1.82 of 2. + +Measured through the voice in the bench, with noise in (CUT 500 Hz, HPF +1 kHz): + +| | K35 | OTA | +|---|---|---| +| bass at 60 Hz, PEAK 0 → 2, small signal | −0.2 … +0.4 dB | −0.1 … +0.2 dB | +| peak position, PEAK ≥ 1.4 | within 0.02 oct of CUT | within 0.02 oct | +| slope, 2 → 3 octaves past the corner | −10.7 … −11.8 dB/oct | −11.2 … −12.1 dB/oct | +| peak at PEAK 1 (noon) | +6.4 dB | +8.1 dB | +| peak, quiet → loud input, PEAK 1.75 | 23.5 → 8.3 dB | 32.5 → 15.3 dB | +| HPF peak position / slope | within 0.04 oct / +11.5 … +12.6 | within 0.04 oct / +11.3 … +12.7 | +| default notes, non-harmonic energy | −31 … −41 dB (HOT −18 … −22) | −31 … −42 dB | +| cost, ReleaseFast, held note | ~2× HOT (≈ 350 vs 184 ns/smp) | same | + +K35 is the default for new instances. The init patch was re-voiced +because CUT now means the corner: 1200 Hz, PEAK 1, ENV 2 octaves, +filter decay 0.3 s, sustain 0.2. The acid pair is kept, both here and in +`ms20_lpf.fy` for a future acid machine. + ## LPF v3: the June probe's driven SVF, in fy (2026-09-27) The reference is `scratch/ms20_saw_filter_sweeps_f-hot.wav`, rendered by @@ -285,3 +351,67 @@ hatch) is a good early proof. 7. Panel: declare the strips (docs/15); custom ADSR cell. 8. Global spilling (durable follow-up) to optionally collapse hot stages back inline; polyphony via a higher-order voice-pool machine (docs/15). + +## Squelch 33: the acid filter's own synth (2026-10-22) + +HOT/WET stayed in the SM-24 Mono, and the same kernel (`ms20_lpf.fy`, +unchanged) now also drives `machines/acid`, a 303-style mono voice in +`kernels/06-voices/acid_voice.fy`: one VCO (saw, or a square with a +little of the ramp on its tops), the LPF at 4x, a decay-only MEG with +ENV MOD (5 octaves at full), a VCA that decays over 3 s and closes in +8 ms on key-up. + +- **Accent** is velocity over 0.8. An accented note runs a second MEG + at the 200 ms minimum decay; that envelope pushes the VCA directly + (x[1 + 1.2 ACC]) and feeds the accent RC (15 ms, 60 ms at full RES), + whose output adds 4 octaves x level to the cutoff. With RES up the RC + does not empty between notes, so accents in a row stack. +- **Slide**: a note that overlaps the last (`ctx.legato`) glides on an + RC covering 3 time constants in SLIDE, and retriggers nothing. + +Measured (slabkit renders, A1 lines, 120-128 BPM): + +| | target | result | +|---|---|---| +| accent level | +4..6 dB | +4.3..5.3 dB at RES 0.3, +3.3..4.6 at 0.9 | +| accent attack centroid | brighter | +40% at RES 0.3, +20% at 0.9 | +| accent stacking, 3 in a row | climbs at high RES | +15% at RES 0.9, +5% at 0.3 | +| fundamental loss, RES 0 -> 1 | the acid thinning | -13 dB HOT, -13.4 dB WET | +| loudest partial, CUT 400 | 1.5-2 oct up | 654 Hz HOT, 785 Hz WET | +| slide 60 ms | lands in ~60 ms | ~50-60 ms, no retrigger | +| preset loudness on a line | -20 dB RMS +-1 | -20.0 .. -19.6 | +| cost | | 233 ns/sample ReleaseFast | + +## The patch panel (2026-10-22) + +Four cords, evaluated every sample in the voice (`ms20-bay`, +`ms20-cord-to` in `kernels/06-voices/ms20_voice_probe.fy`), declared to +the panel the way Concoction's matrix is (docs/15 §Modulation): controls +`ms20-c1-src` / `-dst` / `-amt` ... `ms20-c4-*`, `mod-source` jacks in the +dock, `mod-dest` rings, the normalled routes (ENV and MG to LPF CUT, EG +and MG to PITCH, MG to PW) as fixed rows, a PATCH page with the dock, +the CORDS matrix display and a scope. + +- **Jacks** are an array in the voice state (`jk`), one per SRC option, + stored each sample and read by a runtime index, which sees the state + as the word found it: every source arrives one sample late. That is + what lets VCA OUT go back into the filter without a zero-delay loop. +- **Destinations** and their range at AMT 1: PITCH and VCO2 +-2 + octaves, PW +-0.45, HPF CUT and LPF CUT +-5 octaves (KBD at AMT 0.2 + tracks the keyboard 1:1), VCA gain +-1, MG FREQ +-4 octaves, FLT IN the + source as audio at the mixer's level, ahead of both filters. +- **Free when empty.** The bay sits behind `bay-on` (a cord with SRC and + DEST set), the per-sample HPF coefficients behind `bay-hpf`; both are + versioned `ifte`s, and every unpatched path adds exact zeros, so all + goldens stay bit-exact. VCO1's wave became a select so the voice fits + fy's 32 versioned bodies (VCO2 wave 4 x MODE 2 x 2 x 2); past that the + bay if-converted and cost 609 ns/sample unpatched. +- Cost, ReleaseFast: 413 ns/sample unpatched, 470 with a cord. + +Measured on a held C3 (K35, CUT 600, PEAK 1, ENV 0): MG -> LPF CUT 0.3 +triples the centroid's swing (66 -> 190 Hz); MG -> PITCH 0.05 gives +vibrato; AENV -> VCA -0.5 takes 6 dB off; VCO2 a fifth up -> LPF CUT +0.3 doubles the centroid (418 -> 866 Hz) at audio rate; VCA OUT -> FLT IN +0.8 stays bounded (peak -6.9 dBFS). The `patch-*` presets sit at -21 to +-22 dB RMS on a bassline (the vowel patch, a band-pass, -22 two octaves +up). diff --git a/docs/20-machine-reference.md b/docs/20-machine-reference.md index 9fe5068d..6e8f1aee 100644 --- a/docs/20-machine-reference.md +++ b/docs/20-machine-reference.md @@ -8,6 +8,7 @@ project or preset stores (docs/19): real units for knobs, the option | id | name | kind | voices | prefix | |---|---|---|---|---| +| [`acid`](#acid) | Squelch 33 | instrument | mono | `—` | | [`bass`](#bass) | Fretwire | instrument | 4 | `bs-` | | [`concoction`](#concoction) | Concoction | instrument | 8 | `cn-` | | [`cream`](#cream) | Mog Passenger | instrument | mono | `cr-` | @@ -51,6 +52,31 @@ project or preset stores (docs/19): real units for knobs, the option | [`verb2`](#verb2) | Verb | effect | — | `verb-` | | [`wob2`](#wob2) | Wobble | effect | — | `wob-` | +## acid + +**Squelch 33**, instrument, mono. + +| param | section | label | range | default | notes | +|---|---|---|---|---|---| +| `tune` | VCO | TUNE | -12 … 12 | 0 | linear | +| `wave` | VCO | WAVE | 0 SAW / 1 SQR | 0 | switch | +| `cutoff` | VCF | CUT | 30 … 8000 | 260 | exp | +| `resonance` | VCF | RES | 0 … 1 | 0.6 | linear | +| `env-mod` | VCF | ENV | 0 … 1 | 0.5 | linear | +| `decay` | VCF | DEC | 0.2 … 2 | 0.5 | exp | +| `accent` | PLAY | ACC | 0 … 1 | 0.7 | linear | +| `slide` | PLAY | SLIDE | 0.02 … 0.3 | 0.06 | exp | +| `drive` | DRIVE | DRV | 0.25 … 4 | 1 | exp | +| `mode` | DRIVE | MODE | 0 HOT / 1 WET | 0 | switch | +| `level` | OUT | LVL | 0 … 1 | 0.68 | pow | + +Presets: + +- `classic-squelch` — Saw, RES high, a medium sweep: accents bark and stack +- `round-line` — Low RES and little sweep: a round bassline under a mix +- `square-bounce` — Square, short decay, moderate RES: a hollow rubbery line +- `wet-scream` — WET mode driven, RES near the top: screaming accents + ## bass **Fretwire**, instrument, 4 voices. @@ -964,11 +990,11 @@ Presets: | `noise-level` | MIX | NOISE | 0 … 1 | 0 | pow | | `hpf-cutoff` | HPF | CUT | 20 … 15000 | 20 | exp | | `hpf-resonance` | HPF | PEAK | 0 … 2 | 0 | linear | -| `cutoff` | LPF | CUT | 20 … 18000 | 700 | exp | -| `resonance` | LPF | PEAK | 0 … 2 | 0.7 | linear | +| `cutoff` | LPF | CUT | 20 … 18000 | 1200 | exp | +| `resonance` | LPF | PEAK | 0 … 2 | 1 | linear | | `drive` | LPF | DRV | 0.25 … 4 | 1 | exp | -| `lpf-mode` | LPF | MODE | 0 HOT / 1 WET | 0 | switch | -| `env-amount` | LPF | ENV | 0 … 8 | 4.8 | linear | +| `lpf-mode` | LPF | MODE | 0 HOT / 1 WET / 2 K35 / 3 OTA | 2 | switch | +| `env-amount` | LPF | ENV | 0 … 8 | 2 | linear | | `level` | VCA | LVL | 0 … 1 | 0.44 | pow | | `age` | VCA | AGE | 0 … 1 | 0.4 | linear | | `amp-hold` | AMP ENV | HOLD | 0 … 20 | 0 | pow | @@ -978,8 +1004,8 @@ Presets: | `amp-release` | AMP ENV | REL | 0.01 … 10 | 0.13 | exp | | `filter-delay` | FLT ENV | DLY | 0 … 10 | 0 | pow | | `filter-attack` | FLT ENV | ATK | 0.001 … 10 | 0.014 | exp | -| `filter-decay` | FLT ENV | DEC | 0.01 … 10 | 0.14 | exp | -| `filter-sustain` | FLT ENV | SUS | 0 … 1 | 0.18 | linear | +| `filter-decay` | FLT ENV | DEC | 0.01 … 10 | 0.3 | exp | +| `filter-sustain` | FLT ENV | SUS | 0 … 1 | 0.2 | linear | | `filter-release` | FLT ENV | REL | 0.01 … 10 | 0.11 | exp | | `mg-freq` | MG | FREQ | 0.1 … 20 | 3 | exp | | `mg-wave` | MG | WAVE | 0 … 1 | 0.5 | linear | @@ -988,16 +1014,36 @@ Presets: | `mg-cutoff` | MOD | MG>CUT | 0 … 4 | 0 | pow | | `eg-pitch` | MOD | EG>PIT | 0 … 1 | 0 | pow | | `portamento` | MOD | PORTA | 0 … 10 | 0 | pow | +| `ms20-c1-src` | CORD 1 | SRC | 0 OFF / 1 FENV / 2 AENV / 3 AENV- / 4 MG / 5 MG PUL / 6 S&H / 7 NOISE / 8 KBD / 9 VEL / 10 PRESS / 11 VCO1 / 12 VCO2 / 13 VCA OUT | 0 | switch | +| `ms20-c1-dst` | CORD 1 | DEST | 0 OFF / 1 PITCH / 2 VCO2 / 3 PW / 4 HPF CUT / 5 LPF CUT / 6 VCA / 7 MG FREQ / 8 FLT IN | 0 | switch | +| `ms20-c1-amt` | CORD 1 | AMT | -1 … 1 | 0 | linear | +| `ms20-c2-src` | CORD 2 | SRC | 0 OFF / 1 FENV / 2 AENV / 3 AENV- / 4 MG / 5 MG PUL / 6 S&H / 7 NOISE / 8 KBD / 9 VEL / 10 PRESS / 11 VCO1 / 12 VCO2 / 13 VCA OUT | 0 | switch | +| `ms20-c2-dst` | CORD 2 | DEST | 0 OFF / 1 PITCH / 2 VCO2 / 3 PW / 4 HPF CUT / 5 LPF CUT / 6 VCA / 7 MG FREQ / 8 FLT IN | 0 | switch | +| `ms20-c2-amt` | CORD 2 | AMT | -1 … 1 | 0 | linear | +| `ms20-c3-src` | CORD 3 | SRC | 0 OFF / 1 FENV / 2 AENV / 3 AENV- / 4 MG / 5 MG PUL / 6 S&H / 7 NOISE / 8 KBD / 9 VEL / 10 PRESS / 11 VCO1 / 12 VCO2 / 13 VCA OUT | 0 | switch | +| `ms20-c3-dst` | CORD 3 | DEST | 0 OFF / 1 PITCH / 2 VCO2 / 3 PW / 4 HPF CUT / 5 LPF CUT / 6 VCA / 7 MG FREQ / 8 FLT IN | 0 | switch | +| `ms20-c3-amt` | CORD 3 | AMT | -1 … 1 | 0 | linear | +| `ms20-c4-src` | CORD 4 | SRC | 0 OFF / 1 FENV / 2 AENV / 3 AENV- / 4 MG / 5 MG PUL / 6 S&H / 7 NOISE / 8 KBD / 9 VEL / 10 PRESS / 11 VCO1 / 12 VCO2 / 13 VCA OUT | 0 | switch | +| `ms20-c4-dst` | CORD 4 | DEST | 0 OFF / 1 PITCH / 2 VCO2 / 3 PW / 4 HPF CUT / 5 LPF CUT / 6 VCA / 7 MG FREQ / 8 FLT IN | 0 | switch | +| `ms20-c4-amt` | CORD 4 | AMT | -1 … 1 | 0 | linear | Presets: - `acid-bass` — Squelchy resonant bass — play low, ride LPF CUT - `aggressive-fill-lead` — Short aggressive lead / fill - `buzz-lead` — Bright buzzy lead with a touch of MG wobble +- `k35-round-bass` — K35 bass: full low end, a gentle peak, short EG2 sweep +- `k35-scream` — K35 filters both peaked and driven: the early MS-20 scream - `mild-acid-bass` — Mild acid, not techno - `minimal-8th-bass` — Minimal 8th-note spoken-verse bass - `nasal-sneer-lead` — Nasal sneering mono lead - `octave-night-bass` — Faster octave night-drive bass +- `ota-singing-lead` — OTA LPF, peak high and clean: the later MS-20, symmetric and singing +- `patch-feedback-growl` — VCA OUT back into FLT IN: the OTA growls and sings as the note swells +- `patch-fm-metal-bass` — VCO2 a fifth up into LPF CUT at audio rate: a metallic, clangy bass +- `patch-sh-bubbles` — S&H on LPF CUT, clocked by the MG: random bubbling under a peaked K35 +- `patch-tracking-lead` — KBD on LPF CUT for full tracking, MG on PITCH for a slow vibrato, PRESS opens it +- `patch-vowel-sweep` — FENV on HPF CUT with both filters peaked: a talking band-pass sweep - `portamento-highway-lead` — Smooth portamento highway lead - `resonant-funk-bass` — Resonant funky bass with filter bite - `rising-filter-fx` — Overdriven rising-filter FX sweep @@ -1620,7 +1666,7 @@ Presets: - `parallel-squash` — Parallel compression: the dry signal beside a crushed, saturated copy. AMOUNT brings the copy up under it. - `harsh/bit-guitar` — Lows cut, crushed to 8 bits at 11 kHz, into a clean amp: aliased, zippy guitar. -- `harsh/cross-bass` — Justice-style bass: a clean sub lane, and a dirty lane cut below 250 Hz, crushed to 12 bits, overdriven, through a Brit 4x12, slammed by a FET and taped. +- `harsh/cross-bass` — Justice-style bass: a clean sub lane, and a dirty lane cut below 250 Hz, crushed to 12 bits, overdriven, through a bright Brit 4x12 and slammed by a FET. - `harsh/four-slot` — Distructor's layout: distortion, filter, chorus and amp in four slots, each slot's mix on a knob. - `harsh/gated-fuzz` — A starved fuzz into a fast gate: notes sputter and cut off dead. - `harsh/kodiak` — Big and gnarly: a clean low-passed sub lane under a lane of octave-down, dynamic folding, RAT and OTT. SIZE is the sub, GNARL the dirt. diff --git a/kernels/04-filters/ms20_sk.fy b/kernels/04-filters/ms20_sk.fy new file mode 100644 index 00000000..c12ee5b5 --- /dev/null +++ b/kernels/04-filters/ms20_sk.fy @@ -0,0 +1,116 @@ +( ms20_sk.fy - the MS-20's own filters: K35 and OTA, low-pass and high-pass. + + Stinchcombe's study of the MS-10/MS-20 filters [timstinchcombe.co.uk/ + synth/MS20_study.pdf] gives both generations the same linear response, + + LP = 1 / [s^2 + [a - k] s + 1] HP = s^2 / [same] + + with a = 2 1/3 for the Korg35 Sallen-Key [early units] and a = 2 for the + later LM13600 OTA pair, k the resonance loop gain. The DC gain stays 1 + whatever the resonance and the poles stay on the unit circle: PEAK + sharpens the corner without moving it or thinning the bass. That is the + difference from the HOT/WET pair [ms20_lpf.fy], whose ladder-style + negative feedback gives the 303 squelch. + + Here: a TPT state-variable core with base damping a, and the resonance + as positive band-pass feedback k bp into the input, one zero-delay step + per substep. The feedback is predicted linearly, then clipped: + + v = x - [a + g] s1 - s2 + bp-lin = [g h v + s1] / [1 - g h k] h = 1 / [1 + a g + g^2] + fb = vd tanh[k bp-lin / vd] the feedback diodes + u = vf [tanh[[drive x + fb] / vf + fo] - tanh[fo]] + hp = [u - [a + g] s1 - s2] h ... then bp, lp as usual + + Where the two generations differ [Stinchcombe §4, §5]: + - K35: the diodes sit in the forward amplifier [x58 gain, one diode + drop], so a loud signal distorts at every frequency, and the signal + tilts the Korg35's transistor currents, making the resonance stronger + on one half-wave. Small vf, a fo offset. + - OTA: three diodes per side in the feedback amplifier [x4], so only the + corner distorts and the response is symmetric. vf large [the OTA + input pair, soft], fo 0, and the feedback diodes vd set the peak. + + k past a self-oscillates; vd bounds it. Run at 4x [the voice's + up4/dec4]. Coefficients come once per block from ms20-sk-set; g per + sample from the cutoff. ) + +include "../00-primitives/math.fy" ( tanh-fast ) + +ustruct: Ms20Sk + f64 s1 + f64 s2 +; + +ustruct: Ms20SkProfile + f64 a ( base damping: 2 OTA, 7/3 K35 ) + f64 k-lp ( LPF loop gain, from PEAK ) + f64 k-hp ( HPF loop gain, from its PEAK ) + f64 drive ( input gain ) + f64 vf ( forward clip level ) + f64 fo ( forward clip offset: K35 asymmetry ) + f64 fto ( tanh[fo], subtracted so 0 in is 0 out ) + f64 vd ( feedback diode level ) + f64 g-hp ( HPF g at the 4x rate ) + f64 out-g ( output gain, to the HOT mode's level ) +; + +( p a -- k : PEAK [0..1 of its travel] to loop gain. A linear pot would + give k = a p / 0.9: Q = 1 / [a - k] stays near 1 until the last third, + the 'resonance invisible until the top' of the September OTA probe. The + taper here is a design choice, not a measured pot: k = a [1 - u^2] with + u = 1 - p / 0.9, so the peak is +6 dB by noon and climbs steadily; past + 90%, where u < 0, k = a [1 - u] keeps rising linearly into + self-oscillation, to 1.11 a at the end. ) +dsp: ms20-sk-k | p a -- k | + 1.0 p 0.0 1.0 fclamp 0.9 f/ f- | u | + 1.0 u u 0.0 1.0 u fsel-lt f* f- a f* +; + +( pr drive res hres mode hpf-hz osr -- : one block's constants. mode 2 + K35, 3 OTA; res and hres are the PEAK knobs, 0..2. ) +dsp: ms20-sk-set | pr:Ms20SkProfile drive res hres mode hz osr -- | + mode 2.5 2.3333333333333335 2.0 fsel-lt | a | + a -> pr.a + res 0.5 f* a ms20-sk-k -> pr.k-lp + hres 0.5 f* a ms20-sk-k -> pr.k-hp + mode 2.5 0.9 0.6 fsel-lt drive f* -> pr.drive + mode 2.5 0.55 1.6 fsel-lt -> pr.vf + mode 2.5 0.12 0.0 fsel-lt | fo | + fo -> pr.fo + fo tanh-fast -> pr.fto + mode 2.5 0.45 0.5 fsel-lt -> pr.vd + hz 20.0 15000.0 fclamp 3.141592653589793 f* osr f/ tan-warp -> pr.g-hp + mode 2.5 1.7 1.75 fsel-lt -> pr.out-g +; + +( f pr x g k dr -- lp hp : one zero-delay substep of the core; dr is the + input gain [DRIVE for the first filter of the pair, 1 for the second]. ) +dsp: ms20-sk-core | f:Ms20Sk pr:Ms20SkProfile x g k dr -- lp hp | + x dr f* | xd | + f.s1 | s1 | + f.s2 | s2 | + pr.a | a | + 1.0 1.0 a g f* f+ g g f* f+ f/ | h | + a g f+ s1 f* s2 f+ | lin | + g h f* | gh | + gh xd lin f- f* s1 f+ 1.0 gh k f* f- f/ | bpl | + k bpl f* pr.vd f/ tanh-fast pr.vd f* | fb | + xd fb f+ pr.vf f/ pr.fo f+ tanh-fast pr.fto f- pr.vf f* | u | + u lin f- h f* | hp | + g hp f* | ghp | + ghp s1 f+ | bp | + g bp f* | gbp | + gbp s2 f+ | lp | + ghp bp f+ -> f.s1 + gbp lp f+ -> f.s2 + lp hp +; + +( hf lf pr x g -- y : one 4x substep of the MS-20's series pair, HPF into + LPF; g is the LPF's. ) +dsp: ms20-sk-step | hf:Ms20Sk lf:Ms20Sk pr:Ms20SkProfile x g -- y | + hf pr x pr.g-hp pr.k-hp pr.drive ms20-sk-core | hlp hhp | + lf pr hhp g pr.k-lp 1.0 ms20-sk-core | llp lhp | + llp pr.out-g f* +; diff --git a/kernels/06-voices/acid_voice.fy b/kernels/06-voices/acid_voice.fy new file mode 100644 index 00000000..edbc74cd --- /dev/null +++ b/kernels/06-voices/acid_voice.fy @@ -0,0 +1,147 @@ +( acid_voice.fy - a TB-303-style mono bassline voice around the HOT/WET + lowpass [ms20_lpf.fy]. + + That filter was the SM-24 Mono's first LPF and sounded like a 303, not + an MS-20 [docs/14]: its clipped lowpass is subtracted at a hot input, + so PEAK thins the bass 16-25 dB, and the peak rides 1.5-2 octaves over + CUT and moves with the level. Here it gets the voice it was asking + for. The kernel is used as is. + + VCO [saw, or the square shaped from it] -> LPF [4x] -> VCA -> DC block + + The 303's voicing: + - one VCO, SAW or SQR. The square keeps a little of the saw's ramp on + its tops, like the transistor shaper that makes it, and sits at the + saw's loudness. + - the MEG is decay only [sustain 0], from a 3 ms attack, and keeps + falling after the key is up. ENV MOD scales it onto the cutoff. + - an accented note [velocity over 0.8, the `!` of a slabkit seq] runs a + second MEG with the decay at its 200 ms minimum, and sends the + envelope through the accent RC into the cutoff and the VCA. The RC + is slower with RES up, so accents in a row stack the sweep higher: + the 'wow'. + - a note that overlaps the last one slides to its pitch [ctx.legato] + on an RC, without retriggering anything. + - the VCA decays over 3 s while held and closes in 8 ms on key-up. ) + +include "../00-primitives/ctx.fy" ( kernel ABI: Ctx, Io ) +include "../00-primitives/math.fy" +include "../00-primitives/oversample.fy" +include "../01-oscillators/primitives/phase.fy" +include "../01-oscillators/primitives/blep.fy" +include "../01-oscillators/primitives/vco.fy" +include "../02-shapers/rational.fy" ( tanh-rational ) +include "../03-envelopes/primitives/env_rc.fy" +include "../04-filters/coeffs.fy" ( svf-g ) +include "../04-filters/ms20_lpf.fy" + +ustruct: AcidState + f64 phase + f64 oct ( current pitch, log2 Hz: slides toward target-oct ) + f64 target-oct + f64 acc ( this note's accent, 0..ACCENT ) + f64 accf ( 1 when the note was triggered accented ) + f64 acc-cv ( the accent RC ) + f64 dc-prev-x + f64 dc-prev-y + EnvRc meg EnvRc mega EnvRc vca + Ms20Lpf lpf + Up4 up + Dec4 dec +; + +ustruct: AcidParams + f64 tune ( semitones ) + f64 wave ( 0 SAW 1 SQR - switch ) + f64 cutoff ( base cutoff Hz ) + f64 resonance ( RES 0..1 ) + f64 env-mod ( ENV MOD 0..1 ) + f64 decay ( MEG decay, seconds ) + f64 accent ( ACCENT 0..1 ) + f64 slide ( slide time, seconds ) + f64 drive ( LPF input drive, x the mode's own ) + f64 mode ( 0 HOT 1 WET - switch ) + f64 level + ( derived per block by acid-block-prepare ) + f64 inv-sample-rate + f64 osr + EnvRcCoefs meg-co + EnvRcCoefs mega-co + EnvRcCoefs vca-co + Ms20LpfProfile lpf-pr + f64 slide-c ( slide one-pole, per sample ) + f64 tune-ratio + f64 env-oct ( ENV MOD in octaves ) + f64 acc-c ( accent RC, per sample ) +; + +( ctx state params -- : a note. An overlapping note slides and keeps + the envelopes; any other jumps to its pitch and retriggers them. ) +dsp: acid-note-on | ctx:Ctx state:AcidState params:AcidParams | + ctx.hz 1.0 fmax log2 | o | + o -> state.target-oct + ctx.legato 0.5 o state.oct fsel-lt -> state.oct + ctx.vel 0.8 f- 6.666666666666667 f* 0.0 1.0 fclamp | av | + av params.accent f* -> state.acc + ctx.legato 0.5 0.0 av 1.0 0.0 fsel-lt state.accf fsel-lt -> state.accf + state.meg& params.meg-co& ctx.legato env-rc-trigger + state.mega& params.mega-co& ctx.legato env-rc-trigger + state.vca& params.vca-co& ctx.legato env-rc-trigger +; + +( ctx state params -- : per-note expression [docs/22]: a bend moves the + pitch directly. ) +dsp: acid-note-expr | ctx:Ctx state:AcidState params:AcidParams | + ctx.hz 1.0 fmax log2 | o | + o -> state.target-oct + o -> state.oct +; + +( ctx state params -- : key up. The MEGs release at their decay rate, + so they fall on as if still held; the VCA closes. ) +dsp: acid-note-off | ctx state:AcidState params:AcidParams | + state.meg& params.meg-co& env-rc-release + state.mega& params.mega-co& env-rc-release + state.vca& params.vca-co& env-rc-release +; + +( One LPF substep. ) +dsp: acid-lpf-sub | state:AcidState params:AcidParams x g -- y | + state.lpf& params.lpf-pr& x g ms20-lpf-step +; + +( io ctx state params -- : one sample. ) +dsp: k-acid-voice-sample | io ctx state:AcidState params:AcidParams -- | + state.oct state.target-oct state.oct f- params.slide-c f* f+ | oct | + oct -> state.oct + oct exp2 params.tune-ratio f* params.inv-sample-rate f* | dt | + state.phase | ph | + ph dt phase-advance01 -> state.phase + ph dt 0.1 vco-saw fneg | saw | + params.wave 0.5 f< + [ saw ] + [ ph dt 0.5 pulse-polyblep saw 0.15 f* f+ 0.72 f* ] ifte 0.62 f* | x | + ( the MEG: the accented one for an accented note ) + state.meg& params.meg-co& env-rc-step | fn | + state.mega& params.mega-co& env-rc-step | fa | + fa fn f- state.accf f* fn f+ | fenv | + state.acc-cv fa state.acc f* state.acc-cv f- params.acc-c f* f+ | acv | + acv -> state.acc-cv + state.vca& params.vca-co& env-rc-step | aenv | + fenv params.env-oct f* acv 4.0 f* f+ exp2 params.cutoff f* | hz | + hz params.osr svf-g | g | + state.up& x up4 | x0 x1 x2 x3 | + state.dec& + state params x0 g acid-lpf-sub + state params x1 g acid-lpf-sub + state params x2 g acid-lpf-sub + state params x3 g acid-lpf-sub + dec4 | y | + ( VCA: the envelope, the accent's push, the level; a ~20 Hz DC block ) + 1.0 fa state.acc f* 1.2 f* f+ | ag | + y aenv f* ag f* params.level f* 1.78 f* | v | + v state.dc-prev-x f- state.dc-prev-y 0.9974 f* f+ | o | + v -> state.dc-prev-x + o -> state.dc-prev-y + o io f!64 +; diff --git a/kernels/06-voices/ms20_voice_probe.fy b/kernels/06-voices/ms20_voice_probe.fy index 7a63af57..4a970ff1 100644 --- a/kernels/06-voices/ms20_voice_probe.fy +++ b/kernels/06-voices/ms20_voice_probe.fy @@ -45,6 +45,7 @@ include "../03-envelopes/primitives/env_rc.fy" include "../04-filters/coeffs.fy" ( svf-g, svf-damping ) include "../04-filters/ms20_hpf.fy" include "../04-filters/ms20_lpf.fy" +include "../04-filters/ms20_sk.fy" ustruct: Ms20VoiceState f64 phase1 @@ -65,6 +66,13 @@ ustruct: Ms20VoiceState Up4 up Drift dr1 Drift dr2 Drift drc Drift drv f64 dro-x f64 dro-y ( the mix's coupling cap ) + Ms20Sk sk-hp Ms20Sk sk-lp ( K35/OTA modes: the HPF and LPF, at 4x ) + ( the patch panel [ms20-cord-to] ) + f64 jk 14 ( the jacks, by SRC option: written each sample, read the next ) + f64 sh ( S&H: noise held at each MG cycle ) + f64 press ( per-note pressure ) + f64 mg-oct ( MG FREQ from the cords, octaves, a sample late ) + f64 cut-hz f64 hpf-hz f64 pw-v f64 vca-v f64 mg-hz f64 det-v ( what the cords make of the knobs ) ; ustruct: Ms20VoiceParams @@ -76,7 +84,7 @@ ustruct: Ms20VoiceParams f64 resonance ( LPF resonance 0..2 ) f64 drive ( LPF input drive, x the mode's own ) f64 level - f64 lpf-mode ( 0 HOT 1 WET - switch ) + f64 lpf-mode ( 0 HOT 1 WET [the acid pair, ms20_lpf.fy], 2 K35 3 OTA [ms20_sk.fy] - switch ) f64 amp-attack f64 amp-decay f64 amp-sustain @@ -106,10 +114,14 @@ ustruct: Ms20VoiceParams f64 filter-delay ( filter EG: key-down -> attack, seconds [EG1 DELAY] ) f64 amp-hold ( amp EG: key-up -> release, seconds [EG2 HOLD] ) f64 age-amt ( AGE 0..1: the analog layer ) + f64 p-src 4 ( the four cords: SRC, DEST and AMT options [ms20.fy] ) + f64 p-dst 4 + f64 p-amt 4 ( derived per block by ms20-block-prepare ) EnvRcCoefs amp-co EnvRcCoefs flt-co Ms20LpfProfile lpf-pr + Ms20SkProfile sk-pr f64 detune-ratio ( 2^[detune/12] ) f64 hpf-f ( HPF Chamberlin f ) f64 hpf-q ( HPF damping ) @@ -118,6 +130,8 @@ ustruct: Ms20VoiceParams f64 drift-c f64 cut-drift-c f64 bleed f64 dro-a + f64 bay-on ( 1 when a cord is in ) + f64 bay-hpf ( 1 when a cord reaches HPF CUT ) ; ( ctx state params -- : a note. A fresh note gates both envelopes from @@ -140,6 +154,7 @@ dsp: ms20-voice-note-on state.phase2 0.0 f= ctx.phase 2.618 f* ffrac state.phase2 select -> state.phase2 state.amp-env& params.amp-co& ctx.legato env-rc-trigger state.flt-env& params.flt-co& ctx.legato env-rc-trigger + ctx.pressure -> state.press ; ( ctx state params -- : per-note expression [docs/22]: the bend is @@ -149,6 +164,7 @@ dsp: ms20-voice-note-expr ctx.hz 1.0 fmax log2 | o | o -> state.target-oct o -> state.oct + ctx.pressure -> state.press ; ( ctx state params -- : release both envelopes from where they are. ) @@ -158,8 +174,7 @@ dsp: ms20-voice-note-off state.flt-env& params.flt-co& env-rc-release ; -( VCO1 with waveform select (tri/saw/pulse), octave scaled, phase advanced. - WAVE is a switch: only its wave is computed. pmod is the frequency +( VCO1 with waveform select (tri/saw/pulse), octave scaled, phase advanced. pmod is the frequency multiplier from MG/EG routing, pw the effective pulse width. ) dsp: v-vco1 | state:Ms20VoiceState params:Ms20VoiceParams pmod pw -- y | state.phase1 @@ -169,11 +184,12 @@ dsp: v-vco1 | state:Ms20VoiceState params:Ms20VoiceParams pmod pw -- y | | phase dt | phase dt phase-advance01 -> state.phase1 - params.vco1-wave 0.5 f< - [ phase tri-raw ] - [ params.vco1-wave 1.5 f< - [ phase dt params.curve1 vco-saw fneg ] - [ phase dt pw pulse-polyblep ] ifte ] ifte + ( a select, not an ifte: the three waves are cheap, and the versioned + bodies [32 at most] go to VCO2's waves, the filter MODE and the + patch panel ) + params.vco1-wave 0.5 f< phase tri-raw + params.vco1-wave 1.5 f< phase dt params.curve1 vco-saw fneg + phase dt pw pulse-polyblep select select ; ( VCO2 with waveform select (saw/square/pulse/ring), detuned and @@ -204,9 +220,9 @@ dsp: v-noise-raw | state:Ms20VoiceState -- y | ; ( VCO1*lvl + VCO2*lvl + noise*lvl at 0.62 per unit: clean. ) -dsp: v-osc-mix | state params:Ms20VoiceParams pmod1 pmod2 pw -- y | - state params pmod1 pw v-vco1 params.saw-level f* - state params pmod2 pw v-vco2 params.pulse-level f* f+ +dsp: v-osc-mix | state:Ms20VoiceState params:Ms20VoiceParams pmod1 pmod2 pw -- y | + state params pmod1 pw v-vco1 dup state.jk& 11.0 f!i params.saw-level f* + state params pmod2 pw v-vco2 dup state.jk& 12.0 f!i params.pulse-level f* f+ state v-noise-raw params.noise-level f* f+ 0.62 f* ; @@ -232,6 +248,43 @@ dsp: v-lpf-sub | state:Ms20VoiceState params:Ms20VoiceParams x g -- y | state.lpf& params.lpf-pr& x g ms20-lpf-step ; +( One K35/OTA substep: the series HPF -> LPF pair. ) +dsp: v-sk-sub | state:Ms20VoiceState params:Ms20VoiceParams x g -- y | + state.sk-hp& state.sk-lp& params.sk-pr& x g ms20-sk-step +; + +( g pr -- : a cord on HPF CUT sets the K35/OTA HPF's g per sample. ) +dsp: ms20-sk-set-ghp | g pr:Ms20SkProfile -- | g -> pr.g-hp ; + +( state params k -- s : the patch panel's pull on DEST option k: every + cord plugged into it, its jack x AMT. The jack holds its source's + value from the sample before [a runtime-indexed load reads the state + as the word found it], so a cord can loop the VCA back into the + filter. ) +dsp: ms20-cord-to | state:Ms20VoiceState params:Ms20VoiceParams k -- s | + 0.0 0.0 4 [ | i acc | + i 1.0 f+ + acc + params.p-dst& i f@i k f= + state.jk& params.p-src& i f@i f@i params.p-amt& i f@i f* + 0.0 select + f+ ] times nip +; + +( state params -- dests : the eight destinations, in their units: + PITCH and VCO2 +-2 octaves, PW +-0.45, the cutoffs +-5 octaves, VCA + gain +-1, MG FREQ +-4 octaves, FLT IN the signal at the mixer's level. ) +dsp: ms20-bay | state:Ms20VoiceState params:Ms20VoiceParams -- dpit d2 dpw dhc dlc dvca dmg din | + state params 1.0 ms20-cord-to 2.0 f* + state params 2.0 ms20-cord-to 2.0 f* + state params 3.0 ms20-cord-to 0.45 f* + state params 4.0 ms20-cord-to 5.0 f* + state params 5.0 ms20-cord-to 5.0 f* + state params 6.0 ms20-cord-to + state params 7.0 ms20-cord-to 4.0 f* + state params 8.0 ms20-cord-to 0.62 f* +; + ( io ctx state params -- : render one mono voice sample. ) dsp: k-ms20-voice-sample | io ctx state:Ms20VoiceState params:Ms20VoiceParams -- | ( portamento, in octaves ) @@ -239,47 +292,95 @@ dsp: k-ms20-voice-sample | io ctx state:Ms20VoiceState params:Ms20VoiceParams -- oct -> state.oct oct exp2 -> params.note-hz ( MG and the envelopes ) - state.mg-phase params.mg-freq params.inv-sample-rate f* phase-advance01 - dup -> state.mg-phase - params.mg-wave 0.02 0.98 fclamp mg-shape | mg | + state.mg-phase | mph0 | + params.mg-freq state.mg-oct exp2 f* | mghz | + mghz -> state.mg-hz + mph0 mghz params.inv-sample-rate f* phase-advance01 | mph | + mph -> state.mg-phase + mph params.mg-wave 0.02 0.98 fclamp mg-shape | mg | state.flt-env& params.flt-co& env-rc-step | fenv | state.amp-env& params.amp-co& env-rc-step | aenv | + ( the patch panel: the cords' pull on each destination, 0 with none in ) + params.bay-on 0.5 f> + [ state params ms20-bay ] + [ 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ] ifte | dpit d2 dpw dhc dlc dvca dmg din | + dmg -> state.mg-oct + ( the jacks the next sample reads; VCO1, VCO2 and the VCA store theirs + below. S&H takes the noise when the MG wraps. ) + state.noise-rng 2.0 f* 1.0 f- | wn | + mph mph0 wn state.sh fsel-lt | sh | + sh -> state.sh + fenv state.jk& 1.0 f!i + aenv state.jk& 2.0 f!i + aenv fneg state.jk& 3.0 f!i + mg state.jk& 4.0 f!i + mph 0.5 1.0 -1.0 fsel-lt state.jk& 5.0 f!i + sh state.jk& 6.0 f!i + wn state.jk& 7.0 f!i + oct 8.031359 f- state.jk& 8.0 f!i + state.vel state.jk& 9.0 f!i + state.press state.jk& 10.0 f!i ( pitch-mod = 1 + mg*mg-pitch + fenv*eg-pitch ) - 1.0 mg params.mg-pitch f* f+ fenv params.eg-pitch f* f+ | pmod | + 1.0 mg params.mg-pitch f* f+ fenv params.eg-pitch f* f+ dpit exp2 f* | pmod | ( pw = clamp[pulse-width + mg*mg-pw, 0.02, 0.98] ) - params.pulse-width mg params.mg-pw f* f+ 0.02 0.98 fclamp | pw | + params.pulse-width mg params.mg-pw f* f+ dpw f+ 0.02 0.98 fclamp | pw | + pw -> state.pw-v + params.detune d2 12.0 f* f+ -> state.det-v ( AGE: the VCOs share a board, so most of their drift is common [~6 cents RMS at 1] and a third of it their own - the pitch wanders, the interval between them barely does ) params.age-amt 0.0035 f* | dscale | state.drv& params.drift-c drift-step | dv | state.dr1& params.drift-c drift-step 0.35 f* dv f+ dscale f* 1.0 f+ pmod f* | pmod1 | - state.dr2& params.drift-c drift-step 0.35 f* dv f+ dscale f* 1.0 f+ pmod f* | pmod2 | + state.dr2& params.drift-c drift-step 0.35 f* dv f+ dscale f* 1.0 f+ pmod f* d2 exp2 f* | pmod2 | state params pmod1 pmod2 pw v-osc-mix | m | ( the coupling cap, then the HPF; the EG's bleed and the noise floor join after it ) m state.dro-x state.dro-y params.dro-a droop-hp | md | m -> state.dro-x md -> state.dro-y - state params md v-hpf - fenv params.bleed f* f+ - state.noise-rng 2.0 f* 1.0 f- 0.0001 f* f+ | x | + ( the noise floor reads the rng after the mixer's noise moved it ) + fenv params.bleed f* state.noise-rng 2.0 f* 1.0 f- 0.0001 f* din f+ | bl nf | ( cutoff in octaves, like control voltage: base * 2^[env + MG] ) fenv params.env-amount f* mg params.mg-cutoff f* f+ state.drc& params.cut-drift-c drift-step params.age-amt 0.07 f* f* f+ - exp2 params.cutoff f* - params.osr svf-g | g | - state.up& x up4 | x0 x1 x2 x3 | - state.dec& - state params x0 g v-lpf-sub - state params x1 g v-lpf-sub - state params x2 g v-lpf-sub - state params x3 g v-lpf-sub - dec4 | y | + dlc f+ exp2 params.cutoff f* | hz | + hz -> state.cut-hz + ( a cord on HPF CUT moves its coefficients every sample ) + params.bay-hpf 0.5 f> + [ params.hpf-cutoff dhc exp2 f* | hh | + hh -> state.hpf-hz + hh 1.0 params.inv-sample-rate f/ svf-g 2.0 f* -> params.hpf-f + hh 20.0 15000.0 fclamp 3.141592653589793 f* params.osr f/ tan-warp params.sk-pr& ms20-sk-set-ghp ] + [ params.hpf-cutoff -> state.hpf-hz ] ifte + ( MODE: HOT/WET run the acid pair [1x HPF, ladder-style LPF]; K35/OTA + the MS-20's own filters, both at 4x, the cutoff held to 15 kHz ) + params.lpf-mode 1.5 f< + [ state params md v-hpf bl f+ nf f+ | x | + hz params.osr svf-g | g | + state.up& x up4 | x0 x1 x2 x3 | + state.dec& + state params x0 g v-lpf-sub + state params x1 g v-lpf-sub + state params x2 g v-lpf-sub + state params x3 g v-lpf-sub + dec4 ] + [ md bl f+ nf f+ | x | + hz 15000.0 fmin params.osr svf-g | g | + state.up& x up4 | x0 x1 x2 x3 | + state.dec& + state params x0 g v-sk-sub + state params x1 g v-sk-sub + state params x2 g v-sk-sub + state params x3 g v-sk-sub + dec4 ] ifte | y | ( VCA: envelope, velocity, level; then a ~20 Hz DC block ) - y aenv f* state.vel f* params.level f* 1.78 f* | v | + 1.0 dvca f+ 0.0 fmax params.level f* | lv | + lv -> state.vca-v + y aenv f* state.vel f* lv f* 1.78 f* | v | v state.dc-prev-x f- state.dc-prev-y 0.9974 f* f+ | o | v -> state.dc-prev-x o -> state.dc-prev-y + o state.jk& 13.0 f!i o io f!64 ; diff --git a/machines/acid/acid.fy b/machines/acid/acid.fy new file mode 100644 index 00000000..22b29415 --- /dev/null +++ b/machines/acid/acid.fy @@ -0,0 +1,75 @@ +( acid.fy - Squelch 33: a TB-303-style bassline synth on the HOT/WET + lowpass that used to be the SM-24 Mono's. + + The DSP is kernels/06-voices/acid_voice.fy; this file declares the + machine. It is mono: an overlapping note slides, a loud one + [velocity over 0.8] is accented. ) + +include "../../kernels/00-primitives/ctx.fy" ( kernel ABI: Ctx, Io ) +include "../../kernels/06-voices/acid_voice.fy" +include "../lib/manifest.fy" + +( ctx state params -- : a block's coefficients. ) +dsp: acid-block-prepare | ctx:Ctx state params:AcidParams -- | + ctx.inv-sr -> params.inv-sample-rate + ctx.sr 4.0 f* | osr | + osr -> params.osr + ( the MEG: decay only, falling on after key-up at the same rate ) + params.meg-co& 0.003 params.decay 0.0 params.decay 0.0 0.0 ctx.inv-sr env-rc-coefs + params.mega-co& 0.003 0.2 0.0 0.2 0.0 0.0 ctx.inv-sr env-rc-coefs + params.vca-co& 0.002 3.0 0.0 0.008 0.0 0.0 ctx.inv-sr env-rc-coefs + ( slide: an RC covering 3 time constants in SLIDE ) + 1.0 -3.0 params.slide ctx.sr f* f/ exp f- -> params.slide-c + params.tune 0.08333333333333333 f* exp2 -> params.tune-ratio + params.env-mod 5.0 f* -> params.env-oct + ( the accent RC: 15 ms, 60 ms at full RES, where accents stack ) + 1.0 -1.0 0.015 params.resonance 0.045 f* f+ ctx.sr f* f/ exp f- -> params.acc-c + params.lpf-pr& params.drive params.resonance 1.6 f* params.mode osr ms20-lpf-set + params.lpf-pr& 0.15 ms20-lpf-set-offs +; + +: manifest + "Squelch 33" voice-sample machine* + "k-acid-voice-sample" render! + "acid-note-on" note-on! + "acid-note-expr" note-expr! + "acid-note-off" note-off! + "acid-block-prepare" block-prepare! + AcidState.size state-size! + AcidParams.size params-size! + 560.0 panel-w! + + ( module label id offset min max default curve ) + "VCO" "TUNE" "tune" AcidParams.tune -12.0 12.0 0.0 curve-lin knob + "VCO" "WAVE" "wave" AcidParams.wave 0 switch + "SAW" 0.0 opt "SQR" 1.0 opt + + "VCF" "CUT" "cutoff" AcidParams.cutoff 30.0 8000.0 260.0 curve-exp knob + "VCF" "RES" "resonance" AcidParams.resonance 0.0 1.0 0.6 curve-lin knob + "VCF" "ENV" "env-mod" AcidParams.env-mod 0.0 1.0 0.5 curve-lin knob + "VCF" "DEC" "decay" AcidParams.decay 0.2 2.0 0.5 curve-exp knob + + "PLAY" "ACC" "accent" AcidParams.accent 0.0 1.0 0.7 curve-lin knob + "PLAY" "SLIDE" "slide" AcidParams.slide 0.02 0.3 0.06 curve-exp knob + + "DRIVE" "DRV" "drive" AcidParams.drive 0.25 4.0 1.0 curve-exp knob + "DRIVE" "MODE" "mode" AcidParams.mode 0 switch + "HOT" 0.0 opt "WET" 1.0 opt + + "OUT" "LVL" "level" AcidParams.level 0.0 1.0 0.68 curve-pow knob + + "VCO" 2 strip + "VCF" 4 strip + "PLAY" 2 strip + "DRIVE" 2 strip + "OUT" 1 strip + + 1.0 row + 2.0 cell "VCO" 1.0 item + 4.0 cell "VCF" 1.0 item + 2.0 cell "PLAY" 1.0 item + 2.0 cell "DRIVE" 1.0 item + 1.0 cell "OUT" 1.0 item + + machine-desc +; diff --git a/machines/acid/presets/classic-squelch.preset b/machines/acid/presets/classic-squelch.preset new file mode 100644 index 00000000..92e37f26 --- /dev/null +++ b/machines/acid/presets/classic-squelch.preset @@ -0,0 +1 @@ +{"slab": "preset", "schema": 1, "machine": "acid", "note": "Saw, RES high, a medium sweep: accents bark and stack", "params": {"tune": 0, "wave": 0, "cutoff": 220, "resonance": 0.78, "env-mod": 0.6, "decay": 0.45, "accent": 0.8, "slide": 0.06, "drive": 1.0, "mode": 0, "level": 0.63}} \ No newline at end of file diff --git a/machines/acid/presets/round-line.preset b/machines/acid/presets/round-line.preset new file mode 100644 index 00000000..b0ac8f3c --- /dev/null +++ b/machines/acid/presets/round-line.preset @@ -0,0 +1 @@ +{"slab": "preset", "schema": 1, "machine": "acid", "note": "Low RES and little sweep: a round bassline under a mix", "params": {"tune": 0, "wave": 0, "cutoff": 160, "resonance": 0.25, "env-mod": 0.25, "decay": 0.6, "accent": 0.5, "slide": 0.06, "drive": 1.0, "mode": 0, "level": 0.45}} \ No newline at end of file diff --git a/machines/acid/presets/square-bounce.preset b/machines/acid/presets/square-bounce.preset new file mode 100644 index 00000000..ab4141b1 --- /dev/null +++ b/machines/acid/presets/square-bounce.preset @@ -0,0 +1 @@ +{"slab": "preset", "schema": 1, "machine": "acid", "note": "Square, short decay, moderate RES: a hollow rubbery line", "params": {"tune": 0, "wave": 1, "cutoff": 300, "resonance": 0.5, "env-mod": 0.45, "decay": 0.28, "accent": 0.7, "slide": 0.06, "drive": 1.0, "mode": 0, "level": 0.5}} \ No newline at end of file diff --git a/machines/acid/presets/wet-scream.preset b/machines/acid/presets/wet-scream.preset new file mode 100644 index 00000000..3a7ee554 --- /dev/null +++ b/machines/acid/presets/wet-scream.preset @@ -0,0 +1 @@ +{"slab": "preset", "schema": 1, "machine": "acid", "note": "WET mode driven, RES near the top: screaming accents", "params": {"tune": 0, "wave": 0, "cutoff": 380, "resonance": 0.95, "env-mod": 0.7, "decay": 0.6, "accent": 1.0, "slide": 0.08, "drive": 2.0, "mode": 1, "level": 0.225}} \ No newline at end of file diff --git a/machines/ms20/ms20.fy b/machines/ms20/ms20.fy index 9bbcde6a..ac0fe34f 100644 --- a/machines/ms20/ms20.fy +++ b/machines/ms20/ms20.fy @@ -25,6 +25,8 @@ dsp: ms20-block-prepare | ctx:Ctx state params:Ms20VoiceParams -- | 1.0 -3.0 params.portamento ctx.sr f* f/ exp f- fsel-lt -> params.porta-c params.lpf-pr& params.drive params.resonance 0.8 f* params.lpf-mode osr ms20-lpf-set + params.sk-pr& params.drive params.resonance params.hpf-resonance params.lpf-mode + params.hpf-cutoff osr ms20-sk-set params.detune 0.08333333333333333 f* exp2 -> params.detune-ratio params.hpf-cutoff ctx.sr svf-g 2.0 f* -> params.hpf-f ( HPF damping [q = 1/Q] 1.4 [1 - RES/2]^2: flat at 0, Q 3 at 1, Q 18 at @@ -41,8 +43,36 @@ dsp: ms20-block-prepare | ctx:Ctx state params:Ms20VoiceParams -- | 0.0 -> params.bleed 1.0 1.0 6.283185307179586 15.0 f* ctx.inv-sr f* f+ f/ -> params.dro-a params.lpf-pr& 0.1 ag 0.2 f* f+ ms20-lpf-set-offs + ( the patch panel: is a cord in [SRC and DEST both set], does one + reach HPF CUT [its coefficients then move per sample] ) + 0.0 0.0 4 [ | i on | + i 1.0 f+ + on + params.p-src& i f@i 0.5 0.0 + params.p-dst& i f@i 0.5 0.0 1.0 fsel-lt fsel-lt + fmax ] times nip -> params.bay-on + 0.0 0.0 4 [ | i on | + i 1.0 f+ + on + params.p-src& i f@i 0.5 0.0 + params.p-dst& i f@i 4.0 f- fabs 0.5 1.0 0.0 fsel-lt fsel-lt + fmax ] times nip -> params.bay-hpf ; +( The patch panel's jacks and where they plug in [ms20_voice_probe.fy, + ms20-bay]: a cord's AMT at 1 moves PITCH and VCO2 2 octaves, PW 0.45, + the cutoffs 5 octaves, the VCA's gain by 1, MG FREQ 4 octaves; FLT IN + takes the source as audio into the filters. ) +: ms20-srcs + "OFF" 0.0 opt "FENV" 1.0 opt "AENV" 2.0 opt "AENV-" 3.0 opt "MG" 4.0 opt + "MG PUL" 5.0 opt "S&H" 6.0 opt "NOISE" 7.0 opt "KBD" 8.0 opt "VEL" 9.0 opt + "PRESS" 10.0 opt "VCO1" 11.0 opt "VCO2" 12.0 opt "VCA OUT" 13.0 opt + as-display ; +: ms20-dsts + "OFF" 0.0 opt "PITCH" 1.0 opt "VCO2" 2.0 opt "PW" 3.0 opt "HPF CUT" 4.0 opt + "LPF CUT" 5.0 opt "VCA" 6.0 opt "MG FREQ" 7.0 opt "FLT IN" 8.0 opt + as-display ; + : manifest "SM-24 Mono" voice-sample machine* "k-ms20-voice-sample" render! @@ -73,12 +103,12 @@ dsp: ms20-block-prepare | ctx:Ctx state params:Ms20VoiceParams -- | "HPF" "CUT" "hpf-cutoff" Ms20VoiceParams.hpf-cutoff 20.0 15000.0 20.0 curve-exp knob "HPF" "PEAK" "hpf-resonance" Ms20VoiceParams.hpf-resonance 0.0 2.0 0.0 curve-lin knob - "LPF" "CUT" "cutoff" Ms20VoiceParams.cutoff 20.0 18000.0 700.0 curve-exp knob - "LPF" "PEAK" "resonance" Ms20VoiceParams.resonance 0.0 2.0 0.7 curve-lin knob + "LPF" "CUT" "cutoff" Ms20VoiceParams.cutoff 20.0 18000.0 1200.0 curve-exp knob + "LPF" "PEAK" "resonance" Ms20VoiceParams.resonance 0.0 2.0 1.0 curve-lin knob "LPF" "DRV" "drive" Ms20VoiceParams.drive 0.25 4.0 1.0 curve-exp knob - "LPF" "MODE" "lpf-mode" Ms20VoiceParams.lpf-mode 0 switch - "HOT" 0.0 opt "WET" 1.0 opt - "LPF" "ENV" "env-amount" Ms20VoiceParams.env-amount 0.0 8.0 4.8 curve-lin knob + "LPF" "MODE" "lpf-mode" Ms20VoiceParams.lpf-mode 2 switch + "HOT" 0.0 opt "WET" 1.0 opt "K35" 2.0 opt "OTA" 3.0 opt + "LPF" "ENV" "env-amount" Ms20VoiceParams.env-amount 0.0 8.0 2.0 curve-lin knob "VCA" "LVL" "level" Ms20VoiceParams.level 0.0 1.0 0.44 curve-pow knob "VCA" "AGE" "age" Ms20VoiceParams.age-amt 0.0 1.0 0.4 curve-lin knob @@ -91,8 +121,8 @@ dsp: ms20-block-prepare | ctx:Ctx state params:Ms20VoiceParams -- | "FLT ENV" "DLY" "filter-delay" Ms20VoiceParams.filter-delay 0.0 10.0 0.0 curve-pow knob "FLT ENV" "ATK" "filter-attack" Ms20VoiceParams.filter-attack 0.001 10.0 0.014 curve-exp knob - "FLT ENV" "DEC" "filter-decay" Ms20VoiceParams.filter-decay 0.01 10.0 0.14 curve-exp knob - "FLT ENV" "SUS" "filter-sustain" Ms20VoiceParams.filter-sustain 0.0 1.0 0.18 curve-lin knob + "FLT ENV" "DEC" "filter-decay" Ms20VoiceParams.filter-decay 0.01 10.0 0.3 curve-exp knob + "FLT ENV" "SUS" "filter-sustain" Ms20VoiceParams.filter-sustain 0.0 1.0 0.2 curve-lin knob "FLT ENV" "REL" "filter-release" Ms20VoiceParams.filter-release 0.01 10.0 0.11 curve-exp knob "MG" "FREQ" "mg-freq" Ms20VoiceParams.mg-freq 0.1 20.0 3.0 curve-exp knob @@ -104,6 +134,51 @@ dsp: ms20-block-prepare | ctx:Ctx state params:Ms20VoiceParams -- | "MOD" "EG>PIT" "eg-pitch" Ms20VoiceParams.eg-pitch 0.0 1.0 0.0 curve-pow knob "MOD" "PORTA" "portamento" Ms20VoiceParams.portamento 0.0 10.0 0.0 curve-pow knob + ( ── the patch panel: SRC, DEST, AMT per cord ── ) + "CORD 1" "SRC" "ms20-c1-src" Ms20VoiceParams.p-src 0 + 0 switch ms20-srcs + "CORD 1" "DEST" "ms20-c1-dst" Ms20VoiceParams.p-dst 0 + 0 switch ms20-dsts + "CORD 1" "AMT" "ms20-c1-amt" Ms20VoiceParams.p-amt 0 + -1.0 1.0 0.0 curve-lin knob + "CORD 2" "SRC" "ms20-c2-src" Ms20VoiceParams.p-src 8 + 0 switch ms20-srcs + "CORD 2" "DEST" "ms20-c2-dst" Ms20VoiceParams.p-dst 8 + 0 switch ms20-dsts + "CORD 2" "AMT" "ms20-c2-amt" Ms20VoiceParams.p-amt 8 + -1.0 1.0 0.0 curve-lin knob + "CORD 3" "SRC" "ms20-c3-src" Ms20VoiceParams.p-src 16 + 0 switch ms20-srcs + "CORD 3" "DEST" "ms20-c3-dst" Ms20VoiceParams.p-dst 16 + 0 switch ms20-dsts + "CORD 3" "AMT" "ms20-c3-amt" Ms20VoiceParams.p-amt 16 + -1.0 1.0 0.0 curve-lin knob + "CORD 4" "SRC" "ms20-c4-src" Ms20VoiceParams.p-src 24 + 0 switch ms20-srcs + "CORD 4" "DEST" "ms20-c4-dst" Ms20VoiceParams.p-dst 24 + 0 switch ms20-dsts + "CORD 4" "AMT" "ms20-c4-amt" Ms20VoiceParams.p-amt 24 + -1.0 1.0 0.0 curve-lin knob + "CORD 1" 3 strip "CORD 2" 3 strip "CORD 3" 3 strip "CORD 4" 3 strip + + ( the jacks in the dock, and the knobs a cord can reach [docs/15 §Modulation] ) + "FENV" 1 Ms20VoiceState.flt-env EnvRc.level + 0 mod-source + "AENV" 2 Ms20VoiceState.amp-env EnvRc.level + 0 mod-source + "MG" 4 Ms20VoiceState.jk 32 + 1 mod-source + "MG PUL" 5 Ms20VoiceState.jk 40 + 1 mod-source + "S&H" 6 Ms20VoiceState.sh 1 mod-source + "NOISE" 7 Ms20VoiceState.jk 56 + 1 mod-source + "KBD" 8 Ms20VoiceState.jk 64 + 1 mod-source + "VEL" 9 Ms20VoiceState.vel 0 mod-source + "PRESS" 10 Ms20VoiceState.press 0 mod-source + "VCO1" 11 Ms20VoiceState.jk 88 + 1 mod-source + "VCO2" 12 Ms20VoiceState.jk 96 + 1 mod-source + "VCA OUT" 13 Ms20VoiceState.jk 104 + 1 mod-source + "detune" 2 Ms20VoiceState.det-v mod-dest + "pulse-width" 3 Ms20VoiceState.pw-v mod-dest + "hpf-cutoff" 4 Ms20VoiceState.hpf-hz mod-dest + "cutoff" 5 Ms20VoiceState.cut-hz mod-dest + "level" 6 Ms20VoiceState.vca-v mod-dest + "mg-freq" 7 Ms20VoiceState.mg-hz mod-dest + ( the MS-20's normalled routes, as fixed rows ) + "env-amount" 1 5 mod-fixed ( FENV -> LPF CUT ) + "mg-cutoff" 4 5 mod-fixed ( MG -> LPF CUT ) + "eg-pitch" 1 1 mod-fixed ( FENV -> PITCH ) + "mg-pitch" 4 1 mod-fixed ( MG -> PITCH ) + "mg-pw" 4 3 mod-fixed ( MG -> PW ) + "ms20-c" 4 mod-matrix + "PATCH DOCK" mod-dock + "CORDS" matrix-display + "SCOPE" scope-display + ( The MS-20 face in two rows: the signal path left to right over the modulation section. Waves and scales are LED lists. ) "VCO1" 2 strip @@ -120,6 +195,9 @@ dsp: ms20-block-prepare | ctx:Ctx state params:Ms20VoiceParams -- | ( built-in visualizer cell [docs/15]; comma-separated sources overlay ) "EG" "FLT ENV,AMP ENV" adsr-display + "PANEL" page + 0.16 row + 1.0 cell "PATCH DOCK" 1.0 item 1.0 row 1.0 cell "VCO1" 1.0 item 1.0 cell "VCO2" 1.0 item @@ -133,6 +211,13 @@ dsp: ms20-block-prepare | ctx:Ctx state params:Ms20VoiceParams -- | 1.0 cell "FLT ENV" 1.0 item 1.0 cell "AMP ENV" 1.0 item 4.0 cell "EG" 1.0 item + ( the patch panel: drag a jack onto a ringed knob, or onto a cord ) + "PATCH" page + 0.16 row + 1.0 cell "PATCH DOCK" 1.0 item + 1.0 row + 2.0 cell "CORDS" 1.0 item + 1.0 cell "SCOPE" 1.0 item machine-desc ; diff --git a/machines/ms20/presets/k35-round-bass.preset b/machines/ms20/presets/k35-round-bass.preset new file mode 100644 index 00000000..e2a00bb0 --- /dev/null +++ b/machines/ms20/presets/k35-round-bass.preset @@ -0,0 +1 @@ +{"slab": "preset", "schema": 1, "machine": "ms20", "note": "K35 bass: full low end, a gentle peak, short EG2 sweep", "params": {"vco1-wave": 1, "vco-octave": 2, "vco2-wave": 1, "vco2-octave": 0, "detune": 0.07, "pulse-width": 0.7, "saw-level": 0.8, "pulse-level": 0.5, "noise-level": 0, "hpf-cutoff": 20, "hpf-resonance": 0, "cutoff": 420, "resonance": 1.0, "drive": 1.2, "lpf-mode": 2, "env-amount": 2.5, "level": 0.5, "amp-attack": 0.002, "amp-decay": 0.4, "amp-sustain": 0.7, "amp-release": 0.08, "filter-attack": 0.002, "filter-decay": 0.25, "filter-sustain": 0.1, "filter-release": 0.15, "mg-freq": 5.0, "mg-wave": 0.5, "mg-pitch": 0, "mg-pw": 0, "mg-cutoff": 0, "eg-pitch": 0}} \ No newline at end of file diff --git a/machines/ms20/presets/k35-scream.preset b/machines/ms20/presets/k35-scream.preset new file mode 100644 index 00000000..b37dec8c --- /dev/null +++ b/machines/ms20/presets/k35-scream.preset @@ -0,0 +1 @@ +{"slab": "preset", "schema": 1, "machine": "ms20", "note": "K35 filters both peaked and driven: the early MS-20 scream", "params": {"vco1-wave": 1, "vco-octave": 2, "vco2-wave": 0, "vco2-octave": 1, "detune": 0.12, "pulse-width": 0.7, "saw-level": 0.8, "pulse-level": 0.6, "noise-level": 0, "hpf-cutoff": 300, "hpf-resonance": 1.4, "cutoff": 1500, "resonance": 1.65, "drive": 2.2, "lpf-mode": 2, "env-amount": 2.0, "level": 0.5, "amp-attack": 0.005, "amp-decay": 0.3, "amp-sustain": 0.85, "amp-release": 0.25, "filter-attack": 0.002, "filter-decay": 0.6, "filter-sustain": 0.4, "filter-release": 0.15, "mg-freq": 5.5, "mg-wave": 0.5, "mg-pitch": 0.004, "mg-pw": 0, "mg-cutoff": 0, "eg-pitch": 0}} \ No newline at end of file diff --git a/machines/ms20/presets/ota-singing-lead.preset b/machines/ms20/presets/ota-singing-lead.preset new file mode 100644 index 00000000..efad335d --- /dev/null +++ b/machines/ms20/presets/ota-singing-lead.preset @@ -0,0 +1 @@ +{"slab": "preset", "schema": 1, "machine": "ms20", "note": "OTA LPF, peak high and clean: the later MS-20, symmetric and singing", "params": {"vco1-wave": 1, "vco-octave": 2, "vco2-wave": 0, "vco2-octave": 2, "detune": 0.1, "pulse-width": 0.7, "saw-level": 0.8, "pulse-level": 0.45, "noise-level": 0, "hpf-cutoff": 120, "hpf-resonance": 0.8, "cutoff": 1100, "resonance": 1.5, "drive": 1.0, "lpf-mode": 3, "env-amount": 2.2, "level": 0.3, "amp-attack": 0.005, "amp-decay": 0.3, "amp-sustain": 0.85, "amp-release": 0.25, "filter-attack": 0.002, "filter-decay": 0.5, "filter-sustain": 0.35, "filter-release": 0.15, "mg-freq": 5.2, "mg-wave": 0.5, "mg-pitch": 0.004, "mg-pw": 0, "mg-cutoff": 0, "eg-pitch": 0, "portamento": 0.06}} \ No newline at end of file diff --git a/machines/ms20/presets/patch-feedback-growl.preset b/machines/ms20/presets/patch-feedback-growl.preset new file mode 100644 index 00000000..533df8ed --- /dev/null +++ b/machines/ms20/presets/patch-feedback-growl.preset @@ -0,0 +1 @@ +{"slab": "preset", "schema": 1, "machine": "ms20", "note": "VCA OUT back into FLT IN: the OTA growls and sings as the note swells", "params": {"vco1-wave": 1, "vco-octave": 2, "vco2-wave": 1, "vco2-octave": 0, "detune": 0.07, "pulse-width": 0.7, "saw-level": 0.8, "pulse-level": 0.5, "noise-level": 0, "hpf-cutoff": 20, "hpf-resonance": 0, "cutoff": 500, "resonance": 1.3, "drive": 1.5, "lpf-mode": 3, "env-amount": 2.5, "level": 0.32, "amp-attack": 0.002, "amp-decay": 0.4, "amp-sustain": 0.8, "amp-release": 0.08, "filter-attack": 0.002, "filter-decay": 0.4, "filter-sustain": 0.3, "filter-release": 0.15, "mg-freq": 5.0, "mg-wave": 0.5, "mg-pitch": 0, "mg-pw": 0, "mg-cutoff": 0, "eg-pitch": 0, "age": 0.4, "portamento": 0, "filter-delay": 0, "amp-hold": 0, "ms20-c1-src": 13, "ms20-c1-dst": 8, "ms20-c1-amt": 0.9, "ms20-c2-src": 2, "ms20-c2-dst": 5, "ms20-c2-amt": 0.25, "ms20-c3-src": 0, "ms20-c3-dst": 0, "ms20-c3-amt": 0.0, "ms20-c4-src": 0, "ms20-c4-dst": 0, "ms20-c4-amt": 0.0}} \ No newline at end of file diff --git a/machines/ms20/presets/patch-fm-metal-bass.preset b/machines/ms20/presets/patch-fm-metal-bass.preset new file mode 100644 index 00000000..f394efa1 --- /dev/null +++ b/machines/ms20/presets/patch-fm-metal-bass.preset @@ -0,0 +1 @@ +{"slab": "preset", "schema": 1, "machine": "ms20", "note": "VCO2 a fifth up into LPF CUT at audio rate: a metallic, clangy bass", "params": {"vco1-wave": 1, "vco-octave": 2, "vco2-wave": 0, "vco2-octave": 0, "detune": 7.0, "pulse-width": 0.7, "saw-level": 0.8, "pulse-level": 0.3, "noise-level": 0, "hpf-cutoff": 20, "hpf-resonance": 0, "cutoff": 500, "resonance": 1.1, "drive": 1.2, "lpf-mode": 2, "env-amount": 2.0, "level": 0.64, "amp-attack": 0.002, "amp-decay": 0.4, "amp-sustain": 0.7, "amp-release": 0.08, "filter-attack": 0.002, "filter-decay": 0.25, "filter-sustain": 0.1, "filter-release": 0.15, "mg-freq": 5.0, "mg-wave": 0.5, "mg-pitch": 0, "mg-pw": 0, "mg-cutoff": 0, "eg-pitch": 0, "age": 0.4, "portamento": 0, "filter-delay": 0, "amp-hold": 0, "ms20-c1-src": 12, "ms20-c1-dst": 5, "ms20-c1-amt": 0.25, "ms20-c2-src": 0, "ms20-c2-dst": 0, "ms20-c2-amt": 0.0, "ms20-c3-src": 0, "ms20-c3-dst": 0, "ms20-c3-amt": 0.0, "ms20-c4-src": 0, "ms20-c4-dst": 0, "ms20-c4-amt": 0.0}} \ No newline at end of file diff --git a/machines/ms20/presets/patch-sh-bubbles.preset b/machines/ms20/presets/patch-sh-bubbles.preset new file mode 100644 index 00000000..320c1c58 --- /dev/null +++ b/machines/ms20/presets/patch-sh-bubbles.preset @@ -0,0 +1 @@ +{"slab": "preset", "schema": 1, "machine": "ms20", "note": "S&H on LPF CUT, clocked by the MG: random bubbling under a peaked K35", "params": {"vco1-wave": 2, "vco-octave": 2, "vco2-wave": 1, "vco2-octave": 0, "detune": 0.07, "pulse-width": 0.6, "saw-level": 0.8, "pulse-level": 0.0, "noise-level": 0, "hpf-cutoff": 20, "hpf-resonance": 0, "cutoff": 700, "resonance": 1.5, "drive": 1.2, "lpf-mode": 2, "env-amount": 1.0, "level": 0.45, "amp-attack": 0.002, "amp-decay": 0.3, "amp-sustain": 0.8, "amp-release": 0.08, "filter-attack": 0.002, "filter-decay": 0.2, "filter-sustain": 0.3, "filter-release": 0.15, "mg-freq": 7.0, "mg-wave": 0.5, "mg-pitch": 0, "mg-pw": 0, "mg-cutoff": 0, "eg-pitch": 0, "age": 0.4, "portamento": 0, "filter-delay": 0, "amp-hold": 0, "ms20-c1-src": 6, "ms20-c1-dst": 5, "ms20-c1-amt": 0.3, "ms20-c2-src": 0, "ms20-c2-dst": 0, "ms20-c2-amt": 0.0, "ms20-c3-src": 0, "ms20-c3-dst": 0, "ms20-c3-amt": 0.0, "ms20-c4-src": 0, "ms20-c4-dst": 0, "ms20-c4-amt": 0.0}} \ No newline at end of file diff --git a/machines/ms20/presets/patch-tracking-lead.preset b/machines/ms20/presets/patch-tracking-lead.preset new file mode 100644 index 00000000..bdde9219 --- /dev/null +++ b/machines/ms20/presets/patch-tracking-lead.preset @@ -0,0 +1 @@ +{"slab": "preset", "schema": 1, "machine": "ms20", "note": "KBD on LPF CUT for full tracking, MG on PITCH for a slow vibrato, PRESS opens it", "params": {"vco1-wave": 1, "vco-octave": 3, "vco2-wave": 1, "vco2-octave": 2, "detune": 0.08, "pulse-width": 0.7, "saw-level": 0.8, "pulse-level": 0.5, "noise-level": 0, "hpf-cutoff": 20, "hpf-resonance": 0, "cutoff": 900, "resonance": 1.2, "drive": 1.2, "lpf-mode": 2, "env-amount": 1.5, "level": 0.4, "amp-attack": 0.002, "amp-decay": 0.4, "amp-sustain": 0.9, "amp-release": 0.25, "filter-attack": 0.002, "filter-decay": 0.5, "filter-sustain": 0.4, "filter-release": 0.15, "mg-freq": 5.5, "mg-wave": 0.5, "mg-pitch": 0, "mg-pw": 0, "mg-cutoff": 0, "eg-pitch": 0, "age": 0.4, "portamento": 0.06, "filter-delay": 0, "amp-hold": 0, "ms20-c1-src": 8, "ms20-c1-dst": 5, "ms20-c1-amt": 0.2, "ms20-c2-src": 4, "ms20-c2-dst": 1, "ms20-c2-amt": 0.006, "ms20-c3-src": 10, "ms20-c3-dst": 5, "ms20-c3-amt": 0.3, "ms20-c4-src": 0, "ms20-c4-dst": 0, "ms20-c4-amt": 0.0}} \ No newline at end of file diff --git a/machines/ms20/presets/patch-vowel-sweep.preset b/machines/ms20/presets/patch-vowel-sweep.preset new file mode 100644 index 00000000..23c63015 --- /dev/null +++ b/machines/ms20/presets/patch-vowel-sweep.preset @@ -0,0 +1 @@ +{"slab": "preset", "schema": 1, "machine": "ms20", "note": "FENV on HPF CUT with both filters peaked: a talking band-pass sweep", "params": {"vco1-wave": 1, "vco-octave": 3, "vco2-wave": 1, "vco2-octave": 2, "detune": 0.07, "pulse-width": 0.7, "saw-level": 0.8, "pulse-level": 0.5, "noise-level": 0, "hpf-cutoff": 140, "hpf-resonance": 1.6, "cutoff": 1400, "resonance": 1.6, "drive": 1.6, "lpf-mode": 2, "env-amount": 0.8, "level": 1.0, "amp-attack": 0.002, "amp-decay": 0.4, "amp-sustain": 0.8, "amp-release": 0.08, "filter-attack": 0.002, "filter-decay": 0.6, "filter-sustain": 0.2, "filter-release": 0.15, "mg-freq": 5.0, "mg-wave": 0.5, "mg-pitch": 0, "mg-pw": 0, "mg-cutoff": 0, "eg-pitch": 0, "age": 0.4, "portamento": 0, "filter-delay": 0, "amp-hold": 0, "ms20-c1-src": 1, "ms20-c1-dst": 4, "ms20-c1-amt": 0.45, "ms20-c2-src": 0, "ms20-c2-dst": 0, "ms20-c2-amt": 0.0, "ms20-c3-src": 0, "ms20-c3-dst": 0, "ms20-c3-amt": 0.0, "ms20-c4-src": 0, "ms20-c4-dst": 0, "ms20-c4-amt": 0.0}} \ No newline at end of file diff --git a/songs/k35_night_run.py b/songs/k35_night_run.py new file mode 100644 index 00000000..79ce25b8 --- /dev/null +++ b/songs/k35_night_run.py @@ -0,0 +1,58 @@ +"""K35 Night Run — a 122 BPM listening test for the SM-24 Mono's K35/OTA filters. + +Generate: PYTHONPATH=tools python3 songs/k35_night_run.py +Render: ... --render + +The bass plays alone for four bars, then the drums come in and the K35's +CUT opens over eight bars while PEAK climbs. The last eight bars add an +OTA lead and the k35-scream lead, both filters peaked. +""" +import argparse +from slabkit import Song, fx + +song = Song("K35 Night Run", bpm=122, key="A minor") +intro = song.section("BASS ALONE", 4) +groove = song.section("OPENING UP", 8) +scream = song.section("SCREAM", 8) + +kit = song.track("DRUMS", "drum2", "tough-night-kit", volume=0.8, + fx=[fx("comp2", "dry-drum-punch")]) +bass = song.track("K35 BASS", "ms20", "k35-round-bass", volume=0.62, + fx=[fx("eq2", hpf_on="ON", hpf_hz=34)], + params=dict(lpf_mode="K35", cutoff=380, resonance=1.0, + drive=1.6, env_amount=2.6, filter_decay=0.18, + filter_sustain=0.05, age=0.3)) +lead = song.track("OTA LEAD", "ms20", "ota-singing-lead", volume=0.75, pan=-0.15, + fx=[fx("delay2", mix=0.22)]) +scr = song.track("K35 SCREAM", "ms20", "k35-scream", volume=0.7, pan=0.15, + fx=[fx("verb2", mix=0.18)]) + +song.master(fx=[fx("comp2", "gentle-bus-glue"), fx("limiter2", gain=5, ceil=-1)]) + +LINE = ("A1! . A1 A2 . A1 G1~ A1 . A1 C2 . A1! . E2 D2 |" + " A1! . A1 A2 . A1 G1~ A1 . C2 . E2! . G2 . E2") +for sec in (intro, groove, scream): + bass.clip(sec).seq(LINE, gate=0.55).repeat(8) + +for sec in (groove, scream): + kit.clip(sec).drums({"kick": "x...x...x...x...", + "snare": "....x.......x...", + "ch": "..x...x...x...x.", + "oh": "..............x."}, bars=8) + +# CUT opens and PEAK climbs over the groove; the scream section keeps them up +g0 = groove.start * 4 +bass.ramp("cutoff", g0, g0 + 32, 380, 1400, tension=-0.3) +bass.ramp("resonance", g0, g0 + 32, 1.0, 1.55) + +lead.clip(scream).melody("E5:1.5 D5:.5 C5:1 B4:1 | A4:2 r:1 C5:1 | " + "E5:1.5 G5:.5 E5:1 D5:1 | C5:3 r:1") +scr.clip(scream, bars=4, at_bar=4).melody("A5:2 G5:1 E5:1 | A5:3 r:1") + +if __name__ == "__main__": + ap = argparse.ArgumentParser() + ap.add_argument("--render", action="store_true") + a = ap.parse_args() + song.save() + if a.render: + song.render() diff --git a/songs/k35_night_run.slab/project.json b/songs/k35_night_run.slab/project.json new file mode 100644 index 00000000..9b6dd159 --- /dev/null +++ b/songs/k35_night_run.slab/project.json @@ -0,0 +1,2813 @@ +{ + "slab": "project", + "schema": 1, + "transport": { + "bpm": 122.0, + "loop": { + "on": false, + "start": 0.0, + "end": 80.0 + } + }, + "meter": [ + { + "bar": 0, + "num": 4, + "den": 4 + } + ], + "sections": [ + { + "beat": 0.0, + "name": "BASS ALONE", + "color": 4 + }, + { + "beat": 16.0, + "name": "OPENING UP", + "color": 5 + }, + { + "beat": 48.0, + "name": "SCREAM", + "color": 6 + } + ], + "end": 80.0, + "tracks": [ + { + "name": "DRUMS", + "color": [ + 230, + 90, + 120 + ], + "volume": 0.8, + "pan": 0.0, + "mute": false, + "solo": false, + "instrument": { + "machine": "drum2", + "params": { + "kick-tune": 50, + "kick-sweep": 5, + "kick-bend": 0.04, + "kick-decay": 0.3, + "kick-click": 0.5, + "kick-drive": 2.2, + "kick-level": 0.9, + "snare-tune": 185, + "snare-decay": 0.13, + "snare-snap": 0.85, + "snare-sdec": 0.08, + "snare-tone": 2000, + "snare-level": 0.85, + "clap-tone": 1200, + "clap-spread": 0.01, + "clap-decay": 0.2, + "clap-level": 0.8, + "hat-tune": 1.05, + "hat-tone": 1.0, + "hat-chdec": 0.045, + "hat-ohdec": 0.4, + "hat-level": 0.85, + "tom-tune": 120, + "tom-sweep": 1.2, + "tom-decay": 0.25, + "tom-drive": 1.4, + "tom-level": 0.82, + "master-accent": 0.7, + "master-drive": 1.7, + "master-level": 0.9 + }, + "preset": "tough-night-kit" + }, + "effects": [ + { + "machine": "comp2", + "params": { + "comp-thresh": -15.8, + "comp-ratio": 4, + "comp-knee": 4, + "comp-atk": 0.01, + "comp-rel": 0.06, + "comp-hpf": 20, + "comp-det": 0, + "comp-makeup": 3.4, + "comp-mix": 1 + }, + "bypass": false, + "preset": "dry-drum-punch" + } + ], + "clips": [ + { + "type": "note", + "name": "OPENING UP", + "start": 16.0, + "len": 32.0, + "notes": [ + { + "pitch": 36, + "start": 0.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 0.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 1.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 2.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 2.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 3.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 3.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 4.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 4.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 5.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 6.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 6.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 7.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 7.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 8.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 8.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 9.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 10.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 10.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 11.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 11.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 12.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 12.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 13.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 14.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 14.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 15.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 15.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 16.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 16.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 17.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 17.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 17.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 18.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 18.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 19.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 19.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 19.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 19.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 20.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 20.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 21.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 21.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 21.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 22.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 22.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 23.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 23.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 23.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 23.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 24.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 24.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 25.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 25.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 25.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 26.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 26.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 27.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 27.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 27.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 27.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 28.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 28.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 29.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 29.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 29.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 30.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 30.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 31.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 31.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 31.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 31.5, + "len": 0.1, + "vel": 100 + } + ] + }, + { + "type": "note", + "name": "SCREAM", + "start": 48.0, + "len": 32.0, + "notes": [ + { + "pitch": 36, + "start": 0.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 0.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 1.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 2.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 2.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 3.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 3.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 4.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 4.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 5.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 6.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 6.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 7.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 7.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 8.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 8.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 9.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 10.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 10.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 11.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 11.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 12.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 12.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 13.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 14.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 14.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 15.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 15.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 16.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 16.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 17.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 17.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 17.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 18.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 18.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 19.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 19.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 19.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 19.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 20.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 20.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 21.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 21.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 21.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 22.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 22.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 23.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 23.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 23.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 23.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 24.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 24.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 25.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 25.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 25.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 26.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 26.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 27.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 27.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 27.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 27.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 28.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 28.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 29.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 29.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 29.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 30.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 30.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 31.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 31.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 31.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 31.5, + "len": 0.1, + "vel": 100 + } + ] + } + ] + }, + { + "name": "K35 BASS", + "color": [ + 64, + 206, + 174 + ], + "volume": 0.62, + "pan": 0.0, + "mute": false, + "solo": false, + "instrument": { + "machine": "ms20", + "params": { + "vco1-wave": 1, + "vco-octave": 2, + "vco2-wave": 1, + "vco2-octave": 0, + "detune": 0.07, + "pulse-width": 0.7, + "saw-level": 0.8, + "pulse-level": 0.5, + "noise-level": 0, + "hpf-cutoff": 20, + "hpf-resonance": 0, + "cutoff": 380, + "resonance": 1.0, + "drive": 1.6, + "lpf-mode": 2, + "env-amount": 2.6, + "level": 0.5, + "amp-attack": 0.002, + "amp-decay": 0.4, + "amp-sustain": 0.7, + "amp-release": 0.08, + "filter-attack": 0.002, + "filter-decay": 0.18, + "filter-sustain": 0.05, + "filter-release": 0.15, + "mg-freq": 5.0, + "mg-wave": 0.5, + "mg-pitch": 0, + "mg-pw": 0, + "mg-cutoff": 0, + "eg-pitch": 0, + "age": 0.3 + }, + "preset": "k35-round-bass" + }, + "effects": [ + { + "machine": "eq2", + "params": { + "eq-hpf-on": 1, + "eq-hpf-hz": 34 + }, + "bypass": false + } + ], + "clips": [ + { + "type": "note", + "name": "BASS ALONE", + "start": 0.0, + "len": 16.0, + "notes": [ + { + "pitch": 33, + "start": 0.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 0.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 0.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 1.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 1.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 1.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 2.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 2.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 3.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 40, + "start": 3.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 38, + "start": 3.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 4.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 4.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 4.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 5.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 5.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 5.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 6.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 6.75, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 43, + "start": 7.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 7.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 8.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 8.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 8.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 9.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 9.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 9.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 10.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 10.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 11.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 40, + "start": 11.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 38, + "start": 11.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 12.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 12.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 12.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 13.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 13.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 13.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 14.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 14.75, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 43, + "start": 15.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 15.75, + "len": 0.1375, + "vel": 96 + } + ] + }, + { + "type": "note", + "name": "OPENING UP", + "start": 16.0, + "len": 32.0, + "notes": [ + { + "pitch": 33, + "start": 0.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 0.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 0.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 1.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 1.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 1.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 2.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 2.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 3.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 40, + "start": 3.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 38, + "start": 3.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 4.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 4.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 4.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 5.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 5.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 5.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 6.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 6.75, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 43, + "start": 7.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 7.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 8.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 8.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 8.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 9.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 9.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 9.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 10.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 10.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 11.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 40, + "start": 11.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 38, + "start": 11.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 12.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 12.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 12.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 13.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 13.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 13.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 14.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 14.75, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 43, + "start": 15.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 15.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 16.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 16.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 16.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 17.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 17.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 17.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 18.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 18.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 19.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 40, + "start": 19.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 38, + "start": 19.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 20.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 20.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 20.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 21.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 21.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 21.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 22.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 22.75, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 43, + "start": 23.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 23.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 24.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 24.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 24.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 25.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 25.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 25.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 26.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 26.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 27.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 40, + "start": 27.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 38, + "start": 27.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 28.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 28.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 28.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 29.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 29.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 29.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 30.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 30.75, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 43, + "start": 31.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 31.75, + "len": 0.1375, + "vel": 96 + } + ] + }, + { + "type": "note", + "name": "SCREAM", + "start": 48.0, + "len": 32.0, + "notes": [ + { + "pitch": 33, + "start": 0.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 0.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 0.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 1.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 1.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 1.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 2.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 2.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 3.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 40, + "start": 3.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 38, + "start": 3.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 4.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 4.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 4.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 5.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 5.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 5.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 6.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 6.75, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 43, + "start": 7.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 7.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 8.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 8.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 8.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 9.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 9.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 9.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 10.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 10.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 11.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 40, + "start": 11.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 38, + "start": 11.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 12.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 12.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 12.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 13.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 13.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 13.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 14.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 14.75, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 43, + "start": 15.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 15.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 16.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 16.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 16.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 17.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 17.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 17.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 18.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 18.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 19.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 40, + "start": 19.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 38, + "start": 19.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 20.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 20.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 20.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 21.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 21.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 21.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 22.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 22.75, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 43, + "start": 23.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 23.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 24.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 24.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 24.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 25.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 25.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 25.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 26.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 26.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 27.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 40, + "start": 27.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 38, + "start": 27.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 28.0, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 33, + "start": 28.5, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 45, + "start": 28.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 33, + "start": 29.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 31, + "start": 29.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 29.75, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 36, + "start": 30.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 30.75, + "len": 0.1375, + "vel": 124 + }, + { + "pitch": 43, + "start": 31.25, + "len": 0.1375, + "vel": 96 + }, + { + "pitch": 40, + "start": 31.75, + "len": 0.1375, + "vel": 96 + } + ] + } + ], + "automation": [ + { + "target": "inst:cutoff", + "points": [ + [ + 64.0, + 380, + "curve", + -0.3 + ], + [ + 96.0, + 1400 + ] + ] + }, + { + "target": "inst:resonance", + "points": [ + [ + 64.0, + 1.0 + ], + [ + 96.0, + 1.55 + ] + ] + } + ] + }, + { + "name": "OTA LEAD", + "color": [ + 150, + 110, + 230 + ], + "volume": 0.75, + "pan": -0.15, + "mute": false, + "solo": false, + "instrument": { + "machine": "ms20", + "params": { + "vco1-wave": 1, + "vco-octave": 2, + "vco2-wave": 0, + "vco2-octave": 2, + "detune": 0.1, + "pulse-width": 0.7, + "saw-level": 0.8, + "pulse-level": 0.45, + "noise-level": 0, + "hpf-cutoff": 120, + "hpf-resonance": 0.8, + "cutoff": 1100, + "resonance": 1.5, + "drive": 1.0, + "lpf-mode": 3, + "env-amount": 2.2, + "level": 0.3, + "amp-attack": 0.005, + "amp-decay": 0.3, + "amp-sustain": 0.85, + "amp-release": 0.25, + "filter-attack": 0.002, + "filter-decay": 0.5, + "filter-sustain": 0.35, + "filter-release": 0.15, + "mg-freq": 5.2, + "mg-wave": 0.5, + "mg-pitch": 0.004, + "mg-pw": 0, + "mg-cutoff": 0, + "eg-pitch": 0, + "portamento": 0.06 + }, + "preset": "ota-singing-lead" + }, + "effects": [ + { + "machine": "delay2", + "params": { + "delay-mix": 0.22 + }, + "bypass": false + } + ], + "clips": [ + { + "type": "note", + "name": "SCREAM", + "start": 48.0, + "len": 32.0, + "notes": [ + { + "pitch": 76, + "start": 0.0, + "len": 1.425, + "vel": 100 + }, + { + "pitch": 74, + "start": 1.5, + "len": 0.475, + "vel": 100 + }, + { + "pitch": 72, + "start": 2.0, + "len": 0.95, + "vel": 100 + }, + { + "pitch": 71, + "start": 3.0, + "len": 0.95, + "vel": 100 + }, + { + "pitch": 69, + "start": 4.0, + "len": 1.9, + "vel": 100 + }, + { + "pitch": 72, + "start": 7.0, + "len": 0.95, + "vel": 100 + }, + { + "pitch": 76, + "start": 8.0, + "len": 1.425, + "vel": 100 + }, + { + "pitch": 79, + "start": 9.5, + "len": 0.475, + "vel": 100 + }, + { + "pitch": 76, + "start": 10.0, + "len": 0.95, + "vel": 100 + }, + { + "pitch": 74, + "start": 11.0, + "len": 0.95, + "vel": 100 + }, + { + "pitch": 72, + "start": 12.0, + "len": 2.85, + "vel": 100 + } + ] + } + ] + }, + { + "name": "K35 SCREAM", + "color": [ + 250, + 190, + 80 + ], + "volume": 0.7, + "pan": 0.15, + "mute": false, + "solo": false, + "instrument": { + "machine": "ms20", + "params": { + "vco1-wave": 1, + "vco-octave": 2, + "vco2-wave": 0, + "vco2-octave": 1, + "detune": 0.12, + "pulse-width": 0.7, + "saw-level": 0.8, + "pulse-level": 0.6, + "noise-level": 0, + "hpf-cutoff": 300, + "hpf-resonance": 1.4, + "cutoff": 1500, + "resonance": 1.65, + "drive": 2.2, + "lpf-mode": 2, + "env-amount": 2.0, + "level": 0.5, + "amp-attack": 0.005, + "amp-decay": 0.3, + "amp-sustain": 0.85, + "amp-release": 0.25, + "filter-attack": 0.002, + "filter-decay": 0.6, + "filter-sustain": 0.4, + "filter-release": 0.15, + "mg-freq": 5.5, + "mg-wave": 0.5, + "mg-pitch": 0.004, + "mg-pw": 0, + "mg-cutoff": 0, + "eg-pitch": 0 + }, + "preset": "k35-scream" + }, + "effects": [ + { + "machine": "verb2", + "params": { + "verb-mix": 0.18 + }, + "bypass": false + } + ], + "clips": [ + { + "type": "note", + "name": "SCREAM", + "start": 64.0, + "len": 16.0, + "notes": [ + { + "pitch": 81, + "start": 0.0, + "len": 1.9, + "vel": 100 + }, + { + "pitch": 79, + "start": 2.0, + "len": 0.95, + "vel": 100 + }, + { + "pitch": 76, + "start": 3.0, + "len": 0.95, + "vel": 100 + }, + { + "pitch": 81, + "start": 4.0, + "len": 2.85, + "vel": 100 + } + ] + } + ] + } + ], + "master": { + "volume": 1.0, + "pan": 0.0, + "subsonic": false, + "effects": [ + { + "machine": "comp2", + "params": { + "comp-thresh": -14.1, + "comp-ratio": 2, + "comp-knee": 9, + "comp-atk": 0.03, + "comp-rel": 0.2, + "comp-hpf": 90, + "comp-det": 0, + "comp-makeup": 1.3, + "comp-mix": 1 + }, + "bypass": false, + "preset": "gentle-bus-glue" + }, + { + "machine": "limiter2", + "params": { + "lim-gain": 5, + "lim-ceil": -1 + }, + "bypass": false + } + ] + } +} \ No newline at end of file diff --git a/songs/ms20_patch_bay.py b/songs/ms20_patch_bay.py new file mode 100644 index 00000000..11f318c7 --- /dev/null +++ b/songs/ms20_patch_bay.py @@ -0,0 +1,62 @@ +"""MS-20 Patch Bay — a 118 BPM tour of the SM-24 Mono's patch cords. + +Generate: PYTHONPATH=tools python3 songs/ms20_patch_bay.py +Render: ... --render + +Every part is an SM-24 Mono with cords in (PATCH page): + METAL VCO2 a fifth up into LPF CUT at audio rate patch-fm-metal-bass + BUBBLES S&H on LPF CUT, clocked by the MG patch-sh-bubbles + GROWL VCA OUT back into FLT IN patch-feedback-growl + VOWEL FENV on HPF CUT, both filters peaked patch-vowel-sweep + LEAD KBD tracking + MG vibrato patch-tracking-lead +""" +import argparse +from slabkit import Song, fx + +song = Song("MS-20 Patch Bay", bpm=118, key="D minor") +metal = song.section("METAL", 4) +bubbles = song.section("BUBBLES", 4) +growl = song.section("GROWL", 4) +vowel = song.section("VOWEL", 8) + +kit = song.track("DRUMS", "drum2", "dry-punch-kit", volume=0.75, + fx=[fx("comp2", "dry-drum-punch")]) +bass = song.track("METAL BASS", "ms20", "patch-fm-metal-bass", volume=0.7, + fx=[fx("eq2", hpf_on="ON", hpf_hz=30)]) +bub = song.track("BUBBLES", "ms20", "patch-sh-bubbles", volume=0.55, pan=-0.3, + fx=[fx("delay2", mix=0.25)]) +grr = song.track("GROWL", "ms20", "patch-feedback-growl", volume=0.55, pan=0.25, + fx=[fx("verb2", mix=0.15)]) +vow = song.track("VOWEL", "ms20", "patch-vowel-sweep", volume=0.6, pan=0.15, + fx=[fx("delay2", mix=0.2)]) +lead = song.track("LEAD", "ms20", "patch-tracking-lead", volume=0.6, pan=-0.1, + fx=[fx("verb2", mix=0.2)]) + +song.master(fx=[fx("comp2", "gentle-bus-glue"), fx("limiter2", gain=4, ceil=-1)]) + +LINE = "D1! . D1 D2 . D1 F1 . D1! . C2 . A1 . G1 F1" +for sec in (metal, bubbles, growl, vowel): + bass.clip(sec).seq(LINE, gate=0.5).repeat(4 if sec is not vowel else 8) + kit.clip(sec).drums({"kick": "x...x...x...x...", + "snare": "....x.......x...", + "ch": "x.xxx.x.x.xxx.x.", + "oh": "......x.......x."}, bars=sec.bars) + +# long notes: the S&H bubbles under them +for sec in (bubbles, growl, vowel): + bub.clip(sec).melody("D4:4 | F4:4 | A3:4 | C4:4") +# the feedback loop swells on held notes +grr.clip(growl).melody("D3:2 F3:2 | A3:3 G3:1 | F3:2 E3:2 | D3:4") +# talking stabs, then the tracking lead over them +vow.clip(vowel).seq("D3 . . D3 . . F3 . . . A3 . . . C4 . |" + " D3 . . D3 . . F3 . . . G3 . . . E3 .", gate=0.6).repeat(4) +lead.clip(vowel, bars=4, at_bar=4).melody("A4:1.5 G4:.5 F4:1 E4:1 | D4:2 F4:1 A4:1 | " + "C5:1.5 A4:.5 G4:1 F4:1 | E4:3 r:1") + +if __name__ == "__main__": + ap = argparse.ArgumentParser() + ap.add_argument("--render", action="store_true") + a = ap.parse_args() + song.save() + if a.render: + song.render() diff --git a/songs/ms_20_patch_bay.slab/project.json b/songs/ms_20_patch_bay.slab/project.json new file mode 100644 index 00000000..5acfbae5 --- /dev/null +++ b/songs/ms_20_patch_bay.slab/project.json @@ -0,0 +1,4422 @@ +{ + "slab": "project", + "schema": 1, + "transport": { + "bpm": 118.0, + "loop": { + "on": false, + "start": 0.0, + "end": 80.0 + } + }, + "meter": [ + { + "bar": 0, + "num": 4, + "den": 4 + } + ], + "sections": [ + { + "beat": 0.0, + "name": "METAL", + "color": 4 + }, + { + "beat": 16.0, + "name": "BUBBLES", + "color": 5 + }, + { + "beat": 32.0, + "name": "GROWL", + "color": 6 + }, + { + "beat": 48.0, + "name": "VOWEL", + "color": 7 + } + ], + "end": 80.0, + "tracks": [ + { + "name": "DRUMS", + "color": [ + 230, + 90, + 120 + ], + "volume": 0.75, + "pan": 0.0, + "mute": false, + "solo": false, + "instrument": { + "machine": "drum2", + "params": { + "kick-tune": 54, + "kick-sweep": 5, + "kick-bend": 0.04, + "kick-decay": 0.24, + "kick-click": 0.45, + "kick-drive": 1.5, + "kick-level": 0.9, + "snare-tune": 205, + "snare-decay": 0.13, + "snare-snap": 0.7, + "snare-sdec": 0.08, + "snare-tone": 2600, + "snare-level": 0.85, + "clap-tone": 1200, + "clap-spread": 0.01, + "clap-decay": 0.14, + "clap-level": 0.8, + "hat-tune": 1.05, + "hat-tone": 1.3, + "hat-chdec": 0.035, + "hat-ohdec": 0.4, + "hat-level": 0.85, + "tom-tune": 120, + "tom-sweep": 1.2, + "tom-decay": 0.25, + "tom-drive": 1.4, + "tom-level": 0.82, + "master-accent": 0.55, + "master-drive": 1.2, + "master-level": 0.9 + }, + "preset": "dry-punch-kit" + }, + "effects": [ + { + "machine": "comp2", + "params": { + "comp-thresh": -15.8, + "comp-ratio": 4, + "comp-knee": 4, + "comp-atk": 0.01, + "comp-rel": 0.06, + "comp-hpf": 20, + "comp-det": 0, + "comp-makeup": 3.4, + "comp-mix": 1 + }, + "bypass": false, + "preset": "dry-drum-punch" + } + ], + "clips": [ + { + "type": "note", + "name": "METAL", + "start": 0.0, + "len": 16.0, + "notes": [ + { + "pitch": 36, + "start": 0.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 0.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 0.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 0.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 1.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 1.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 2.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 2.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 2.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 2.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 3.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 3.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 4.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 4.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 4.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 4.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 5.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 5.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 6.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 6.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 6.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 6.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 7.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 7.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 8.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 8.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 8.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 8.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 9.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 9.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 10.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 10.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 10.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 10.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 11.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 11.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 12.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 12.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 12.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 12.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 13.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 13.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 14.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 14.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 14.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 14.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 15.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 15.5, + "len": 0.1, + "vel": 100 + } + ] + }, + { + "type": "note", + "name": "BUBBLES", + "start": 16.0, + "len": 16.0, + "notes": [ + { + "pitch": 36, + "start": 0.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 0.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 0.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 0.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 1.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 1.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 2.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 2.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 2.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 2.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 3.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 3.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 4.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 4.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 4.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 4.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 5.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 5.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 6.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 6.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 6.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 6.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 7.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 7.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 8.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 8.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 8.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 8.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 9.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 9.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 10.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 10.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 10.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 10.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 11.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 11.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 12.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 12.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 12.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 12.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 13.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 13.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 14.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 14.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 14.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 14.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 15.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 15.5, + "len": 0.1, + "vel": 100 + } + ] + }, + { + "type": "note", + "name": "GROWL", + "start": 32.0, + "len": 16.0, + "notes": [ + { + "pitch": 36, + "start": 0.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 0.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 0.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 0.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 1.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 1.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 2.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 2.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 2.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 2.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 3.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 3.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 4.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 4.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 4.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 4.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 5.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 5.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 6.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 6.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 6.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 6.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 7.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 7.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 8.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 8.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 8.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 8.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 9.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 9.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 10.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 10.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 10.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 10.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 11.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 11.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 12.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 12.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 12.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 12.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 13.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 13.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 14.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 14.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 14.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 14.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 15.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 15.5, + "len": 0.1, + "vel": 100 + } + ] + }, + { + "type": "note", + "name": "VOWEL", + "start": 48.0, + "len": 32.0, + "notes": [ + { + "pitch": 36, + "start": 0.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 0.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 0.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 0.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 1.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 1.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 2.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 2.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 2.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 2.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 3.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 3.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 4.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 4.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 4.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 4.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 5.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 5.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 6.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 6.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 6.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 6.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 7.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 7.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 8.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 8.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 8.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 8.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 9.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 9.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 10.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 10.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 10.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 10.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 11.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 11.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 12.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 12.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 12.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 12.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 13.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 13.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 14.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 14.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 14.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 14.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 15.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 15.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 16.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 16.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 16.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 16.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 17.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 17.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 17.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 17.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 17.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 18.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 18.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 18.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 18.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 19.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 19.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 19.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 19.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 19.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 20.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 20.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 20.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 20.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 21.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 21.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 21.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 21.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 21.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 22.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 22.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 22.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 22.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 23.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 23.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 23.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 23.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 23.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 24.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 24.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 24.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 24.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 25.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 25.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 25.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 25.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 25.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 26.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 26.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 26.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 26.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 27.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 27.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 27.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 27.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 27.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 28.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 28.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 28.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 28.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 29.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 29.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 29.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 29.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 29.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 30.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 30.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 30.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 30.75, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 31.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 38, + "start": 31.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 31.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 31.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 31.5, + "len": 0.1, + "vel": 100 + } + ] + } + ] + }, + { + "name": "METAL BASS", + "color": [ + 64, + 206, + 174 + ], + "volume": 0.7, + "pan": 0.0, + "mute": false, + "solo": false, + "instrument": { + "machine": "ms20", + "params": { + "vco1-wave": 1, + "vco-octave": 2, + "vco2-wave": 0, + "vco2-octave": 0, + "detune": 7.0, + "pulse-width": 0.7, + "saw-level": 0.8, + "pulse-level": 0.3, + "noise-level": 0, + "hpf-cutoff": 20, + "hpf-resonance": 0, + "cutoff": 500, + "resonance": 1.1, + "drive": 1.2, + "lpf-mode": 2, + "env-amount": 2.0, + "level": 0.64, + "amp-attack": 0.002, + "amp-decay": 0.4, + "amp-sustain": 0.7, + "amp-release": 0.08, + "filter-attack": 0.002, + "filter-decay": 0.25, + "filter-sustain": 0.1, + "filter-release": 0.15, + "mg-freq": 5.0, + "mg-wave": 0.5, + "mg-pitch": 0, + "mg-pw": 0, + "mg-cutoff": 0, + "eg-pitch": 0, + "age": 0.4, + "portamento": 0, + "filter-delay": 0, + "amp-hold": 0, + "ms20-c1-src": 12, + "ms20-c1-dst": 5, + "ms20-c1-amt": 0.25, + "ms20-c2-src": 0, + "ms20-c2-dst": 0, + "ms20-c2-amt": 0.0, + "ms20-c3-src": 0, + "ms20-c3-dst": 0, + "ms20-c3-amt": 0.0, + "ms20-c4-src": 0, + "ms20-c4-dst": 0, + "ms20-c4-amt": 0.0 + }, + "preset": "patch-fm-metal-bass" + }, + "effects": [ + { + "machine": "eq2", + "params": { + "eq-hpf-on": 1, + "eq-hpf-hz": 30 + }, + "bypass": false + } + ], + "clips": [ + { + "type": "note", + "name": "METAL", + "start": 0.0, + "len": 16.0, + "notes": [ + { + "pitch": 26, + "start": 0.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 0.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 0.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 1.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 1.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 2.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 2.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 3.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 3.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 3.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 4.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 4.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 4.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 5.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 5.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 6.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 6.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 7.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 7.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 7.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 8.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 8.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 8.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 9.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 9.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 10.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 10.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 11.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 11.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 11.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 12.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 12.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 12.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 13.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 13.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 14.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 14.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 15.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 15.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 15.75, + "len": 0.125, + "vel": 96 + } + ] + }, + { + "type": "note", + "name": "BUBBLES", + "start": 16.0, + "len": 16.0, + "notes": [ + { + "pitch": 26, + "start": 0.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 0.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 0.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 1.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 1.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 2.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 2.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 3.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 3.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 3.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 4.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 4.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 4.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 5.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 5.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 6.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 6.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 7.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 7.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 7.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 8.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 8.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 8.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 9.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 9.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 10.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 10.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 11.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 11.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 11.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 12.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 12.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 12.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 13.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 13.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 14.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 14.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 15.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 15.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 15.75, + "len": 0.125, + "vel": 96 + } + ] + }, + { + "type": "note", + "name": "GROWL", + "start": 32.0, + "len": 16.0, + "notes": [ + { + "pitch": 26, + "start": 0.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 0.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 0.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 1.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 1.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 2.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 2.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 3.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 3.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 3.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 4.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 4.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 4.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 5.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 5.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 6.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 6.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 7.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 7.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 7.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 8.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 8.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 8.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 9.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 9.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 10.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 10.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 11.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 11.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 11.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 12.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 12.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 12.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 13.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 13.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 14.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 14.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 15.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 15.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 15.75, + "len": 0.125, + "vel": 96 + } + ] + }, + { + "type": "note", + "name": "VOWEL", + "start": 48.0, + "len": 32.0, + "notes": [ + { + "pitch": 26, + "start": 0.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 0.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 0.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 1.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 1.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 2.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 2.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 3.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 3.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 3.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 4.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 4.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 4.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 5.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 5.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 6.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 6.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 7.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 7.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 7.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 8.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 8.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 8.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 9.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 9.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 10.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 10.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 11.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 11.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 11.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 12.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 12.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 12.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 13.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 13.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 14.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 14.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 15.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 15.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 15.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 16.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 16.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 16.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 17.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 17.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 18.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 18.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 19.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 19.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 19.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 20.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 20.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 20.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 21.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 21.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 22.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 22.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 23.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 23.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 23.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 24.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 24.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 24.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 25.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 25.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 26.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 26.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 27.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 27.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 27.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 28.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 26, + "start": 28.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 28.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 29.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 29.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 26, + "start": 30.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 36, + "start": 30.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 31.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 31.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 29, + "start": 31.75, + "len": 0.125, + "vel": 96 + } + ] + } + ] + }, + { + "name": "BUBBLES", + "color": [ + 150, + 110, + 230 + ], + "volume": 0.55, + "pan": -0.3, + "mute": false, + "solo": false, + "instrument": { + "machine": "ms20", + "params": { + "vco1-wave": 2, + "vco-octave": 2, + "vco2-wave": 1, + "vco2-octave": 0, + "detune": 0.07, + "pulse-width": 0.6, + "saw-level": 0.8, + "pulse-level": 0.0, + "noise-level": 0, + "hpf-cutoff": 20, + "hpf-resonance": 0, + "cutoff": 700, + "resonance": 1.5, + "drive": 1.2, + "lpf-mode": 2, + "env-amount": 1.0, + "level": 0.45, + "amp-attack": 0.002, + "amp-decay": 0.3, + "amp-sustain": 0.8, + "amp-release": 0.08, + "filter-attack": 0.002, + "filter-decay": 0.2, + "filter-sustain": 0.3, + "filter-release": 0.15, + "mg-freq": 7.0, + "mg-wave": 0.5, + "mg-pitch": 0, + "mg-pw": 0, + "mg-cutoff": 0, + "eg-pitch": 0, + "age": 0.4, + "portamento": 0, + "filter-delay": 0, + "amp-hold": 0, + "ms20-c1-src": 6, + "ms20-c1-dst": 5, + "ms20-c1-amt": 0.3, + "ms20-c2-src": 0, + "ms20-c2-dst": 0, + "ms20-c2-amt": 0.0, + "ms20-c3-src": 0, + "ms20-c3-dst": 0, + "ms20-c3-amt": 0.0, + "ms20-c4-src": 0, + "ms20-c4-dst": 0, + "ms20-c4-amt": 0.0 + }, + "preset": "patch-sh-bubbles" + }, + "effects": [ + { + "machine": "delay2", + "params": { + "delay-mix": 0.25 + }, + "bypass": false + } + ], + "clips": [ + { + "type": "note", + "name": "BUBBLES", + "start": 16.0, + "len": 16.0, + "notes": [ + { + "pitch": 62, + "start": 0.0, + "len": 3.8, + "vel": 100 + }, + { + "pitch": 65, + "start": 4.0, + "len": 3.8, + "vel": 100 + }, + { + "pitch": 57, + "start": 8.0, + "len": 3.8, + "vel": 100 + }, + { + "pitch": 60, + "start": 12.0, + "len": 3.8, + "vel": 100 + } + ] + }, + { + "type": "note", + "name": "GROWL", + "start": 32.0, + "len": 16.0, + "notes": [ + { + "pitch": 62, + "start": 0.0, + "len": 3.8, + "vel": 100 + }, + { + "pitch": 65, + "start": 4.0, + "len": 3.8, + "vel": 100 + }, + { + "pitch": 57, + "start": 8.0, + "len": 3.8, + "vel": 100 + }, + { + "pitch": 60, + "start": 12.0, + "len": 3.8, + "vel": 100 + } + ] + }, + { + "type": "note", + "name": "VOWEL", + "start": 48.0, + "len": 32.0, + "notes": [ + { + "pitch": 62, + "start": 0.0, + "len": 3.8, + "vel": 100 + }, + { + "pitch": 65, + "start": 4.0, + "len": 3.8, + "vel": 100 + }, + { + "pitch": 57, + "start": 8.0, + "len": 3.8, + "vel": 100 + }, + { + "pitch": 60, + "start": 12.0, + "len": 3.8, + "vel": 100 + } + ] + } + ] + }, + { + "name": "GROWL", + "color": [ + 250, + 190, + 80 + ], + "volume": 0.55, + "pan": 0.25, + "mute": false, + "solo": false, + "instrument": { + "machine": "ms20", + "params": { + "vco1-wave": 1, + "vco-octave": 2, + "vco2-wave": 1, + "vco2-octave": 0, + "detune": 0.07, + "pulse-width": 0.7, + "saw-level": 0.8, + "pulse-level": 0.5, + "noise-level": 0, + "hpf-cutoff": 20, + "hpf-resonance": 0, + "cutoff": 500, + "resonance": 1.3, + "drive": 1.5, + "lpf-mode": 3, + "env-amount": 2.5, + "level": 0.32, + "amp-attack": 0.002, + "amp-decay": 0.4, + "amp-sustain": 0.8, + "amp-release": 0.08, + "filter-attack": 0.002, + "filter-decay": 0.4, + "filter-sustain": 0.3, + "filter-release": 0.15, + "mg-freq": 5.0, + "mg-wave": 0.5, + "mg-pitch": 0, + "mg-pw": 0, + "mg-cutoff": 0, + "eg-pitch": 0, + "age": 0.4, + "portamento": 0, + "filter-delay": 0, + "amp-hold": 0, + "ms20-c1-src": 13, + "ms20-c1-dst": 8, + "ms20-c1-amt": 0.9, + "ms20-c2-src": 2, + "ms20-c2-dst": 5, + "ms20-c2-amt": 0.25, + "ms20-c3-src": 0, + "ms20-c3-dst": 0, + "ms20-c3-amt": 0.0, + "ms20-c4-src": 0, + "ms20-c4-dst": 0, + "ms20-c4-amt": 0.0 + }, + "preset": "patch-feedback-growl" + }, + "effects": [ + { + "machine": "verb2", + "params": { + "verb-mix": 0.15 + }, + "bypass": false + } + ], + "clips": [ + { + "type": "note", + "name": "GROWL", + "start": 32.0, + "len": 16.0, + "notes": [ + { + "pitch": 50, + "start": 0.0, + "len": 1.9, + "vel": 100 + }, + { + "pitch": 53, + "start": 2.0, + "len": 1.9, + "vel": 100 + }, + { + "pitch": 57, + "start": 4.0, + "len": 2.85, + "vel": 100 + }, + { + "pitch": 55, + "start": 7.0, + "len": 0.95, + "vel": 100 + }, + { + "pitch": 53, + "start": 8.0, + "len": 1.9, + "vel": 100 + }, + { + "pitch": 52, + "start": 10.0, + "len": 1.9, + "vel": 100 + }, + { + "pitch": 50, + "start": 12.0, + "len": 3.8, + "vel": 100 + } + ] + } + ] + }, + { + "name": "VOWEL", + "color": [ + 90, + 170, + 250 + ], + "volume": 0.6, + "pan": 0.15, + "mute": false, + "solo": false, + "instrument": { + "machine": "ms20", + "params": { + "vco1-wave": 1, + "vco-octave": 3, + "vco2-wave": 1, + "vco2-octave": 2, + "detune": 0.07, + "pulse-width": 0.7, + "saw-level": 0.8, + "pulse-level": 0.5, + "noise-level": 0, + "hpf-cutoff": 140, + "hpf-resonance": 1.6, + "cutoff": 1400, + "resonance": 1.6, + "drive": 1.6, + "lpf-mode": 2, + "env-amount": 0.8, + "level": 1.0, + "amp-attack": 0.002, + "amp-decay": 0.4, + "amp-sustain": 0.8, + "amp-release": 0.08, + "filter-attack": 0.002, + "filter-decay": 0.6, + "filter-sustain": 0.2, + "filter-release": 0.15, + "mg-freq": 5.0, + "mg-wave": 0.5, + "mg-pitch": 0, + "mg-pw": 0, + "mg-cutoff": 0, + "eg-pitch": 0, + "age": 0.4, + "portamento": 0, + "filter-delay": 0, + "amp-hold": 0, + "ms20-c1-src": 1, + "ms20-c1-dst": 4, + "ms20-c1-amt": 0.45, + "ms20-c2-src": 0, + "ms20-c2-dst": 0, + "ms20-c2-amt": 0.0, + "ms20-c3-src": 0, + "ms20-c3-dst": 0, + "ms20-c3-amt": 0.0, + "ms20-c4-src": 0, + "ms20-c4-dst": 0, + "ms20-c4-amt": 0.0 + }, + "preset": "patch-vowel-sweep" + }, + "effects": [ + { + "machine": "delay2", + "params": { + "delay-mix": 0.2 + }, + "bypass": false + } + ], + "clips": [ + { + "type": "note", + "name": "VOWEL", + "start": 48.0, + "len": 32.0, + "notes": [ + { + "pitch": 50, + "start": 0.0, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 50, + "start": 0.75, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 53, + "start": 1.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 57, + "start": 2.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 60, + "start": 3.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 50, + "start": 4.0, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 50, + "start": 4.75, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 53, + "start": 5.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 57, + "start": 6.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 60, + "start": 7.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 50, + "start": 8.0, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 50, + "start": 8.75, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 53, + "start": 9.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 57, + "start": 10.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 60, + "start": 11.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 50, + "start": 12.0, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 50, + "start": 12.75, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 53, + "start": 13.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 57, + "start": 14.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 60, + "start": 15.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 50, + "start": 16.0, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 50, + "start": 16.75, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 53, + "start": 17.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 57, + "start": 18.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 60, + "start": 19.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 50, + "start": 20.0, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 50, + "start": 20.75, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 53, + "start": 21.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 57, + "start": 22.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 60, + "start": 23.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 50, + "start": 24.0, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 50, + "start": 24.75, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 53, + "start": 25.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 57, + "start": 26.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 60, + "start": 27.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 50, + "start": 28.0, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 50, + "start": 28.75, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 53, + "start": 29.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 57, + "start": 30.5, + "len": 0.15, + "vel": 96 + }, + { + "pitch": 60, + "start": 31.5, + "len": 0.15, + "vel": 96 + } + ] + } + ] + }, + { + "name": "LEAD", + "color": [ + 240, + 130, + 70 + ], + "volume": 0.6, + "pan": -0.1, + "mute": false, + "solo": false, + "instrument": { + "machine": "ms20", + "params": { + "vco1-wave": 1, + "vco-octave": 3, + "vco2-wave": 1, + "vco2-octave": 2, + "detune": 0.08, + "pulse-width": 0.7, + "saw-level": 0.8, + "pulse-level": 0.5, + "noise-level": 0, + "hpf-cutoff": 20, + "hpf-resonance": 0, + "cutoff": 900, + "resonance": 1.2, + "drive": 1.2, + "lpf-mode": 2, + "env-amount": 1.5, + "level": 0.4, + "amp-attack": 0.002, + "amp-decay": 0.4, + "amp-sustain": 0.9, + "amp-release": 0.25, + "filter-attack": 0.002, + "filter-decay": 0.5, + "filter-sustain": 0.4, + "filter-release": 0.15, + "mg-freq": 5.5, + "mg-wave": 0.5, + "mg-pitch": 0, + "mg-pw": 0, + "mg-cutoff": 0, + "eg-pitch": 0, + "age": 0.4, + "portamento": 0.06, + "filter-delay": 0, + "amp-hold": 0, + "ms20-c1-src": 8, + "ms20-c1-dst": 5, + "ms20-c1-amt": 0.2, + "ms20-c2-src": 4, + "ms20-c2-dst": 1, + "ms20-c2-amt": 0.006, + "ms20-c3-src": 10, + "ms20-c3-dst": 5, + "ms20-c3-amt": 0.3, + "ms20-c4-src": 0, + "ms20-c4-dst": 0, + "ms20-c4-amt": 0.0 + }, + "preset": "patch-tracking-lead" + }, + "effects": [ + { + "machine": "verb2", + "params": { + "verb-mix": 0.2 + }, + "bypass": false + } + ], + "clips": [ + { + "type": "note", + "name": "VOWEL", + "start": 64.0, + "len": 16.0, + "notes": [ + { + "pitch": 69, + "start": 0.0, + "len": 1.425, + "vel": 100 + }, + { + "pitch": 67, + "start": 1.5, + "len": 0.475, + "vel": 100 + }, + { + "pitch": 65, + "start": 2.0, + "len": 0.95, + "vel": 100 + }, + { + "pitch": 64, + "start": 3.0, + "len": 0.95, + "vel": 100 + }, + { + "pitch": 62, + "start": 4.0, + "len": 1.9, + "vel": 100 + }, + { + "pitch": 65, + "start": 6.0, + "len": 0.95, + "vel": 100 + }, + { + "pitch": 69, + "start": 7.0, + "len": 0.95, + "vel": 100 + }, + { + "pitch": 72, + "start": 8.0, + "len": 1.425, + "vel": 100 + }, + { + "pitch": 69, + "start": 9.5, + "len": 0.475, + "vel": 100 + }, + { + "pitch": 67, + "start": 10.0, + "len": 0.95, + "vel": 100 + }, + { + "pitch": 65, + "start": 11.0, + "len": 0.95, + "vel": 100 + }, + { + "pitch": 64, + "start": 12.0, + "len": 2.85, + "vel": 100 + } + ] + } + ] + } + ], + "master": { + "volume": 1.0, + "pan": 0.0, + "subsonic": false, + "effects": [ + { + "machine": "comp2", + "params": { + "comp-thresh": -14.1, + "comp-ratio": 2, + "comp-knee": 9, + "comp-atk": 0.03, + "comp-rel": 0.2, + "comp-hpf": 90, + "comp-det": 0, + "comp-makeup": 1.3, + "comp-mix": 1 + }, + "bypass": false, + "preset": "gentle-bus-glue" + }, + { + "machine": "limiter2", + "params": { + "lim-gain": 4, + "lim-ceil": -1 + }, + "bypass": false + } + ] + } +} \ No newline at end of file diff --git a/songs/squelch_acid.py b/songs/squelch_acid.py new file mode 100644 index 00000000..615a5b71 --- /dev/null +++ b/songs/squelch_acid.py @@ -0,0 +1,54 @@ +"""Squelch Acid — a 128 BPM acid track for the Squelch 33. + +Generate: PYTHONPATH=tools python3 songs/squelch_acid.py +Render: ... --render + +The line plays alone with CUT closed, the 909 comes in and the filter +opens over eight bars while RES climbs toward the scream; the last +section doubles it with a WET square an octave up, accents stacking. +""" +import argparse +from slabkit import Song, fx + +song = Song("Squelch Acid", bpm=128, key="A minor") +intro = song.section("LINE", 4) +build = song.section("OPENING", 8) +peak = song.section("WOW", 8) + +kit = song.track("909", "drum2", "909-punch", volume=0.8, + fx=[fx("comp2", "dry-drum-punch")]) +acid = song.track("SQUELCH", "acid", "classic-squelch", volume=0.75, + fx=[fx("delay2", "dotted-eighth-lead-120", mix=0.14)], + params=dict(cutoff=140, resonance=0.55, env_mod=0.45, decay=0.4)) +sq = song.track("SQUARE", "acid", "square-bounce", volume=0.5, pan=0.2, + fx=[fx("verb2", mix=0.12)], + params=dict(mode="WET", resonance=0.85, cutoff=420, tune=12)) + +song.master(fx=[fx("comp2", "gentle-bus-glue"), fx("limiter2", gain=4, ceil=-1)]) + +# accents (!) and slides (~) make the line +LINE = ("A1! . A1 A2~ A1 . C2! A1 . A1 G1~ A1 . A2! . E2 |" + " A1! . A1 A2~ A1 . C2! A1 . D2~ E2 . G2! . A1 A1") +for sec in (intro, build, peak): + acid.clip(sec).seq(LINE, gate=0.5).repeat(8) +sq.clip(peak).seq(LINE, gate=0.45).repeat(8) + +for sec in (build, peak): + kit.clip(sec).drums({"kick": "x...x...x...x...", + "clap": "....x.......x...", + "ch": "x.x.x.x.x.x.x.x.", + "oh": "..x...x...x...x."}, bars=8) + +# the 303 move: open CUT and push RES by hand +b0 = build.start * 4 +acid.ramp("cutoff", b0, b0 + 32, 140, 900, tension=-0.3) +acid.ramp("resonance", b0, b0 + 32, 0.55, 0.9) +acid.ramp("env_mod", b0, b0 + 32, 0.45, 0.7) + +if __name__ == "__main__": + ap = argparse.ArgumentParser() + ap.add_argument("--render", action="store_true") + a = ap.parse_args() + song.save() + if a.render: + song.render() diff --git a/songs/squelch_acid.slab/project.json b/songs/squelch_acid.slab/project.json new file mode 100644 index 00000000..c7217831 --- /dev/null +++ b/songs/squelch_acid.slab/project.json @@ -0,0 +1,3892 @@ +{ + "slab": "project", + "schema": 1, + "transport": { + "bpm": 128.0, + "loop": { + "on": false, + "start": 0.0, + "end": 80.0 + } + }, + "meter": [ + { + "bar": 0, + "num": 4, + "den": 4 + } + ], + "sections": [ + { + "beat": 0.0, + "name": "LINE", + "color": 4 + }, + { + "beat": 16.0, + "name": "OPENING", + "color": 5 + }, + { + "beat": 48.0, + "name": "WOW", + "color": 6 + } + ], + "end": 80.0, + "tracks": [ + { + "name": "909", + "color": [ + 230, + 90, + 120 + ], + "volume": 0.8, + "pan": 0.0, + "mute": false, + "solo": false, + "instrument": { + "machine": "drum2", + "params": { + "kick-tune": 52, + "kick-sweep": 9, + "kick-bend": 0.045, + "kick-decay": 0.35, + "kick-click": 0.55, + "kick-drive": 2.6, + "kick-level": 0.9, + "snare-tune": 190, + "snare-decay": 0.14, + "snare-snap": 0.9, + "snare-sdec": 0.09, + "snare-tone": 2400, + "snare-level": 0.9, + "clap-tone": 1300, + "clap-spread": 0.009, + "clap-decay": 0.22, + "clap-level": 0.9, + "hat-tune": 1.1, + "hat-tone": 1.25, + "hat-chdec": 0.05, + "hat-ohdec": 0.45, + "hat-level": 0.95, + "tom-tune": 120, + "tom-sweep": 1.6, + "tom-decay": 0.28, + "tom-drive": 1.6, + "tom-level": 0.85, + "master-accent": 0.8, + "master-drive": 1.6, + "master-level": 0.9 + }, + "preset": "909-punch" + }, + "effects": [ + { + "machine": "comp2", + "params": { + "comp-thresh": -15.8, + "comp-ratio": 4, + "comp-knee": 4, + "comp-atk": 0.01, + "comp-rel": 0.06, + "comp-hpf": 20, + "comp-det": 0, + "comp-makeup": 3.4, + "comp-mix": 1 + }, + "bypass": false, + "preset": "dry-drum-punch" + } + ], + "clips": [ + { + "type": "note", + "name": "OPENING", + "start": 16.0, + "len": 32.0, + "notes": [ + { + "pitch": 36, + "start": 0.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 0.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 0.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 0.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 1.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 1.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 2.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 2.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 2.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 2.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 3.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 3.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 4.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 4.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 4.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 4.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 5.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 5.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 6.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 6.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 6.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 6.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 7.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 7.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 8.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 8.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 8.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 8.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 9.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 9.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 10.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 10.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 10.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 10.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 11.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 11.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 12.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 12.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 12.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 12.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 13.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 13.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 14.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 14.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 14.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 14.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 15.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 15.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 16.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 16.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 16.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 16.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 17.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 17.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 17.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 17.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 17.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 18.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 18.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 18.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 18.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 19.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 19.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 19.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 19.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 19.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 20.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 20.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 20.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 20.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 21.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 21.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 21.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 21.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 21.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 22.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 22.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 22.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 22.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 23.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 23.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 23.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 23.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 23.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 24.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 24.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 24.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 24.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 25.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 25.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 25.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 25.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 25.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 26.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 26.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 26.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 26.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 27.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 27.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 27.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 27.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 27.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 28.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 28.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 28.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 28.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 29.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 29.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 29.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 29.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 29.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 30.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 30.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 30.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 30.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 31.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 31.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 31.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 31.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 31.5, + "len": 0.1, + "vel": 100 + } + ] + }, + { + "type": "note", + "name": "WOW", + "start": 48.0, + "len": 32.0, + "notes": [ + { + "pitch": 36, + "start": 0.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 0.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 0.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 0.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 1.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 1.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 1.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 2.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 2.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 2.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 2.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 3.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 3.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 3.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 4.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 4.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 4.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 4.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 5.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 5.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 5.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 6.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 6.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 6.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 6.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 7.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 7.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 7.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 8.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 8.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 8.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 8.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 9.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 9.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 9.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 10.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 10.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 10.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 10.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 11.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 11.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 11.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 12.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 12.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 12.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 12.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 13.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 13.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 13.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 14.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 14.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 14.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 14.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 15.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 15.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 15.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 16.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 16.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 16.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 16.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 17.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 17.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 17.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 17.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 17.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 18.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 18.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 18.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 18.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 19.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 19.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 19.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 19.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 19.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 20.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 20.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 20.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 20.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 21.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 21.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 21.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 21.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 21.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 22.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 22.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 22.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 22.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 23.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 23.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 23.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 23.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 23.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 24.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 24.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 24.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 24.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 25.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 25.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 25.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 25.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 25.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 26.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 26.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 26.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 26.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 27.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 27.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 27.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 27.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 27.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 28.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 28.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 28.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 28.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 29.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 29.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 29.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 29.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 29.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 30.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 30.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 30.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 30.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 36, + "start": 31.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 39, + "start": 31.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 31.0, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 42, + "start": 31.5, + "len": 0.1, + "vel": 100 + }, + { + "pitch": 46, + "start": 31.5, + "len": 0.1, + "vel": 100 + } + ] + } + ] + }, + { + "name": "SQUELCH", + "color": [ + 64, + 206, + 174 + ], + "volume": 0.75, + "pan": 0.0, + "mute": false, + "solo": false, + "instrument": { + "machine": "acid", + "params": { + "tune": 0, + "wave": 0, + "cutoff": 140, + "resonance": 0.55, + "env-mod": 0.45, + "decay": 0.4, + "accent": 0.8, + "slide": 0.06, + "drive": 1.0, + "mode": 0, + "level": 0.63 + }, + "preset": "classic-squelch" + }, + "effects": [ + { + "machine": "delay2", + "params": { + "delay-time": 0.375, + "delay-fb": 0.45, + "delay-damp": 5500, + "delay-mix": 0.14, + "delay-sync": 1, + "delay-div": 3, + "delay-duck": 0.3 + }, + "bypass": false, + "preset": "dotted-eighth-lead-120" + } + ], + "clips": [ + { + "type": "note", + "name": "LINE", + "start": 0.0, + "len": 16.0, + "notes": [ + { + "pitch": 33, + "start": 0.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 0.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 0.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 1.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 1.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 1.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 2.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 2.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 2.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 3.25, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 40, + "start": 3.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 4.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 4.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 4.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 5.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 5.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 5.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 6.25, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 40, + "start": 6.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 43, + "start": 7.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 7.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 7.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 8.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 8.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 8.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 9.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 9.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 9.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 10.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 10.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 10.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 11.25, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 40, + "start": 11.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 12.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 12.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 12.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 13.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 13.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 13.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 14.25, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 40, + "start": 14.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 43, + "start": 15.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 15.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 15.75, + "len": 0.125, + "vel": 96 + } + ] + }, + { + "type": "note", + "name": "OPENING", + "start": 16.0, + "len": 32.0, + "notes": [ + { + "pitch": 33, + "start": 0.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 0.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 0.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 1.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 1.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 1.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 2.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 2.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 2.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 3.25, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 40, + "start": 3.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 4.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 4.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 4.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 5.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 5.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 5.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 6.25, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 40, + "start": 6.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 43, + "start": 7.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 7.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 7.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 8.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 8.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 8.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 9.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 9.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 9.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 10.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 10.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 10.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 11.25, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 40, + "start": 11.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 12.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 12.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 12.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 13.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 13.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 13.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 14.25, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 40, + "start": 14.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 43, + "start": 15.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 15.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 15.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 16.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 16.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 16.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 17.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 17.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 17.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 18.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 18.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 18.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 19.25, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 40, + "start": 19.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 20.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 20.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 20.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 21.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 21.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 21.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 22.25, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 40, + "start": 22.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 43, + "start": 23.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 23.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 23.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 24.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 24.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 24.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 25.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 25.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 25.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 26.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 26.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 26.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 27.25, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 40, + "start": 27.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 28.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 28.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 28.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 29.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 29.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 29.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 30.25, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 40, + "start": 30.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 43, + "start": 31.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 31.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 31.75, + "len": 0.125, + "vel": 96 + } + ] + }, + { + "type": "note", + "name": "WOW", + "start": 48.0, + "len": 32.0, + "notes": [ + { + "pitch": 33, + "start": 0.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 0.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 0.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 1.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 1.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 1.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 2.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 2.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 2.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 3.25, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 40, + "start": 3.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 4.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 4.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 4.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 5.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 5.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 5.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 6.25, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 40, + "start": 6.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 43, + "start": 7.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 7.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 7.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 8.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 8.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 8.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 9.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 9.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 9.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 10.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 10.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 10.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 11.25, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 40, + "start": 11.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 12.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 12.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 12.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 13.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 13.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 13.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 14.25, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 40, + "start": 14.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 43, + "start": 15.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 15.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 15.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 16.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 16.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 16.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 17.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 17.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 17.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 18.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 18.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 18.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 19.25, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 40, + "start": 19.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 20.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 20.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 20.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 21.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 21.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 21.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 22.25, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 40, + "start": 22.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 43, + "start": 23.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 23.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 23.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 24.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 24.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 24.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 25.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 25.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 25.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 26.25, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 31, + "start": 26.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 26.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 27.25, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 40, + "start": 27.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 28.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 28.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 45, + "start": 28.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 29.0, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 36, + "start": 29.5, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 29.75, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 38, + "start": 30.25, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 40, + "start": 30.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 43, + "start": 31.0, + "len": 0.125, + "vel": 124 + }, + { + "pitch": 33, + "start": 31.5, + "len": 0.125, + "vel": 96 + }, + { + "pitch": 33, + "start": 31.75, + "len": 0.125, + "vel": 96 + } + ] + } + ], + "automation": [ + { + "target": "inst:cutoff", + "points": [ + [ + 64.0, + 140, + "curve", + -0.3 + ], + [ + 96.0, + 900 + ] + ] + }, + { + "target": "inst:resonance", + "points": [ + [ + 64.0, + 0.55 + ], + [ + 96.0, + 0.9 + ] + ] + }, + { + "target": "inst:env-mod", + "points": [ + [ + 64.0, + 0.45 + ], + [ + 96.0, + 0.7 + ] + ] + } + ] + }, + { + "name": "SQUARE", + "color": [ + 150, + 110, + 230 + ], + "volume": 0.5, + "pan": 0.2, + "mute": false, + "solo": false, + "instrument": { + "machine": "acid", + "params": { + "tune": 12, + "wave": 1, + "cutoff": 420, + "resonance": 0.85, + "env-mod": 0.45, + "decay": 0.28, + "accent": 0.7, + "slide": 0.06, + "drive": 1.0, + "mode": 1, + "level": 0.5 + }, + "preset": "square-bounce" + }, + "effects": [ + { + "machine": "verb2", + "params": { + "verb-mix": 0.12 + }, + "bypass": false + } + ], + "clips": [ + { + "type": "note", + "name": "WOW", + "start": 48.0, + "len": 32.0, + "notes": [ + { + "pitch": 33, + "start": 0.0, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 0.5, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 45, + "start": 0.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 1.0, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 36, + "start": 1.5, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 1.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 33, + "start": 2.25, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 31, + "start": 2.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 2.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 45, + "start": 3.25, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 40, + "start": 3.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 33, + "start": 4.0, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 4.5, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 45, + "start": 4.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 5.0, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 36, + "start": 5.5, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 5.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 38, + "start": 6.25, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 40, + "start": 6.5, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 43, + "start": 7.0, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 7.5, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 33, + "start": 7.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 33, + "start": 8.0, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 8.5, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 45, + "start": 8.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 9.0, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 36, + "start": 9.5, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 9.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 33, + "start": 10.25, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 31, + "start": 10.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 10.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 45, + "start": 11.25, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 40, + "start": 11.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 33, + "start": 12.0, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 12.5, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 45, + "start": 12.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 13.0, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 36, + "start": 13.5, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 13.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 38, + "start": 14.25, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 40, + "start": 14.5, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 43, + "start": 15.0, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 15.5, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 33, + "start": 15.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 33, + "start": 16.0, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 16.5, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 45, + "start": 16.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 17.0, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 36, + "start": 17.5, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 17.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 33, + "start": 18.25, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 31, + "start": 18.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 18.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 45, + "start": 19.25, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 40, + "start": 19.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 33, + "start": 20.0, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 20.5, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 45, + "start": 20.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 21.0, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 36, + "start": 21.5, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 21.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 38, + "start": 22.25, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 40, + "start": 22.5, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 43, + "start": 23.0, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 23.5, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 33, + "start": 23.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 33, + "start": 24.0, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 24.5, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 45, + "start": 24.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 25.0, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 36, + "start": 25.5, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 25.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 33, + "start": 26.25, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 31, + "start": 26.5, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 26.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 45, + "start": 27.25, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 40, + "start": 27.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 33, + "start": 28.0, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 28.5, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 45, + "start": 28.75, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 33, + "start": 29.0, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 36, + "start": 29.5, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 29.75, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 38, + "start": 30.25, + "len": 0.275, + "vel": 96 + }, + { + "pitch": 40, + "start": 30.5, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 43, + "start": 31.0, + "len": 0.1125, + "vel": 124 + }, + { + "pitch": 33, + "start": 31.5, + "len": 0.1125, + "vel": 96 + }, + { + "pitch": 33, + "start": 31.75, + "len": 0.1125, + "vel": 96 + } + ] + } + ] + } + ], + "master": { + "volume": 1.0, + "pan": 0.0, + "subsonic": false, + "effects": [ + { + "machine": "comp2", + "params": { + "comp-thresh": -14.1, + "comp-ratio": 2, + "comp-knee": 9, + "comp-atk": 0.03, + "comp-rel": 0.2, + "comp-hpf": 90, + "comp-det": 0, + "comp-makeup": 1.3, + "comp-mix": 1 + }, + "bypass": false, + "preset": "gentle-bus-glue" + }, + { + "machine": "limiter2", + "params": { + "lim-gain": 4, + "lim-ceil": -1 + }, + "bypass": false + } + ] + } +} \ No newline at end of file diff --git a/src/machine_desc.zig b/src/machine_desc.zig index 01416e47..e0b1f364 100644 --- a/src/machine_desc.zig +++ b/src/machine_desc.zig @@ -1148,14 +1148,16 @@ test "descriptor walker reads the MS-20 manifest from fy" { try testing.expectEqualStrings("k-ms20-voice-sample", d.renderWord()); try testing.expect(d.prepareWord() == null); try testing.expectEqualStrings("ms20-block-prepare", d.blockPrepareWord().?); - try testing.expectEqual(@as(usize, 712), d.state_size); - try testing.expectEqual(@as(usize, 576), d.params_size); + try testing.expectEqual(@as(usize, 928), d.state_size); + try testing.expectEqual(@as(usize, 768), d.params_size); try testing.expectEqual(@as(f32, 940.0), d.panel_w); - try testing.expectEqual(@as(usize, 35), d.control_count); - try testing.expectEqual(@as(usize, 10), d.strip_count); - try testing.expectEqual(@as(usize, 1), d.display_count); - try testing.expectEqual(@as(usize, 2), d.row_count); - try testing.expectEqual(@as(usize, 6), d.rows[0].cell_count); + try testing.expectEqual(@as(usize, 47), d.control_count); + try testing.expectEqual(@as(usize, 14), d.strip_count); + try testing.expectEqual(@as(usize, 4), d.display_count); + try testing.expectEqual(@as(usize, 0), d.row_count); + try testing.expectEqual(@as(usize, 2), d.page_count); + try testing.expectEqualStrings("PANEL", d.pages[0].nameSlice()); + try testing.expectEqualStrings("PATCH", d.pages[1].nameSlice()); try testing.expectEqual(@as(usize, 0), d.const_count); // First control: VCO1 WAVE switch at the introspected vco1-wave offset. @@ -1172,7 +1174,7 @@ test "descriptor walker reads the MS-20 manifest from fy" { if (std.mem.eql(u8, ctl.idSlice(), "cutoff")) { try testing.expectEqual(@as(usize, 32), ctl.offset); try testing.expectEqual(ParamCurve.exp, ctl.curve); - try testing.expectApproxEqAbs(@as(f64, 700.0), ctl.default, 1e-12); + try testing.expectApproxEqAbs(@as(f64, 1200.0), ctl.default, 1e-12); found = true; } } diff --git a/src/machine_registry.zig b/src/machine_registry.zig index ca23e915..6443738e 100644 --- a/src/machine_registry.zig +++ b/src/machine_registry.zig @@ -44,6 +44,7 @@ test { /// walks the same list. pub const builtin_machines = [_][]const u8{ "machines/ms20/ms20.fy", + "machines/acid/acid.fy", "machines/cream/cream.fy", "machines/fm86/fm86.fy", "machines/drum2/drum2.fy", @@ -409,8 +410,8 @@ test "fy manifest loads MS-20 machine entry" { try std.testing.expectEqual(@as(?usize, null), reg.findById("nope")); try std.testing.expect(e.in_notes); try std.testing.expect(!e.in_audio); - try std.testing.expectEqual(@as(usize, 712), e.raw_state_size); - try std.testing.expectEqual(@as(usize, 576), e.params_size); + try std.testing.expectEqual(@as(usize, 928), e.raw_state_size); + try std.testing.expectEqual(@as(usize, 768), e.params_size); try std.testing.expectEqual(@as(f32, 940.0), e.panel_w); } diff --git a/src/machines/fy_raw_machine.zig b/src/machines/fy_raw_machine.zig index 9d8d7c76..6b1f428d 100644 --- a/src/machines/fy_raw_machine.zig +++ b/src/machines/fy_raw_machine.zig @@ -7019,13 +7019,23 @@ test "MS-20 block-prepare derives the LPF, HPF and envelope coefficients in fy" const drive = inst.readParamF64(try fyFieldOffset(inst, "Ms20VoiceParams.drive")); const hres = inst.readParamF64(try fyFieldOffset(inst, "Ms20VoiceParams.hpf-resonance")); // Defaults land raw: env amount in octaves, resonance and drive knobs. - try testing.expectApproxEqAbs(@as(f64, 4.8), inst.readParamF64(try fyFieldOffset(inst, "Ms20VoiceParams.env-amount")), 1e-6); // knobs store f32 positions - // LPF profile, HOT mode: drive 2.1 x DRV, feedback 10.125 x 0.8 RES, - // damping 0.62 / (1 + 5.2 x 0.8 RES); the LPF runs at 4x. + try testing.expectApproxEqAbs(@as(f64, 2.0), inst.readParamF64(try fyFieldOffset(inst, "Ms20VoiceParams.env-amount")), 1e-6); // knobs store f32 positions + // The default MODE is K35 [2]: its profile [ms20_sk.fy] has base damping + // 7/3, drive 0.9 x DRV, and loop gain a [1 - u^2], u = 1 - [RES/2] / 0.9. + try testing.expectApproxEqAbs(@as(f64, 2.0), inst.readParamF64(try fyFieldOffset(inst, "Ms20VoiceParams.lpf-mode")), 1e-12); + const sk = try fyFieldOffset(inst, "Ms20VoiceParams.sk-pr"); + const a_k35: f64 = 7.0 / 3.0; + const u_lp = 1.0 - 0.5 * res / 0.9; + try testing.expectApproxEqAbs(a_k35, inst.readParamF64(sk + try fyFieldOffset(inst, "Ms20SkProfile.a")), 1e-12); + try testing.expectApproxEqAbs(0.9 * drive, inst.readParamF64(sk + try fyFieldOffset(inst, "Ms20SkProfile.drive")), 1e-12); + try testing.expectApproxEqAbs(a_k35 * (1.0 - u_lp * u_lp), inst.readParamF64(sk + try fyFieldOffset(inst, "Ms20SkProfile.k-lp")), 1e-12); + // The acid pair's profile [ms20_lpf.fy] is derived in every mode; any + // MODE but HOT takes WET's numbers: drive 1.9 x DRV, feedback + // 14.58 x 0.8 RES, damping 0.58 / (1 + 6.2 x 0.8 RES); the LPF runs at 4x. const pr = try fyFieldOffset(inst, "Ms20VoiceParams.lpf-pr"); - try testing.expectApproxEqAbs(2.1 * drive, inst.readParamF64(pr + try fyFieldOffset(inst, "Ms20LpfProfile.drive")), 1e-12); - try testing.expectApproxEqAbs(10.125 * 0.8 * res, inst.readParamF64(pr + try fyFieldOffset(inst, "Ms20LpfProfile.fb-amt")), 1e-12); - try testing.expectApproxEqAbs(@max(0.035, 0.62 / (1.0 + 5.2 * 0.8 * res)), inst.readParamF64(pr + try fyFieldOffset(inst, "Ms20LpfProfile.damping")), 1e-12); + try testing.expectApproxEqAbs(1.9 * drive, inst.readParamF64(pr + try fyFieldOffset(inst, "Ms20LpfProfile.drive")), 1e-12); + try testing.expectApproxEqAbs(14.58 * 0.8 * res, inst.readParamF64(pr + try fyFieldOffset(inst, "Ms20LpfProfile.fb-amt")), 1e-12); + try testing.expectApproxEqAbs(@max(0.035, 0.58 / (1.0 + 6.2 * 0.8 * res)), inst.readParamF64(pr + try fyFieldOffset(inst, "Ms20LpfProfile.damping")), 1e-12); try testing.expectApproxEqAbs(4.0 * 48_000.0, inst.readParamF64(try fyFieldOffset(inst, "Ms20VoiceParams.osr")), 1e-9); // HPF damping 1.4 (1 - RES/2)^2. const u = @max(0.0, 1.0 - 0.5 * hres);