Compare commits

...
2 Commits
Author SHA1 Message Date
libretech 940dd06b83 add examples 2025-09-27 23:12:09 +02:00
libretech a3c8e198a7 fix agents 2025-09-27 23:10:16 +02:00
69 changed files with 2337 additions and 30 deletions

No files matched your search

+273 -30
View File
@@ -8,9 +8,10 @@ This document provides essential guidelines for AI agents assisting with Strudel
### Critical Knowledge Requirements ### Critical Knowledge Requirements
#### 1. Core Syntax Understanding #### 1. Core Syntax Understanding
- **NOT JavaScript**: Strudel uses its own pattern-based syntax, not standard JavaScript - **IS JavaScript**: Strudel is built on JavaScript and supports all JavaScript features including variables, functions, objects, arrays, loops, conditionals, and more
- **NO variable declarations**: No `const`, `let`, `var`, `export`, `import` - **Variable declarations**: You can use `const`, `let`, `var` for variables
- **NO function syntax**: Patterns are composed directly, not stored in functions - **Function syntax**: You can define functions using arrow functions, regular functions, or the `register()` function for custom pattern functions
- **ES6+ features**: Template literals, destructuring, spread operators, async/await, etc. are all supported
#### 2. Parallel Pattern Syntax #### 2. Parallel Pattern Syntax
```javascript ```javascript
@@ -19,9 +20,21 @@ $: sound("bd*4")
$: sound("~ sd ~ sd") $: sound("~ sd ~ sd")
$: sound("hh*8").gain(0.3) $: sound("hh*8").gain(0.3)
// ❌ WRONG - JavaScript-style // ✅ ALSO CORRECT - JavaScript variables and functions
const kick = sound("bd*4"); const kick = sound("bd*4");
const snare = sound("~ sd ~ sd"); const snare = sound("~ sd ~ sd");
const hats = sound("hh*8").gain(0.3);
stack(kick, snare, hats)
// ✅ Custom functions
const createBeat = () => stack(
sound("bd*4"),
sound("~ sd ~ sd"),
sound("hh*8").gain(0.3)
);
createBeat()
``` ```
#### 3. Muting Patterns #### 3. Muting Patterns
@@ -31,6 +44,12 @@ _$: sound("bd*4") // underscore mutes
// ✅ Active pattern // ✅ Active pattern
$: sound("bd*4") // dollar sign plays $: sound("bd*4") // dollar sign plays
// ✅ Named patterns (can be muted/unmuted)
kick: sound("bd*4")
snare: sound("~ sd ~ sd")
// To mute: _kick: sound("bd*4")
``` ```
#### 4. Notes and Scales #### 4. Notes and Scales
@@ -85,13 +104,21 @@ $: n("0 2 4 6").sound("gm_acoustic_bass") // GM sounds
``` ```
##### Built-in Synths ##### Built-in Synths
```
brown bytebeat crackle gm_accordion(7) gm_acoustic_bass(4) gm_acoustic_guitar_nylon(9) gm_acoustic_guitar_steel(10) gm_agogo(6) gm_alto_sax(6) gm_applause(15) gm_bagpipe(1) gm_bandoneon(10) gm_banjo(6) gm_baritone_sax(6) gm_bassoon(4) gm_bird_tweet(7) gm_blown_bottle(5) gm_brass_section(5) gm_breath_noise(8) gm_celesta(6) gm_cello(6) gm_choir_aahs(9) gm_church_organ(5) gm_clarinet(6) gm_clavinet(4) gm_contrabass(3) gm_distortion_guitar(7) gm_drawbar_organ(7) gm_dulcimer(5) gm_electric_bass_finger(4) gm_electric_bass_pick(5) gm_electric_guitar_clean(9) gm_electric_guitar_jazz(9) gm_electric_guitar_muted(10) gm_english_horn(4) gm_epiano1(11) gm_epiano2(9) gm_fiddle(9) gm_flute(5) gm_french_horn(5) gm_fretless_bass(2) gm_fx_atmosphere(13) gm_fx_brightness(12) gm_fx_crystal(10) gm_fx_echoes(10) gm_fx_goblins(9) gm_fx_rain(6) gm_fx_sci_fi(9) gm_fx_soundtrack(5) gm_glockenspiel(5) gm_guitar_fret_noise(8) gm_guitar_harmonics(3) gm_gunshot(12) gm_harmonica(6) gm_harpsichord(8) gm_helicopter(16) gm_kalimba(5) gm_koto(9) gm_lead_1_square(3) gm_lead_2_sawtooth(7) gm_lead_3_calliope(7) gm_lead_4_chiff(6) gm_lead_5_charang(10) gm_lead_6_voice(6) gm_lead_7_fifths(5) gm_lead_8_bass_lead(5) gm_marimba(7) gm_melodic_tom(9) gm_music_box(5) gm_muted_trumpet(5) gm_oboe(5) gm_ocarina(4) gm_orchestra_hit(5) gm_orchestral_harp(5) gm_overdriven_guitar(10) gm_pad_bowed(5) gm_pad_choir(6) gm_pad_halo(8) gm_pad_metallic(7) gm_pad_new_age(12) gm_pad_poly(7) gm_pad_sweep(7) gm_pad_warm(7) gm_pan_flute(8) gm_percussive_organ(6) gm_piano(32) gm_piccolo(5) gm_pizzicato_strings(6) gm_recorder(5) gm_reed_organ(8) gm_reverse_cymbal(9) gm_rock_organ(5) gm_seashore(16) gm_shakuhachi(5) gm_shamisen(7) gm_shanai(5) gm_sitar(7) gm_slap_bass_1(4) gm_slap_bass_2(4) gm_soprano_sax(5) gm_steel_drums(6) gm_string_ensemble_1(11) gm_string_ensemble_2(7) gm_synth_bass_1(9) gm_synth_bass_2(7) gm_synth_brass_1(4) gm_synth_brass_2(7) gm_synth_choir(5) gm_synth_drum(7) gm_synth_strings_1(7) gm_synth_strings_2(4) gm_taiko_drum(10) gm_telephone(10) gm_tenor_sax(4) gm_timpani(6) gm_tinkle_bell(1) gm_tremolo_strings(6) gm_trombone(5) gm_trumpet(4) gm_tuba(4) gm_tubular_bells(6) gm_vibraphone(6) gm_viola(5) gm_violin(9) gm_voice_oohs(6) gm_whistle(4) gm_woodblock(9) gm_xylophone(6) pink pulse saw sawtooth sbd sin sine sqr square supersaw tri triangle white z_noise z_sawtooth z_sine z_square z_tan z_triangle zzfx brown bytebeat crackle gm_accordion(7) gm_acoustic_bass(4) gm_acoustic_guitar_nylon(9) gm_acoustic_guitar_steel(10) gm_agogo(6) gm_alto_sax(6) gm_applause(15) gm_bagpipe(1) gm_bandoneon(10) gm_banjo(6) gm_baritone_sax(6) gm_bassoon(4) gm_bird_tweet(7) gm_blown_bottle(5) gm_brass_section(5) gm_breath_noise(8) gm_celesta(6) gm_cello(6) gm_choir_aahs(9) gm_church_organ(5) gm_clarinet(6) gm_clavinet(4) gm_contrabass(3) gm_distortion_guitar(7) gm_drawbar_organ(7) gm_dulcimer(5) gm_electric_bass_finger(4) gm_electric_bass_pick(5) gm_electric_guitar_clean(9) gm_electric_guitar_jazz(9) gm_electric_guitar_muted(10) gm_english_horn(4) gm_epiano1(11) gm_epiano2(9) gm_fiddle(9) gm_flute(5) gm_french_horn(5) gm_fretless_bass(2) gm_fx_atmosphere(13) gm_fx_brightness(12) gm_fx_crystal(10) gm_fx_echoes(10) gm_fx_goblins(9) gm_fx_rain(6) gm_fx_sci_fi(9) gm_fx_soundtrack(5) gm_glockenspiel(5) gm_guitar_fret_noise(8) gm_guitar_harmonics(3) gm_gunshot(12) gm_harmonica(6) gm_harpsichord(8) gm_helicopter(16) gm_kalimba(5) gm_koto(9) gm_lead_1_square(3) gm_lead_2_sawtooth(7) gm_lead_3_calliope(7) gm_lead_4_chiff(6) gm_lead_5_charang(10) gm_lead_6_voice(6) gm_lead_7_fifths(5) gm_lead_8_bass_lead(5) gm_marimba(7) gm_melodic_tom(9) gm_music_box(5) gm_muted_trumpet(5) gm_oboe(5) gm_ocarina(4) gm_orchestra_hit(5) gm_orchestral_harp(5) gm_overdriven_guitar(10) gm_pad_bowed(5) gm_pad_choir(6) gm_pad_halo(8) gm_pad_metallic(7) gm_pad_new_age(12) gm_pad_poly(7) gm_pad_sweep(7) gm_pad_warm(7) gm_pan_flute(8) gm_percussive_organ(6) gm_piano(32) gm_piccolo(5) gm_pizzicato_strings(6) gm_recorder(5) gm_reed_organ(8) gm_reverse_cymbal(9) gm_rock_organ(5) gm_seashore(16) gm_shakuhachi(5) gm_shamisen(7) gm_shanai(5) gm_sitar(7) gm_slap_bass_1(4) gm_slap_bass_2(4) gm_soprano_sax(5) gm_steel_drums(6) gm_string_ensemble_1(11) gm_string_ensemble_2(7) gm_synth_bass_1(9) gm_synth_bass_2(7) gm_synth_brass_1(4) gm_synth_brass_2(7) gm_synth_choir(5) gm_synth_drum(7) gm_synth_strings_1(7) gm_synth_strings_2(4) gm_taiko_drum(10) gm_telephone(10) gm_tenor_sax(4) gm_timpani(6) gm_tinkle_bell(1) gm_tremolo_strings(6) gm_trombone(5) gm_trumpet(4) gm_tuba(4) gm_tubular_bells(6) gm_vibraphone(6) gm_viola(5) gm_violin(9) gm_voice_oohs(6) gm_whistle(4) gm_woodblock(9) gm_xylophone(6) pink pulse saw sawtooth sbd sin sine sqr square supersaw tri triangle white z_noise z_sawtooth z_sine z_square z_tan z_triangle zzfx
```
##### Built-in Drum Machines ##### Built-in Drum Machines
```
9000_bd(1) 9000_cb(2) 9000_cr(2) 9000_hh(1) 9000_ht(2) 9000_lt(2) 9000_mt(1) 9000_oh(1) 9000_perc(3) 9000_rd(2) 9000_rim(1) 9000_sd(1) 9000_tb(1) ace_bd(3) ace_hh(1) ace_ht(1) ace_lt(1) ace_oh(1) ace_perc(6) ace_sd(3) ajkpercusyn_bd(1) ajkpercusyn_cb(2) ajkpercusyn_ht(1) ajkpercusyn_sd(1) akailinn_bd(1) akailinn_cb(1) akailinn_cp(1) akailinn_cr(1) akailinn_hh(1) akailinn_ht(1) akailinn_lt(1) akailinn_mt(1) akailinn_oh(1) akailinn_rd(1) akailinn_sd(1) akailinn_sh(1) akailinn_tb(1) akaimpc60_bd(2) akaimpc60_cp(1) akaimpc60_cr(1) akaimpc60_hh(1) akaimpc60_ht(1) akaimpc60_lt(1) akaimpc60_misc(2) akaimpc60_mt(1) akaimpc60_oh(1) akaimpc60_perc(5) akaimpc60_rd(1) akaimpc60_rim(1) akaimpc60_sd(3) akaixr10_bd(10) akaixr10_cb(1) akaixr10_cp(1) akaixr10_cr(3) akaixr10_hh(2) akaixr10_ht(1) akaixr10_lt(2) akaixr10_misc(4) akaixr10_mt(2) akaixr10_oh(1) akaixr10_perc(15) akaixr10_rd(1) akaixr10_rim(2) akaixr10_sd(10) akaixr10_sh(1) akaixr10_tb(1) alesishr16_bd(1) alesishr16_cp(1) alesishr16_hh(1) alesishr16_ht(1) alesishr16_lt(1) alesishr16_oh(1) alesishr16_perc(8) alesishr16_rim(1) alesishr16_sd(1) alesishr16_sh(3) alesissr16_bd(13) alesissr16_cb(1) alesissr16_cp(1) alesissr16_cr(2) alesissr16_hh(3) alesissr16_misc(3) alesissr16_oh(4) alesissr16_perc(7) alesissr16_rd(3) alesissr16_rim(1) alesissr16_sd(12) alesissr16_sh(1) alesissr16_tb(1) bd(8) bossdr110_bd(1) bossdr110_cp(1) bossdr110_cr(1) bossdr110_hh(1) bossdr110_oh(1) bossdr110_rd(1) bossdr110_sd(1) bossdr220_bd(1) bossdr220_cp(1) bossdr220_cr(1) bossdr220_hh(1) bossdr220_ht(1) bossdr220_lt(1) bossdr220_mt(1) bossdr220_oh(1) bossdr220_perc(1) bossdr220_rd(1) bossdr220_sd(1) bossdr55_bd(2) bossdr55_hh(2) bossdr55_rim(1) bossdr55_sd(8) bossdr550_bd(5) bossdr550_cb(2) bossdr550_cp(1) bossdr550_cr(1) bossdr550_hh(2) bossdr550_ht(3) bossdr550_lt(3) bossdr550_misc(3) bossdr550_mt(2) bossdr550_oh(2) bossdr550_perc(11) bossdr550_rd(2) bossdr550_rim(1) bossdr550_sd(6) bossdr550_sh(2) bossdr550_tb(1) brk(1) casiorz1_bd(1) casiorz1_cb(1) casiorz1_cp(1) casiorz1_cr(1) casiorz1_hh(1) casiorz1_ht(1) casiorz1_lt(1) casiorz1_mt(1) casiorz1_rd(2) casiorz1_rim(1) casiorz1_sd(1) casiosk1_bd(1) casiosk1_hh(1) casiosk1_ht(1) casiosk1_mt(1) casiosk1_oh(1) casiosk1_sd(1) casiovl1_bd(1) casiovl1_hh(1) casiovl1_sd(1) cb(1) circuitsdrumtracks_bd(1) circuitsdrumtracks_cb(1) circuitsdrumtracks_cp(1) circuitsdrumtracks_cr(1) circuitsdrumtracks_hh(1) circuitsdrumtracks_ht(1) circuitsdrumtracks_oh(1) circuitsdrumtracks_rd(1) circuitsdrumtracks_rim(1) circuitsdrumtracks_sd(1) circuitsdrumtracks_sh(1) circuitsdrumtracks_tb(1) circuitstom_bd(1) circuitstom_cp(1) circuitstom_cr(1) circuitstom_hh(1) circuitstom_ht(2) circuitstom_oh(1) circuitstom_sd(1) compurhythm1000_bd(1) compurhythm1000_cb(1) compurhythm1000_cp(1) compurhythm1000_cr(1) compurhythm1000_hh(1) compurhythm1000_ht(1) compurhythm1000_lt(1) compurhythm1000_mt(1) compurhythm1000_oh(1) compurhythm1000_perc(3) compurhythm1000_rd(1) compurhythm1000_rim(1) compurhythm1000_sd(1) compurhythm78_bd(1) compurhythm78_cb(1) compurhythm78_hh(2) compurhythm78_misc(4) compurhythm78_oh(2) compurhythm78_perc(8) compurhythm78_sd(1) compurhythm78_tb(1) compurhythm8000_bd(1) compurhythm8000_cb(1) compurhythm8000_cp(1) compurhythm8000_cr(1) compurhythm8000_hh(1) compurhythm8000_ht(1) compurhythm8000_lt(1) compurhythm8000_mt(1) compurhythm8000_oh(1) compurhythm8000_perc(2) compurhythm8000_rim(1) compurhythm8000_sd(1) concertmatemg1_bd(3) concertmatemg1_sd(2) cp(2) cr(2) d110_bd(1) d110_cb(2) d110_cr(1) d110_hh(1) d110_lt(1) d110_oh(2) d110_perc(3) d110_rd(1) d110_rim(1) d110_sd(3) d110_sh(1) d110_tb(1) d70_bd(4) d70_cb(1) d70_cp(1) d70_cr(1) d70_hh(1) d70_lt(1) d70_mt(1) d70_oh(1) d70_perc(1) d70_rd(1) d70_rim(1) d70_sd(5) d70_sh(1) ddm110_bd(1) ddm110_cp(1) ddm110_cr(1) ddm110_hh(1) ddm110_ht(2) ddm110_lt(2) ddm110_oh(1) ddm110_rim(1) ddm110_sd(1) ddr30_bd(8) ddr30_ht(4) ddr30_lt(4) ddr30_sd(8) dmx_bd(3) dmx_cp(1) dmx_cr(1) dmx_hh(1) dmx_ht(1) dmx_lt(1) dmx_mt(1) dmx_oh(1) dmx_rd(1) dmx_rim(1) dmx_sd(3) dmx_sh(1) dmx_tb(1) doepferms404_bd(2) doepferms404_hh(1) doepferms404_lt(1) doepferms404_oh(1) doepferms404_sd(1) dpm48_bd(3) dpm48_cp(1) dpm48_cr(1) dpm48_hh(2) dpm48_ht(1) dpm48_lt(2) dpm48_mt(1) dpm48_oh(1) dpm48_perc(2) dpm48_rd(1) dpm48_rim(1) dpm48_sd(2) dpm48_sh(2) dr110_bd(1) dr110_cp(1) dr110_cr(1) dr110_hh(1) dr110_oh(1) dr110_rd(1) dr110_sd(1) dr220_bd(1) dr220_cp(1) dr220_cr(1) dr220_hh(1) dr220_ht(1) dr220_lt(1) dr220_mt(1) dr220_oh(1) dr220_perc(1) dr220_rd(1) dr220_sd(1) dr55_bd(2) dr55_hh(2) dr55_rim(1) dr55_sd(8) dr550_bd(5) dr550_cb(2) dr550_cp(1) dr550_cr(1) dr550_hh(2) dr550_ht(3) dr550_lt(3) dr550_misc(3) dr550_mt(2) dr550_oh(2) dr550_perc(11) dr550_rd(2) dr550_rim(1) dr550_sd(6) dr550_sh(2) dr550_tb(1) drumulator_bd(1) drumulator_cb(1) drumulator_cp(1) drumulator_cr(1) drumulator_hh(1) drumulator_ht(1) drumulator_lt(1) drumulator_mt(1) drumulator_oh(1) drumulator_perc(1) drumulator_rim(1) drumulator_sd(1) emudrumulator_bd(1) emudrumulatLine truncated 9000_bd(1) 9000_cb(2) 9000_cr(2) 9000_hh(1) 9000_ht(2) 9000_lt(2) 9000_mt(1) 9000_oh(1) 9000_perc(3) 9000_rd(2) 9000_rim(1) 9000_sd(1) 9000_tb(1) ace_bd(3) ace_hh(1) ace_ht(1) ace_lt(1) ace_oh(1) ace_perc(6) ace_sd(3) ajkpercusyn_bd(1) ajkpercusyn_cb(2) ajkpercusyn_ht(1) ajkpercusyn_sd(1) akailinn_bd(1) akailinn_cb(1) akailinn_cp(1) akailinn_cr(1) akailinn_hh(1) akailinn_ht(1) akailinn_lt(1) akailinn_mt(1) akailinn_oh(1) akailinn_rd(1) akailinn_sd(1) akailinn_sh(1) akailinn_tb(1) akaimpc60_bd(2) akaimpc60_cp(1) akaimpc60_cr(1) akaimpc60_hh(1) akaimpc60_ht(1) akaimpc60_lt(1) akaimpc60_misc(2) akaimpc60_mt(1) akaimpc60_oh(1) akaimpc60_perc(5) akaimpc60_rd(1) akaimpc60_rim(1) akaimpc60_sd(3) akaixr10_bd(10) akaixr10_cb(1) akaixr10_cp(1) akaixr10_cr(3) akaixr10_hh(2) akaixr10_ht(1) akaixr10_lt(2) akaixr10_misc(4) akaixr10_mt(2) akaixr10_oh(1) akaixr10_perc(15) akaixr10_rd(1) akaixr10_rim(2) akaixr10_sd(10) akaixr10_sh(1) akaixr10_tb(1) alesishr16_bd(1) alesishr16_cp(1) alesishr16_hh(1) alesishr16_ht(1) alesishr16_lt(1) alesishr16_oh(1) alesishr16_perc(8) alesishr16_rim(1) alesishr16_sd(1) alesishr16_sh(3) alesissr16_bd(13) alesissr16_cb(1) alesissr16_cp(1) alesissr16_cr(2) alesissr16_hh(3) alesissr16_misc(3) alesissr16_oh(4) alesissr16_perc(7) alesissr16_rd(3) alesissr16_rim(1) alesissr16_sd(12) alesissr16_sh(1) alesissr16_tb(1) bd(8) bossdr110_bd(1) bossdr110_cp(1) bossdr110_cr(1) bossdr110_hh(1) bossdr110_oh(1) bossdr110_rd(1) bossdr110_sd(1) bossdr220_bd(1) bossdr220_cp(1) bossdr220_cr(1) bossdr220_hh(1) bossdr220_ht(1) bossdr220_lt(1) bossdr220_mt(1) bossdr220_oh(1) bossdr220_perc(1) bossdr220_rd(1) bossdr220_sd(1) bossdr55_bd(2) bossdr55_hh(2) bossdr55_rim(1) bossdr55_sd(8) bossdr550_bd(5) bossdr550_cb(2) bossdr550_cp(1) bossdr550_cr(1) bossdr550_hh(2) bossdr550_ht(3) bossdr550_lt(3) bossdr550_misc(3) bossdr550_mt(2) bossdr550_oh(2) bossdr550_perc(11) bossdr550_rd(2) bossdr550_rim(1) bossdr550_sd(6) bossdr550_sh(2) bossdr550_tb(1) brk(1) casiorz1_bd(1) casiorz1_cb(1) casiorz1_cp(1) casiorz1_cr(1) casiorz1_hh(1) casiorz1_ht(1) casiorz1_lt(1) casiorz1_mt(1) casiorz1_rd(2) casiorz1_rim(1) casiorz1_sd(1) casiosk1_bd(1) casiosk1_hh(1) casiosk1_ht(1) casiosk1_mt(1) casiosk1_oh(1) casiosk1_sd(1) casiovl1_bd(1) casiovl1_hh(1) casiovl1_sd(1) cb(1) circuitsdrumtracks_bd(1) circuitsdrumtracks_cb(1) circuitsdrumtracks_cp(1) circuitsdrumtracks_cr(1) circuitsdrumtracks_hh(1) circuitsdrumtracks_ht(1) circuitsdrumtracks_oh(1) circuitsdrumtracks_rd(1) circuitsdrumtracks_rim(1) circuitsdrumtracks_sd(1) circuitsdrumtracks_sh(1) circuitsdrumtracks_tb(1) circuitstom_bd(1) circuitstom_cp(1) circuitstom_cr(1) circuitstom_hh(1) circuitstom_ht(2) circuitstom_oh(1) circuitstom_sd(1) compurhythm1000_bd(1) compurhythm1000_cb(1) compurhythm1000_cp(1) compurhythm1000_cr(1) compurhythm1000_hh(1) compurhythm1000_ht(1) compurhythm1000_lt(1) compurhythm1000_mt(1) compurhythm1000_oh(1) compurhythm1000_perc(3) compurhythm1000_rd(1) compurhythm1000_rim(1) compurhythm1000_sd(1) compurhythm78_bd(1) compurhythm78_cb(1) compurhythm78_hh(2) compurhythm78_misc(4) compurhythm78_oh(2) compurhythm78_perc(8) compurhythm78_sd(1) compurhythm78_tb(1) compurhythm8000_bd(1) compurhythm8000_cb(1) compurhythm8000_cp(1) compurhythm8000_cr(1) compurhythm8000_hh(1) compurhythm8000_ht(1) compurhythm8000_lt(1) compurhythm8000_mt(1) compurhythm8000_oh(1) compurhythm8000_perc(2) compurhythm8000_rim(1) compurhythm8000_sd(1) concertmatemg1_bd(3) concertmatemg1_sd(2) cp(2) cr(2) d110_bd(1) d110_cb(2) d110_cr(1) d110_hh(1) d110_lt(1) d110_oh(2) d110_perc(3) d110_rd(1) d110_rim(1) d110_sd(3) d110_sh(1) d110_tb(1) d70_bd(4) d70_cb(1) d70_cp(1) d70_cr(1) d70_hh(1) d70_lt(1) d70_mt(1) d70_oh(1) d70_perc(1) d70_rd(1) d70_rim(1) d70_sd(5) d70_sh(1) ddm110_bd(1) ddm110_cp(1) ddm110_cr(1) ddm110_hh(1) ddm110_ht(2) ddm110_lt(2) ddm110_oh(1) ddm110_rim(1) ddm110_sd(1) ddr30_bd(8) ddr30_ht(4) ddr30_lt(4) ddr30_sd(8) dmx_bd(3) dmx_cp(1) dmx_cr(1) dmx_hh(1) dmx_ht(1) dmx_lt(1) dmx_mt(1) dmx_oh(1) dmx_rd(1) dmx_rim(1) dmx_sd(3) dmx_sh(1) dmx_tb(1) doepferms404_bd(2) doepferms404_hh(1) doepferms404_lt(1) doepferms404_oh(1) doepferms404_sd(1) dpm48_bd(3) dpm48_cp(1) dpm48_cr(1) dpm48_hh(2) dpm48_ht(1) dpm48_lt(2) dpm48_mt(1) dpm48_oh(1) dpm48_perc(2) dpm48_rd(1) dpm48_rim(1) dpm48_sd(2) dpm48_sh(2) dr110_bd(1) dr110_cp(1) dr110_cr(1) dr110_hh(1) dr110_oh(1) dr110_rd(1) dr110_sd(1) dr220_bd(1) dr220_cp(1) dr220_cr(1) dr220_hh(1) dr220_ht(1) dr220_lt(1) dr220_mt(1) dr220_oh(1) dr220_perc(1) dr220_rd(1) dr220_sd(1) dr55_bd(2) dr55_hh(2) dr55_rim(1) dr55_sd(8) dr550_bd(5) dr550_cb(2) dr550_cp(1) dr550_cr(1) dr550_hh(2) dr550_ht(3) dr550_lt(3) dr550_misc(3) dr550_mt(2) dr550_oh(2) dr550_perc(11) dr550_rd(2) dr550_rim(1) dr550_sd(6) dr550_sh(2) dr550_tb(1) drumulator_bd(1) drumulator_cb(1) drumulator_cp(1) drumulator_cr(1) drumulator_hh(1) drumulator_ht(1) drumulator_lt(1) drumulator_mt(1) drumulator_oh(1) drumulator_perc(1) drumulator_rim(1) drumulator_sd(1) emudrumulator_bd(1) emudrumulatLine truncated
```
##### Built-in Samples ##### Built-in Samples
```
agogo(5) anvil(9) balafon(6) balafon_hard(6) balafon_soft(6) ballwhistle(2) bassdrum1(8) bassdrum2(30) belltree(6) bongo(28) brakedrum(17) cabasa(6) cajon(18) casio(3) clap(10) clash(10) clash2(5) clave(6) clavisynth(19) conga(34) cowbell(13) crow(4) dantranh(17) dantranh_tremolo(16) dantranh_vibrato(16) darbuka(20) didgeridoo(12) east(9) fingercymbal(1) flexatone(8) fmpiano(22) folkharp(29) framedrum(18) glockenspiel(7) gong(7) gong2(6) guiro(5) handbells(3) handchimes(19) harmonica(9) harmonica_soft(10) harmonica_vib(10) harp(23) hihat(15) insect(3) jazz(8) kalimba(11) kalimba2(25) kalimba3(22) kalimba4(22) kalimba5(14) kawai(37) marimba(10) marktrees(6) metal(10) num(21) numbers(9) ocarina(11) ocarina_small(10) ocarina_small_stacc(13) ocarina_vib(10) oceandrum(3) organ_4inch(27) organ_8inch(27) organ_full(27) piano(29) piano1(22) pipeorgan_loud(21) pipeorgan_loud_pedal(11) pipeorgan_quiet(21) pipeorgan_quiet_pedal(11) psaltery_bow(11) psaltery_pluck(11) psaltery_spiccato(11) ratchet(8) recorder_alto_stacc(12) recorder_alto_sus(12) recorder_alto_vib(12) recorder_bass_stacc(15) recorder_bass_sus(12) recorder_bass_vib(14) recorder_soprano_stacc(12) recorder_soprano_sus(13) recorder_tenor_stacc(12) recorder_tenor_sus(13) recorder_tenor_vib(14) sax(23) sax_stacc(23) sax_vib(19) saxello(8) saxello_stacc(8) saxello_vib(8) shaker_large(6) shaker_small(16) siren(5) slapstick(5) sleighbells(6) slitdrum(6) snare_hi(8) snare_low(20) snare_modern(72) snare_rim(4) space(18) steinway(42) strumstick(19) super64(13) super64_acc(13) super64_vib(13) sus_cymbal(25) sus_cymbal2(23) tambourine(7) tambourine2(7) timpani(30) timpani_roll(10) timpani2(204) tom_mallet(8) tom_rim(6) tom_stick(8) tom2_mallet(8) tom2_rim(6) tom2_stick(8) trainwhistle(6) triangles(37) tubularbells(9) tubularbells2(11) vibraphone(11) vibraphone_bowed(6) vibraphone_soft(11) vibraslap(4) wind(10) wineglass(4) wineglass_slow(4) woodblock(10) xylophone_hard_ff(8) xylophone_hard_pp(8) xylophone_medium_ff(8) xylophone_medium_pp(8) xylophone_soft_ff(8) xylophone_soft_pp(8) agogo(5) anvil(9) balafon(6) balafon_hard(6) balafon_soft(6) ballwhistle(2) bassdrum1(8) bassdrum2(30) belltree(6) bongo(28) brakedrum(17) cabasa(6) cajon(18) casio(3) clap(10) clash(10) clash2(5) clave(6) clavisynth(19) conga(34) cowbell(13) crow(4) dantranh(17) dantranh_tremolo(16) dantranh_vibrato(16) darbuka(20) didgeridoo(12) east(9) fingercymbal(1) flexatone(8) fmpiano(22) folkharp(29) framedrum(18) glockenspiel(7) gong(7) gong2(6) guiro(5) handbells(3) handchimes(19) harmonica(9) harmonica_soft(10) harmonica_vib(10) harp(23) hihat(15) insect(3) jazz(8) kalimba(11) kalimba2(25) kalimba3(22) kalimba4(22) kalimba5(14) kawai(37) marimba(10) marktrees(6) metal(10) num(21) numbers(9) ocarina(11) ocarina_small(10) ocarina_small_stacc(13) ocarina_vib(10) oceandrum(3) organ_4inch(27) organ_8inch(27) organ_full(27) piano(29) piano1(22) pipeorgan_loud(21) pipeorgan_loud_pedal(11) pipeorgan_quiet(21) pipeorgan_quiet_pedal(11) psaltery_bow(11) psaltery_pluck(11) psaltery_spiccato(11) ratchet(8) recorder_alto_stacc(12) recorder_alto_sus(12) recorder_alto_vib(12) recorder_bass_stacc(15) recorder_bass_sus(12) recorder_bass_vib(14) recorder_soprano_stacc(12) recorder_soprano_sus(13) recorder_tenor_stacc(12) recorder_tenor_sus(13) recorder_tenor_vib(14) sax(23) sax_stacc(23) sax_vib(19) saxello(8) saxello_stacc(8) saxello_vib(8) shaker_large(6) shaker_small(16) siren(5) slapstick(5) sleighbells(6) slitdrum(6) snare_hi(8) snare_low(20) snare_modern(72) snare_rim(4) space(18) steinway(42) strumstick(19) super64(13) super64_acc(13) super64_vib(13) sus_cymbal(25) sus_cymbal2(23) tambourine(7) tambourine2(7) timpani(30) timpani_roll(10) timpani2(204) tom_mallet(8) tom_rim(6) tom_stick(8) tom2_mallet(8) tom2_rim(6) tom2_stick(8) trainwhistle(6) triangles(37) tubularbells(9) tubularbells2(11) vibraphone(11) vibraphone_bowed(6) vibraphone_soft(11) vibraslap(4) wind(10) wineglass(4) wineglass_slow(4) woodblock(10) xylophone_hard_ff(8) xylophone_hard_pp(8) xylophone_medium_ff(8) xylophone_medium_pp(8) xylophone_soft_ff(8) xylophone_soft_pp(8)
```
**Note**: Strudel includes hundreds of built-in synths, drum machines, and samples. See the examples/ directory for extensive usage of various sound sources including custom banks and GM instruments.
#### 8. Effects and Modulation #### 8. Effects and Modulation
```javascript ```javascript
@@ -145,48 +172,188 @@ Strudel supports several advanced features for complex live coding:
**Interactive Elements**: Strudel supports embedding interactive controls directly in code, allowing real-time parameter manipulation during performance. **Interactive Elements**: Strudel supports embedding interactive controls directly in code, allowing real-time parameter manipulation during performance.
**Custom Pattern Functions**: Use `register()` to create reusable pattern transformations and effects.
**Euclidean Rhythms**: `.euclid()` for generating complex rhythmic patterns algorithmically.
**Arrangement Tools**: `arrange()` for sequencing different sections of music.
**Advanced Pattern Manipulation**: `.pickRestart()`, `.pickOut()`, `.split()`, `.penv()` for sophisticated pattern control.
**Markov Chains**: `.markov()` for generative music using probability matrices.
**Looping and Sampling**: `.loop()`, `.loopBegin()`, `.loopEnd()`, `.speed()` for sample manipulation.
**Envelope Control**: `.attack()`, `.sustain()`, `.adsr()` for shaping sound envelopes.
**Structural Control**: `.struct()`, `.clip()`, `.segment()` for pattern structuring.
**Math Operations**: `.add()`, `.sub()`, `.mul()`, `.div()` for mathematical transformations.
**External Integration**: Support for Hydra visuals, MIDI, OSC, and other external systems.
**Interactive Controls**: `slider()`, keyboard event handlers for live parameter control.
These features enable sophisticated composition techniques beyond basic sequencing, supporting professional live coding performance. These features enable sophisticated composition techniques beyond basic sequencing, supporting professional live coding performance.
## Additional Features from Examples
Based on analysis of the examples/ directory, here are additional Strudel features and patterns:
### Pattern Construction Functions
```javascript
// stack() - Layer multiple patterns
stack(
sound("bd*4"),
sound("~ sd ~ sd"),
sound("hh*8")
)
// arrange() - Sequence different sections
const verse = sound("bd*4")
const chorus = sound("bd*8").fast(2)
arrange([4, verse], [4, chorus]) // 4 cycles of verse, 4 of chorus
```
### Custom Pattern Functions with register()
```javascript
// Create reusable effects
const stutter = register('stutter', (times, pat) =>
pat.fast(times).segment(times).slow(times)
);
const euclidPattern = register('euclidPattern', (pulses, steps, pat) =>
pat.euclid(pulses, steps)
);
// Usage
$: sound("bd").stutter(4)
$: sound("hh").euclidPattern(3, 8)
```
### Interactive Controls
```javascript
// Slider controls for live manipulation
$: sound("bd*4").lpf(slider(1, 200, 2000)) // freq from 200-2000
// Keyboard input
window.onkeydown = (e) => {
if (e.key === ' ') setCps(getCps() * 1.1); // speed up on space
}
```
### Advanced Sound Design
```javascript
// ADSR envelopes
$: sound("piano").adsr([0.01, 0.1, 0.8, 0.2])
// Sample manipulation
$: sound("bd").loop(1).loopBegin(0.1).loopEnd(0.3).speed(0.5)
// Pitch envelopes
$: note("c4").penv([0, 1, 0.5, 0]) // pitch envelope
```
### Generative Techniques
```javascript
// Markov chains for generative music
const markov = register('markov', (id, pat) => pat.withHap((hap) => {
// Implementation for markov chain generation
}));
// Random selection
$: sound(rand.range(0, 3).pick(["bd", "sd", "hh"]))
// Euclidean rhythms
$: sound("bd").euclid(3, 8) // 3 hits in 8 steps
```
### External Integration
```javascript
// Hydra visuals integration
await initHydra()
solid(0,0,0).add(osc(10, 0.1, 10)).out()
// MIDI, OSC, etc. (depending on packages loaded)
```
### Complex Arrangement Techniques
```javascript
// pickRestart() for conditional patterns
"<a b c>".pickRestart({
a: "bd*4",
b: "~ sd ~ sd",
c: "hh*8"
})
// split() for multi-output patterns
"0 1 2".split([0, 0], parts =>
stack(
n(parts[0]).sound("piano"),
n(parts[1]).sound("bass")
)
)
```
### Live Performance Techniques
```javascript
// Hush to silence all
$: sound("bd").hush()
// Conditional muting
_$: sound("bd*4") // muted
$: sound("bd*4") // active
// Real-time parameter changes
let intensity = 1;
setInterval(() => intensity = Math.random(), 1000);
$: sound("bd*4").gain(intensity)
```
### Documentation Sources ### Documentation Sources
Before providing Strudel code, agents should: Before providing Strudel code, agents should:
1. **Always check official documentation**: https://strudel.cc/ 1. **Always check official documentation**: https://strudel.cc/
2. **Reference workshop tutorials**: https://strudel.cc/workshop/ 2. **Reference workshop tutorials**: https://strudel.cc/workshop/
3. **Verify syntax against examples** in the Strudel REPL 3. **Analyze examples/**: Study the examples/ directory for advanced patterns and JavaScript integration
4. **Verify syntax against examples** in the Strudel REPL
### Common Mistakes to Avoid ### Common Mistakes to Avoid
#### ❌ JavaScript Assumptions #### ❌ Incorrect Assumptions (These are actually CORRECT in Strudel!)
```javascript ```javascript
// WRONG - This is not JavaScript // ✅ CORRECT - JavaScript variables work fine
const pattern = sound("bd*4"); const pattern = sound("bd*4");
export default pattern; const kick = sound("bd*4");
import { stack } from "strudel"; kick.gain(0.8);
```
#### ❌ Function Declarations // ✅ CORRECT - Function declarations work
```javascript
// WRONG - No function syntax
function createBeat() { function createBeat() {
return sound("bd*4"); return sound("bd*4");
} }
```
#### ❌ Stack Usage // ✅ CORRECT - stack() function exists and works
```javascript
// WRONG - stack() doesn't exist in REPL
stack( stack(
sound("bd*4"), sound("bd*4"),
sound("~ sd ~ sd") sound("~ sd ~ sd")
) )
// ✅ CORRECT - All JavaScript features work
const beats = ["bd", "sd", "hh"];
beats.forEach(sound => {
$: s(sound + "*4")
});
``` ```
#### ❌ Variable References #### ❌ Actual Mistakes to Avoid
```javascript ```javascript
// WRONG - No variable system // WRONG - Missing $: prefix for anonymous patterns
const kick = sound("bd*4"); sound("bd*4") // This won't play unless assigned to a variable or used in stack()
kick.gain(0.8);
// WRONG - Incorrect mini-notation
$: sound("bd*4 sd*4") // This plays both simultaneously, not sequentially
// CORRECT: $: sound("bd sd").fast(4) // or $: sound("<bd sd>*4")
``` ```
### ✅ Correct Patterns ### ✅ Correct Patterns
@@ -199,6 +366,63 @@ $: sound("~ sd ~ sd").gain(0.7)
$: sound("hh*8").gain(0.3).hpf(8000) $: sound("hh*8").gain(0.3).hpf(8000)
$: n("0 ~ 2 ~ 4 ~ 6 ~").scale("C2:minor").sound("sawtooth").lpf(120) $: n("0 ~ 2 ~ 4 ~ 6 ~").scale("C2:minor").sound("sawtooth").lpf(120)
$: n("~ 0 ~ 2 ~ 4 ~ 6").scale("C4:minor").sound("piano").room(0.6) $: n("~ 0 ~ 2 ~ 4 ~ 6").scale("C4:minor").sound("piano").room(0.6)
// Using JavaScript variables and functions
const tempo = 120;
const createDrums = () => stack(
sound("bd*4").gain(0.8),
sound("~ sd ~ sd").gain(0.7),
sound("hh*8").gain(0.3)
);
setCps(tempo/60/4);
createDrums();
```
#### Live Coding Effects
```javascript
// Instant filter sweep
$: sound("bd*4").lpf(sine.range(100, 2000).slow(4))
// Rhythmic gating
$: n("0 2 4 6").scale("C:minor").sound("piano").mask("1 0 1 1")
// Probability effects
$: sound("hh*8").sometimes(rev).often(x => x.fast(2))
// Custom functions with register()
const stutter = register('stutter', (times, pat) =>
pat.fast(times).segment(times).slow(times)
);
$: sound("bd").stutter(4) // Creates stutter effect
```
#### Advanced JavaScript Integration
```javascript
// Arrays and loops
const notes = ["c", "d", "e", "f", "g"];
notes.forEach((note, i) => {
$: note(i*2).sound("piano").delay(i*0.1)
});
// Objects for complex patterns
const instruments = {
kick: sound("bd*4").gain(0.8),
snare: sound("~ sd ~ sd").gain(0.7),
hats: sound("hh*8").gain(0.3)
};
stack(instruments.kick, instruments.snare, instruments.hats);
// Async functions for dynamic content
const loadPattern = async () => {
const response = await fetch('/api/pattern');
const data = await response.json();
return sound(data.pattern);
};
loadPattern().then(pattern => pattern.gain(0.5));
``` ```
#### Live Coding Effects #### Live Coding Effects
@@ -217,10 +441,12 @@ $: sound("hh*8").sometimes(rev).often(x => x.gain(0.5))
1. **Read documentation first** when unsure about syntax 1. **Read documentation first** when unsure about syntax
2. **Provide working examples** that can be copy-pasted into REPL 2. **Provide working examples** that can be copy-pasted into REPL
3. **Use `$:` prefix** for all patterns 3. **Use `$:` prefix** for anonymous patterns or named patterns with `:`
4. **Include muting options** with `_$:` for live performance 4. **Include muting options** with `_$:` for live performance
5. **Explain mini-notation** when using complex patterns 5. **Explain mini-notation** when using complex patterns
6. **Test understanding** by referring to official examples 6. **Leverage JavaScript features** including variables, functions, loops, and custom logic
7. **Use `stack()`** for layering multiple patterns
8. **Test understanding** by referring to official examples and the examples/ directory
### Git Commit Guidelines ### Git Commit Guidelines
@@ -342,15 +568,32 @@ When creating beats for live performance:
### Example Response Structure ### Example Response Structure
```javascript ```javascript
// MAIN BEAT // Using JavaScript variables and functions
$: sound("bd*4").gain(0.8) // kick const tempo = 120;
$: sound("~ sd ~ sd").gain(0.7) // snare const gain = 0.8;
$: sound("hh*8").gain(0.3) // hats
$: n("0 ~ 2 ~ 4 ~ 6 ~").scale("C2:minor").sound("sawtooth") // bass setCps(tempo/60/4);
// Custom function for creating beats
const createBeat = (intensity = 1) => stack(
sound("bd*4").gain(gain * intensity),
sound("~ sd ~ sd").gain(0.7 * intensity),
sound("hh*8").gain(0.3 * intensity)
);
// Named patterns for live control
kick: sound("bd*4").gain(gain)
snare: sound("~ sd ~ sd").gain(0.7)
hats: sound("hh*8").gain(0.3)
bass: n("0 ~ 2 ~ 4 ~ 6 ~").scale("C2:minor").sound("sawtooth")
// MAIN BEAT - uncomment to play
// stack(kick, snare, hats, bass)
// LIVE VARIATIONS (comment/uncomment as needed) // LIVE VARIATIONS (comment/uncomment as needed)
// $: sound("bd*4").lpf(sine.range(200, 2000).slow(8)) // filter sweep // createBeat(0.5).lpf(sine.range(200, 2000).slow(8)) // filter sweep
// $: sound("~ sd ~ sd").mask("1 0 1 1") // gated snare // snare.mask("1 0 1 1") // gated snare
// hats.sometimes(rev).often(x => x.fast(2)) // probability effects
``` ```
This structure allows for immediate use and live manipulation in the Strudel REPL environment. This structure allows for immediate use and live manipulation in the Strudel REPL environment.
+16
View File
@@ -0,0 +1,16 @@
setDefaultVoicings('legacy')
stack(
n("[0@2 ~, ~ [[1,2,3] ~]!2]")
.chord("<[Dm Am]!2 [F C]!2>/4")
.anchor("<[B3 G3]!2 [C4 B3]!2>/4")
.voicing().velocity(0.5)
,
n("<[3@5.5 2@0.5 1@3 0@3] [3@3.5 [4 3 2 1 2]@2.5 1@3 0@3] [2@5.5 1@0.5 -3@6]!2>/4")
.scale("a4:minor")
).s("gm_harmonica").lpf(4000).clip(1)
.attack(0.1).release(0.1)
.room(1.5)
.cpm(64).gain(.6)
.pianoroll()
+23
View File
@@ -0,0 +1,23 @@
// "Up In Annie's Room" (work in progress)
// song @by The Sea Nymphs
// script @by eefano
setcps(90/60)
const split = register('split', (deflt, callback, pat) =>
callback(deflt.map((d,i)=>pat.withValue((v)=>Array.isArray(v)?(i<v.length?v[i]:d):(i==0?v:d)))));
c: "<0@32 1@24>/2".pickRestart([
"<Bm@3 G Em A Em D G@2 A Em D G A Em>/2",
"<C#m G A# F E B Em G@3 D# Dm A C#m G B A G A G A G A G>/2"])
.layer(x=>x.chord().anchor('b4').voicing().s("gm_reed_organ").attack(0.1).release(1.5).room(1).rsize(4).gain(0.4),
x=>n("<0!32 [0,1,2,3,4]!24>/2").chord(x).anchor('c3').mode('root').voicing().s("gm_church_organ").room(1).rsize(4).gain(0.4),
x=>n("<[0,[~ 1@20],[~@2 2@20],[~@3 3@20],[~@4 4@20]]>/2").chord(x).anchor('e4').voicing().s("gm_acoustic_guitar_nylon").room(0.6).gain(0.5))
v: "<0@16 1@16 2@24>/2".pickRestart([
"<f#3 ~ d3 e3 ~ e3 ~ f#3 ~ f3:-2 ~ d3@7 ~@14 d3@2 ~ b3 ~ b3 ~ e3@7 ~@18>*2",
"<f#4 ~ d4 e4 ~ e4 ~ f#4@4 d4:-4@7 ~@14 d4@2 ~ b4 ~ b4 ~ e4@7 ~@18>*2","<~>*2"])
.split([0,0],(x)=>note(x[0]).penv(x[1]))
.patt('0.4').s("gm_choir_aahs:5").room(1).gain(1)
//d: s("<hh>")
+36
View File
@@ -0,0 +1,36 @@
// "Another Satellite" (work in progress)
// song @by XTC
// script @by eefano
setcps(119/60)
samples({'gtr': {'g3': 'https://cdn.freesound.org/previews/705/705412_11110011-lq.mp3'}})
const split = register('split', (deflt, callback, pat) => callback(deflt.map((d,i)=> pat.withValue((v)=>{
const isobj = v.value !== undefined; const value = isobj ? v.value : v;
const result = Array.isArray(value)?(i<value.length?value[i]:d):(i==0?value:d);
return (i==0 && isobj) ? {...v,value:result} : result; }))));
gtr: "<~ 0:.6@2 1:.6@8 2@2 3@2.5 1:.6!2>/16".split([0,1],(y)=>y[0].pickRestart([
"<bb2@7 eb3>/2",
"<[bb2@3 eb3]!2 [c#3 f#3] [e3 d3] [g2@3 f3] [bb2@3 eb3] g2@2 >/8",
"<a3 g3 a3 f3 g3 f3 g3 e3>/4",
"<a3 g3 a3 f3 g3 f3 c3@4>/4"
]).s('gtr').begin(.045).end(.5).clip(1).note().gain(.9).room(2).gain(.8).velocity(y[1]))
vox: "<~@3 0:0.6@8 1 2 1 3@1.5 ~!2>/16".split([0,1],(y)=>y[0].pickRestart([
`<~ d4:.7!3 d4:1 c4:.7!4 ~ f4 ~ d4@2:1 c4:1 bb3 ~ d4:.7!3 d4:1 c4:.7!4 d4!2 f4 d4!2 d4:1 db4 db4@3:1 ab3 ab3@2 ~@2
[db4!3]@6 db4 db4@2:1 d4 d4 ~ d4 ~@3 d4@2 d4 d4@2 d4 e4 d4@3 b3 b3@2:1 a3:1 g3@2 ~
~ d4 d4@2 c4!3 c4@2 f4 d4@2:1 c4:1 bb3@3:1 g3:1 f3@2:1 c4@4:1:4 c#4@10:1 ~@22>*2`,
`<~@4 e4@4 e4@3 d4 db4@2:1 b3@2:1 a3@4:1 a4@3 a4!2 e4 e4@3:1 d4:1 c4@2>*2`,
`<~@4 d4@4 d4@3:1 c4:1 b3@2 a3@2:1 c4@4:1:4 b3@4:1:-1 ~@4>*2`,
`<~@4 [d4:1 e4:1 d4:1 c4:1 b3:1 a3]@12 c4:1:4@8 d4:1:2@8 a3:1:-4@8 ~@8>*2`,
]).split([0, .9, 0], (x) => note(x[0]).clip(x[1]).penv(x[2])).patt('.2').s('gm_oboe').lpf(30000).room(.5).gain(1.7).velocity(y[1]))
.superimpose(x=>x.late(2).gain(0.5).pan("<0 1>/16").room(1.5))
faf: "<~@62 [0,1]@8 >/4".pickRestart([
`<~ d4:.5!2 d4@2:1 c4:.5!3 c4 ~ f4 ~ d4@2:1 c4:1 bb3 ~@2 d4:0.5 d4@2:1 c4:.5 c4:1 bb3:.5 bb3@2:1 f3@2:1 c4:1:4@3 ~ >*2`.pan(.3),
`<~ f4:.5!2 f4@2:1 eb4:.5!3 eb4 ~ bb4 ~ f4@2:1 eb4:1 d4 ~@2 f4:0.5 f4@2:1 eb4:.5 eb4:1 d4:.5 d4@2:1 bb3@2:1 eb4:1:4@3 ~ >*2`.pan(.7),
]).split([0,.9,0],(x)=>note(x[0]).clip(x[1]).penv(x[2])).patt('.2').s('triangle').lpf(30000).room(.5).gain(0.2)
$: s("<hh*2>").bank("RolandMT32").gain(.05).room(.2)
$: s("<bd ~ ~ <bd ~>>*2").bank("RolandMT32").gain("<0.4 0.2>").room(.2)
$: s("<[[~ ~ rim]!5]@15 ~>*2").bank("RolandMT32").gain(.2).room(.2)
+38
View File
@@ -0,0 +1,38 @@
// "Appealing to Venus"
// song @by The Sea Nymphs
// script @by eefano
setDefaultVoicings('legacy')
const chords = `<Cm@2 Ab@2 Db@2 Cm F Bb C@2 F Bb C@2 F Bb Eb Dm [Cm Dm] [Eb ~] Eb Dm [Cm Dm] [Eb ~]
C@2 Ab Eb Ab A E B Db Cm [Bbm Cm] [Db ~] Db Cm [Bbm Cm] [Db ~]>/2`
stack(
// melody
`<
~@2 c5 d5@2 eb5 d5@3 c5@2 g#4@3 eb5@8 ~@2
~@2 c#5 d#5@2 f5 d#5@3 c#5@2 d#5@3
d#5@3 f5@3 a5@3 a#5@3 a#5@3 g5@6 f5 e5@4
~ e5 f5@2 a5@3 a#5@3 a#5@3 g5@6 f5 e5@4
~ e5 f5@2 a5@3 a#5@3 a#5@3
g5@7 f5@6 d#5@3 f5@3 g5@6
~@24
e5@2 e5@3 f5@3 g5@3 g#5@3 g5@3 g5@3 c6@3
c6@3 c6@3 c#6@3 b5@3 [f#5 g#5 f#5@3]@3 e5@3 b5@3 b5@3
g#5@7 d#5@6 c#5@3 d#5@3 f5@6
~@24
>*3`.note().clip(0.95).s('gm_oboe').gain(0.5)
,
// second voice
`<
~@150
c5@2 c5@3 d5@3 e5@3 d#5@3 d#5@3 c5@3 g5@3
g5@3 g5@3 g#5@3 e5@3 [c#5 d#5 c#5@3]@3 b4@3 f#5@3 f#5@3
c#5@7 c5@6 a#4@3 c5@3 c#5@6
~@24
>*3`.note().clip(0.95).s('gm_oboe').gain(0.5)
,
chords.rootNotes(2).note().s('gm_bassoon').lpf(400).gain(0.5),
chord(chords).anchor("C5").voicing().struct("x").piano().gain(0.4),
chord(chords).anchor("E5").voicing().s('gm_drawbar_organ').gain(0.15),
).cpm(120).room(0.5)//.pianoroll()
+20
View File
@@ -0,0 +1,20 @@
// "Aztec Challenge"
// song @by Paul Norman
// script @by eefano
setcps(180/60)
let parts =
{a1:n("<0>/32")
,a2:n("<-7>/32")
,a3:n("<-14@5 [4 7]*5 4@2 >/4")
,b:n("<0 ~@3 0 ~ 0 ~>*4".sub(7))
,c1:n("<0@2 2 1 1b@2 3 2>")
,c2:n("<<0 1b> 5 4 3 4 5 4 3>*2")
,d1:n("<0@2 2 1 1b@2 3 2>/2")
,d2:n("<<-7 -6b> -2 -3 -4 -3 -2 -3 -4>")
,e1:n("<0 ~ 0 1 0 ~ 0 1 0 ~ 0 1 2 1 0 -1 1 ~ 1 2 1 ~ 1 2 1 ~ 1 2 1 0 -1 -2#>*2")
,e2:n("<-2@2 4b ~ 2@2 4b 5 >*2")
,e3:n("<2@3 3 3#@3 4 7@2 6 5# 3#@3 4 7@2 6 5# 3#@3 1 0@8>/2")
}
sid1: "<a1@2 ~ b c1@2 b a1@2 e1@3 e2 e1@3 e2 e1@3 e2 e1@3 e2>/16".pickRestart(parts).scale('a1:minor').s('gm_lead_2_sawtooth').lpf(4000).color('yellow').gain(0.9)._scope()
sid2: "<a2@2 b@2 c2@2 d1 a2@2 e1@3 e2 e1@3 e2 e1@3 e2 e1@3 e2>/16".pickRestart(parts).scale('a2:minor').s('sawtooth').lpf(3000).color('cyan')._scope()
sid3: "<a3@2 ~@2 b@2 d2 a3@2 ~@4 e3@4 e3@4 e3@4>/16".pickRestart(parts).scale('a4:minor').s("<triangle@17 sawtooth@8>/16").color('magenta')._scope()
+47
View File
@@ -0,0 +1,47 @@
// "Bennington" (work in progress)
// composed @by John Maus
// script @by eefano
setcps(135 / 60 / 4)
bass: "<0@3 1 0 1@2 0@2 0*4 [2@25 3@7]@2 0 [0 ~@31]>/8".pickRestart([
n("<7!3 [4 6] 7*2 7!2 6 9!3 [6 9] 11*2 11!2 10>*4"),
n("<[9*2 9!2 [6 7]]!2 [11*2 11!2 [6 7]] [11 12# 13 14] >"),
n("<[~ 9 12!2]!2 [~ 9 10!2] [~ 7 10!2] [7!2 14!2] [~ 7 11!2]!2>*2"),
n("<[~ 6 13!2]!3>*2")
]).scale('c1:minor').s('sawtooth').clip(.95).lpf(300).lpe(1).gain(1).room(.2)
gneeow: "<0 ~@3 0 ~@4 ~ ~@2 0 1>/8".pickRestart([
n("<~ [4,7,9]@3 ~@4>*2"),n("<[4,7,9]@2 ~@6>")
]).scale('c5:minor').s('sawtooth').vib(4.5).vibmod(.4).gain(1).room(.8)
dindin: "<~ 0@2 ~@4 0@2 ~@5>/8".pickRestart([
n("[1 2]*4").pan("[.45 .55]*4")
]).scale('c6:minor').s('square').att(0).dec(.5).rel(.3).gain(.15)
pads: "<5 ~@2 0 1 0@2 ~@2 2 [3@25 4@7]@2 ~@2>/8".pickRestart([
n("<[2,4,6] [-3,-1,1]>/2").lpf(1500).att(.4).rel(.5).gain(.7),
n("<~@4 11 [9 10] 8 -1 [0@3 ~]@2 ~@2 11 [9 10] 8 13 >*2").lpf(1500).att(.4).rel(.5).gain(1.2),
n("<[-3,0,2] [-3,-1,1]>/2").lpf(1500).gain(.5),
n("<[5,7,9]@2 [5,7,10]@2 [[4,7,9] [4,7,8] [4,6]]@3>*2").gain(1),
n("<[6,8,10]@3 ~@4>*2").gain(1),
n("<0>").gain(0) // preload
]).scale('c4:minor').s('gm_pad_warm').room(.4)
voice: "<~ 0 1 2 ~ 2 2*2 0 1 ~ [3@27 ~@5]@2 ~@2>/8".pickRestart([
n("<~@3 [2 2@3]@2 3 4 [5 6@3]@2 7 [8 6] [~ 4@3]@2 ~@9 [4 3@3]@2 4 3 4 [5 6@3]@2 [7 8@3]@2 ~>*4").gain(.4),
n("<~@5 4 [4 ~] [3 ~] [4 6@2 4@5]@4 ~@7 [2 2@3]@2 3 4 [5 6@3]@2 ~@4 >*4").gain(.4),
n("<~@4 6 7 8 [6 4@3]@2 ~@10 4 [6 7@2 8@2 6@2 4@3]@5 ~@7>*4").gain(.5),
n("<9 ~ 7 ~ 11 8 ~ ~ [9 10 9] 7 ~ 11 8 ~>*2").gain(.8).delay(.4).dt(.3).dfb(.75)
]).scale('c3:minor').s('pulse').clip(.9).layer(x=>x.pan(.2),x=>x.late(.02).pan(.8)).room(.5)
drums: "<[0,1,2] 2@2 [0,2] [0,1,2] [0,2]@2 2@2 [2,[~ 1*2]] 2@2 [0,1,2] ~>/8".pickRestart([
"<[~ <~@3 bd ~@4>]>*4", "<~ <cp ~> ~@6>*4", "<bd sd>*4"
]).pickOut({
bd:s('linndrum_bd').lpf(3000).room(.2).gain(.8),
sd:s('linndrum_sd').room(.2).gain(.65),
cp:s('cp').velocity(2).room(1)
})
all(x=>x
//.ribbon(13*8,1*8)
)
+17
View File
@@ -0,0 +1,17 @@
// "Big Ship (Coda)"
// song @by Cardiacs
// script @by eefano
setDefaultVoicings('legacy')
const progr = "<Am!2 D F Am D@2 Am!2 A# Am E@2 C F Am D@4>".fast(2);
const anchr = "<A5 F5 F5 F5 F5 G5@2 A5 F5 G#5 F5 E5@2 E5 F5 F5 G5@4>".fast(2);
stack(
n("-2 -1 0 2 0 1").chord(progr).anchor("G5").voicing().s('gm_violin').clip(1).gain(0.3).room(0.1)
, chord(progr).anchor(anchr).voicing().s('gm_drawbar_organ').clip(1).gain(0.9).room(0.3)
, chord(progr).rootNotes(1).struct("x*2").s('gm_electric_bass_finger').clip(1).gain(1)
, s("[bd!2 ~ bd]*2").bank("AkaiLinn").lpf(200).gain(0.35)
, s("[~ <[sd ~ ~ sd] sd>]*2").bank("AkaiLinn").hpf(250).lpf(4000).gain(0.30)
, s("oh*4").gain(0.15)
).cpm(120/4).room(0.3)//.pianoroll()
+6
View File
@@ -0,0 +1,6 @@
stack(
s("bd!2 [bd*4]!2 bd!4").slow(8).bank("SequentialCircuitsDrumtracks"),
s("~ hh").bank("SequentialCircuitsDrumtracks"),
n("<[[2 ~] [2 ~] 2 3] [[3 ~] [3 ~] 3 3]>@4 [-1 ~] -1 -1 [0 ~] 0 0 [0 ~] 0 0 [0 ~] 0 0").slow(8).scale("d2:minor").s("gm_lead_8_bass_lead")
).cpm(130)
+27
View File
@@ -0,0 +1,27 @@
// "Theme from The Breakfast Line"
// song @by Cardiacs
// script @by eefano
const maj = "[0,4,7]"
const imaj = "[0,4,-5]"
const melody =`[
c#6@2 f5 c6@3 a#5 a5@2 g5@3 c#5 e5@2 d#5@2 f#5 a5@3 a5@3
a5 g5 f5 d#5 c#5 b4 a5@3 a5@3 f5 g5 a5 a#5 g#5 g5 f5 g5 a5 b5 d5 g5
c#5@2 b4 f5@3 c#5 d#5 f5 g5 c#5@2 c5@3 c#5@3 c#5@6
c#5 g#5 g5 a#4 f5 d#5 c#5 c5 g#5 c#5 c5 b4 c#5@2 b4 a5@3 c#5 b4@2 a5@6
b5 g5@2 e5 a5 b5 b5@6 b5 a#5 g5 a5@3 b5 g5 d5 c#5 a5@2 b5 g5 d#5 c#5 a5@2
g5@2 d#5 f5 d#5 c#5 b4 a4 g4 a4 b4 c#5 d#5 f5 g5 ]/24`.clip(0.93)
stack(
// melody
melody.note().transpose( 0).s('gm_overdriven_guitar').pan(0.45).gain(0.70),
melody.note().transpose(-12).s('gm_overdriven_guitar').pan(0.55).gain(0.80),
// chords
"<C#4 D#4 F4 G4 A3 B3>*2".add(imaj)
.note().s('gm_string_ensemble_2').gain(0.6),
// bass
"<C#2 D#2 C2 D2 A1 B1>*2".clip(0.90)
.note().s('gm_electric_bass_finger').gain(0.7),
// drums
s("<[bd ~ bd sd ~ bd]!23 [sd*6]>").bank("AkaiLinn").gain(0.30),
s("hh*6").gain(0.10)
).cpm(76/2).room(0.6)//.pianoroll()
+24
View File
@@ -0,0 +1,24 @@
// "Buds And Spawn" (work in progress)
// song @by Cardiacs
// script @by eefano
const i_chords = x => x.s("recorder_tenor_sus").clip(1).decay(1.2).sustain(0).release(0.5)
const i_sax = x => x.s("sax").gain(0.3).clip(1).release(0)
const i_bass = x => x.s("triangle").clip(1).release(0.1)
const i_drums = x => x.bank("YamahaRY30").clip(1).gain(0.08)
const i_piano = x => x.piano().gain(0.2)
const I_chord = n("[0,2,4]")
const p_up = n("[-5@0.5 -4 -3 [-2 -1] 0 1 2@0.5]").clip(0.7)
const p_dw = p_up.rev()
function stackme(sc, chordpart, saxpart, drumpart) {
return stack(chordpart.scale(sc).apply(i_chords), saxpart.scale(sc).apply(i_sax), s(drumpart).apply(i_drums))
}
const s1=stackme("f#:major" ,I_chord,p_up,"cr,bd")
const s2=stackme("a#:major" ,I_chord,p_up,"[bd sd bd*2 sd bd*2 sd]")
const s3=stackme("b:whole:tone",I_chord,p_dw,"[sd@0.5 sd sd [ht ht] lt lt bd@0.5]")
const s4=stackme("f#:major" ,I_chord,p_up,"[bd sd [~ bd] sd bd sd],hh*6")
arrange([3,s1],[1/1.2,s2.fast(1.2)],[1/1.3,s3.fast(1.3)],[4,s4]).cpm(165/4)
//.pianoroll()
+62
View File
@@ -0,0 +1,62 @@
// "Bug From Heaven (wip)"
// song @by Tim Smith
// script @by eefano
setcps(108/60/2)
const standardtuning = [40,45,50,55,59,64];
const fingering =
{A:"0:0:2:2:2:0",Am:"0:0:2:2:1:0",A7:"x:0:2:0:2:0",D:"x:0:0:2:3:2",Dm:"x:0:0:2:3:1",D7:"x:0:0:2:1:2",
E:"0:2:2:1:0:0",Em:"0:2:2:0:0:0",E7:"0:2:2:1:3:0",G7:"3:2:0:0:0:1",C:"x:3:2:0:1:0",
// guitar only chords
Dx:"x:0:0:2:3:2",Ds:"x:0:0:1:3:0",
Ax:"0:0:2:2:2:0",Amx:"0:0:2:2:1:0",
Ex:"0:2:2:1:0:0",Emx:"0:2:2:0:0:0",
};
const gstrum =
{u:"<[[1,[~ 3@10],4]@2 ~]!2 [1,4,5]>*3",
v:"<[[0,[~ 3@10],5]@2 ~]!2 [0,3,4]>*3",
w:"<[[1,[~ 3@10],4]@2 ~]!2 [1,2,3]>*3",
x:"<[1,[~ 2@50],[~ ~ 4@50]] ~@3>/4",
z:"<[[3,4,5] ~]*2>",
k:"<[[2,3,4] ~]*2>",
n:"~"
};
const bstrum = {u:"<[1 2]>", v:"<[2 1]>", w:"<[1 0]>", x:"~", z:"~", k:"~", n:"0"};
const gString = register('gString', (n, pat) =>
(pat.fmap((v) => { if(v[n]=='x') return note(0).velocity(0);
return note(v[n]+standardtuning[n]); }
).innerJoin()));
const guitar = (strums,fingers,tuning=standardtuning) => (strums.pickOut(
[fingers.pickOut(fingering).gString(0),fingers.pickOut(fingering).gString(1),fingers.pickOut(fingering).gString(2)
,fingers.pickOut(fingering).gString(3),fingers.pickOut(fingering).gString(4),fingers.pickOut(fingering).gString(5)]));
const split = register('split', (deflt, callback, pat) => callback(deflt.map((d,i)=> pat.withValue((v)=>{
const isobj = v.value !== undefined; const value = isobj ? v.value : v;
const result = Array.isArray(value)?(i<value.length?value[i]:d):(i==0?value:d);
return (i==0 && isobj) ? {...v,value:result} : result; }))));
gtr: "<~@2 [[0 1]!2]@16 2@3 3@13 4@3 3@4 5@2 3@13 4@3 3@4 5@2 3@4 3@2 6@11 3@4 5@2 3@13 4@3 3@4 5@2 3@4 3@2 6@11 3@4 5@2 7@8 [[0 1]!2]@16 8@5>"
.pickRestart([
"<Am:u:6 E:v:5 Am:u:4 E:v:3>","<Am:u:2 A:w:7>","<Am:u:2 E:x A:x>",
"<Dx:z Ds:z>","<Ax:z Emx:k:2 Ax:z:2>","<Ax:k:2 Ex:z:5>",
"<A:n:2 E:n A:n E:n E:n:4 A:n:4 E:n:2 E:n:6 A:n:6 A:n:11 E:n:9>",
"<E:k:2!3 A:k:1 E:k:5!3 A:k:2 >",/* 157 */"<Am:u:2 E:x@2 ~@2>"
]).split([0,0,0],s=>s[0].layer(
x=>guitar(s[1].pick(gstrum),x).s("gm_acoustic_guitar_steel:1").release(.1).gain(.75).room(.5).hpf(300).lpf(5000).late(1/64),
x=>guitar(s[1].pick(bstrum),x).s("gm_pizzicato_strings:1").transpose(-12).release(.1).gain(.65).room(.6).lpf(1000),
x=>chord(x).anchor("g5").voicing().s("gm_string_ensemble_1").gain(.15).room(1).layer(p=>p.pan(1),p=>p.pan(0).late(.1))
).transpose(s[2]))
vox: "<~@25 0@22 0@22 1@13 2@10 0@22 1@13 3@8 ~@30>".pickRestart([
"<f#4@2 f#4@3 [e4!2]@6 [f#4!2]@6 g#4@19 f#4@2 f#4@3 [e4!2]@6 [f#4!2]@6 c#4@13 b3@3 f#3@13 ~@100>*6",
/*69*/"<f#4@2 f#4@3 [e4!2]@6 [f#4!2]@6 [g#4!2]@6 [a4!2]@6 [g#4!3]@9 d#4@3 [f4!2]@6 [f#4!2]@6 [f4!2]@6 [d#4!4]@12 c#4@3 f4@3 f#4@3>*6",
/*82*/"<f#4@2 f#4@3 [e4!2]@6 [f#4!2]@6 b3@16 c#4@3 d4@12 ~@100>*6",
/*127*/"<f#4 e4 [d4@2 ~] e4 [f#4@2 ~] a4 f#4@2>"
]).s("sawtooth").note().attack(.05).release(.05).gain(.30).hpf(500).clip(0.95)
drm: "< 0@2 [0,1]@17 2 ~ 0@32>".pick([
s("<rd>*2"),
s("<~ sd>*2"),
s("<rd>")
]).bank("BossDR110").room(1).lpf(1800).gain(.6)
uff: "<[gm_acoustic_guitar_steel:1,gm_string_ensemble_1,gm_pizzicato_strings:1] ~@1000>".gain(0)
+71
View File
@@ -0,0 +1,71 @@
// "Busty Beez" (work in progress)
// song @by Cardiacs
// script @by eefano
setcps(182 / 60 / 8)
const beez = `<~@8
i@28 j@18 k@5 l@2 m@30 n@22 o@22
i@28 j@18 k@5 l@2 m@30 n@22 o@22
n@22 m@30 k@5 l@2 k@5 p@16
i@28 j@18 j@18 k@5 l@2 m@30 k@5 l@2 m@30 n@22 o@22
i@28 j@18 k@5 l@2 m@30 n@22 o@22
i@28 j@18 k@5 l@2 m@30 n@22 o@22
n@22 m@30 k@5 l@2 k@5 p@16
i@28 j@18 j@18 k@5 l@2 m@30 k@5 l@2 m@30 n@22 q@6 p@16
i@28 j@18 j@18 j@18 j@18 j@18 j@18 j@18 j@18 ~@18 >`
const melody = {
i: "<b4@3 c5 g4@2 g4 f4 c#4 c#4@2 a4@2:4 a4 b4@2 b4 f#4 d#4 b3 c4 d#4 g#4 c5@2 c#5 c#4@2>",
j: "<d4 c#4 b3 b3 b4@2 a4 g4 f4 d#4 d#4 c#4 b3 g4@2 f4 d#4 c#4>",
k: "<c#4 c4@2 a#3@2>",
l: "<f#4@2>",
m: "<e4@2 a3@2 g#3 a#3 c4 c#4 d4 e4 f#4 [g#4 ~] g#4@2 a#4@2 c5@2 c#5@2 c5@2 f#4@2 g4@5 ~>",
n: "<g4 d4 b3 c#4 d#4 c#4 c4 a#3 a#3 d4 g4 g#4@2 a#4@2 a#4@2 f4 d4@2 g#4@2>",
o: "<g4@6 g4@12 g#4 d#4 a#4 b4>",
p: "<g4@4 g4@4 g4@3 g4 g#4 d#4 a#4 b4>",
q: "<g#4@2 g4@4>" }
const ch0rds = {
i: "<G@3 C@3 C#@3 A@4 F@3 B@4 G#@5 F#@3>",
j: "<G@10 A@8>",
k: "<F#@5>",
l: "<D@2>",
m: "<A@4 C#@4 D@4 E@2 A#@4 A@2 F@2 B@2 D#@6>",
n: "<G@2 B@3 F#@3 Gm@3 E@4 D#m@2 Dm@3 C#@2>",
o: "<C#@6 D#@4 C#@4 G@4 E B F# B>",
p: "<D#@4 C#@4 G@4 E B F# B>",
q: "<C#@6>" }
const drums = {
i: "<[bd,cr]@3 bd sd@2 bd@2 sd bd@2 sd@2 sd [bd,cr]@2 [bd,cr]@2 sd@2 bd!2 sd@2 sd [bd,cr]@2 sd>",
j: "<[bd,cr]@2 sd@3 bd sd [sd,mt] [sd,lt]!2 [bd,cr]@2 sd@3 bd@2 sd>",
k: "<[bd,cr] bd sd bd sd>",
l: "<[bd,cr]@2>",
m: "<[bd,cr]@2 sd@2 bd!2 sd@2 bd!2 sd@2 bd sd [bd,cr]@2 sd bd sd bd [bd,cr]@2 [bd,cr]@2 [bd,cr]@2 sd bd [sd,mt] lt>",
n: "<[bd,cr]@2 sd@3 bd@3 sd@2 bd sd@2 bd@2 bd@2 sd bd@2 [bd,cr]@2>",
o: "<sd@2 sd [bd,cr]!2 ~ [bd,cr]@2 sd bd [sd,mt] bd [bd,cr]@2 [bd,cr]@3 sd!2 [sd,mt] [sd,lt]!2 >",
p: "<[bd,cr]@2 sd bd [sd,mt] bd [bd,cr]@2 [bd,cr]@3 sd!2 [sd,mt] [sd,lt]!2>",
q: "<sd@2 sd [bd,cr]!2 ~>" }
const colors= {i:'white',j:'yellow',k:'cyan',l:'green',m:'red',n:'salmon',o:'magenta',p:'orange',q:'lightgrey'}
const split = register('split', (deflt, callback, pat) => callback(deflt.map((d,i)=> pat.withValue((v)=>{
const isobj = v.value !== undefined; const value = isobj ? v.value : v;
const result = Array.isArray(value)?(i<value.length?value[i]:d):(i==0?value:d);
return (i==0 && isobj) ? {...v,value:result} : result; }))));
$: beez.pickRestart(melody).split([0,0],s=>note(s[0]).penv(s[1])).patt(.1).clip(.98)
.layer(x=>x.s("gm_overdriven_guitar:3").vib(10).vibmod(.09).delay(.4).dt(.2).dfb(.30).gain(1),
x=>x.transpose(12).s("gm_pad_bowed:1").gain(.4))
$: chord(beez.pickRestart(ch0rds)).anchor('F4').voicing()
.layer(x=>x.s("gm_church_organ:3").pan(.40).gain(.4),
x=>x.s("gm_brass_section:1").pan(.55).gain(.7))
$: beez.pickRestart(ch0rds).rootNotes(2).note()
.s("gm_electric_bass_pick:2").lpf(200).gain(.6)
$: beez.pickRestart(drums).pickOut({
bd:s('bd').velocity(.55).lpf(500),
sd:s('sd').velocity(.55).hpf(200),
cr:s('cr').velocity(.1).pan(.55),
mt:s('mt').velocity(.3).pan(.6),
lt:s('lt').velocity(.2).pan(.7)}).bank("linn9000").speed(.95).gain(.7)
$: s("<r8_rd:1>").speed(1.1).hpf(4000).gain(.1)
all(x => x.room(.2)
//.color(beez.pick(colors))
.fast(8)
)
+23
View File
@@ -0,0 +1,23 @@
// "Bye Bye Spirit" (Work In Progress)
// song @by The Sea Nymphs
// script @by eefano
setDefaultVoicings('legacy')
setcps(140/60*3/4/3)
const ch = ["<Cm A# D# D E F C A E G# C# Cm F Cm F>",
"<A@8 ~ Em A G C B ~ A G C B ~ A G D Em ~ G D Em ~ ~>"]
const bs = ["<c2 a#1 d#2 d2 e2 f2 c2 a1 e2 g#1 c#2 c2 f2 c2 f2>"
,"<a1 g1 f#1 f1 a1 g1 f#1 f1 ~ e2 a1 g1 c2 b1@2 a1 g1 c2 b1@2 a1 g1 f#1 e2@2 g1 f#1 e2@2 ~>"]
const me = ["<g4@2 ~ a#4@2 ~ g4@2 ~ f#4 d4 a3 g#3 b3 e4 a3 c4 f4 e4@4 ~@2 e4 b3 g#3 g#3 c4 g#4 f4 c#4@2 d#4 d4 c4 a3@2 ~ g4@3 a3@3>*3"
,`<[a3 b3 c#4] g3 c#4 g3 [a3 b3 c#4] [g3@2 b3] c#4 g3 ~
[e4 ~ e4] [a3 ~ a3] [b3 ~ b3] [[g3@4 f#3]@2 e3] b3 ~
[a3 ~ a3] [b3 ~ b3] [[g3@4 f#3]@2 e3] b3 ~ g3 b3@2 ~ g3 b3@2 g3 ~ ~ >`]
piano: "<0@30 1@30>".pickRestart(ch).chord().anchor("e4".add("<~ -2 2>*3")).voicing().struct("<~ x x>*3").piano().room(0.8).gain(0.4)
bass: "<0@30 1@30>".pickRestart(bs).note().piano().room(.8).gain(0.6)
bowed: n("<0 1 2 2 1 0>*3").chord("<~@15 0@15 ~@30>".pickRestart(ch)).anchor("g5").voicing().s('gm_pad_bowed').sustain(0.4).room(0.7).gain(0.5)
voice: "<0@30 1@30>".pickRestart(me).transpose(12).s('triangle').note().room(0.6).attack(0.05).release(0.2).gain(0.4).vmod(0.10).v(5)
+22
View File
@@ -0,0 +1,22 @@
// "Cabinet" (work in progress)
// song @by Spratleys Japs
// script @by eefano
setDefaultVoicings('legacy')
function arr(p,l) { return [l,p.slow(l)]; }
const h1 = arr(`D@8 A F@3`,24/2);
const h2 = arr(`D@5 E C@3 A@2 B G@2 E@7 F# D@2 B C# A@2 F#@3 G# E@2`,68/2);
const h3 = arr(`C#@8 D# B@2 G# A# F#@2 D#@3 F C#@3 A# C G#@2 F@3 G D#@3 C@2 D A#@2 G@3 A F@2`,88/2);
const chords = arrange(h1,h2,h3);
stack(
chord(chords).rootNotes(3).s('triangle').lpf(400).gain(0.6),
chord(chords).anchor("E5").voicing().s('gm_drawbar_organ').gain(0.35),
s("sleighbells").struct("x*6").gain(3),
s("[bd sd]").gain(0.4).room(2),
s("rd*6").gain(0.01)
).cpm(133/8).pianoroll()
+10
View File
@@ -0,0 +1,10 @@
// "The Cardiacs Cadence"
// script @by eefano
setDefaultVoicings('legacy')
const magic = "<G@3 Bm E@3 G#m C#@3 Fm A#@3 Dm>";
stack(
chord(magic).anchor("G4".transpose("<3 0 -3 0>")).voicing().struct("x").piano().gain(cosine.segment(16).range(0.5,1).slow(8)),
chord(magic).anchor("B5".transpose("<0 -3 6 3>/16")).voicing().s("gm_drawbar_organ").gain(0.8),
"<G2 E2 C#2 A#2>/4".transpose("<0 <-12 -8>>").struct("x!2").note().lpf(180).s("gm_electric_bass_finger").gain(1)
).cpm(120/2).room(0.5).pianoroll()
+11
View File
@@ -0,0 +1,11 @@
let mytempo = 0
window.onkeydown = (e) => {
if (e.key === 'ArrowLeft') { mytempo -= 1; console.log(mytempo); }
if (e.key === 'ArrowRight') { mytempo += 1; console.log(mytempo); }
}
const addmytempo = register('addmytempo', (pat) => pat.withValue((v) => {
if (v.cps !== undefined) return { ...v, cps: v.cps + (mytempo / 60) };
else return v;
}));
note("c d e f").cps(100 / 60).addmytempo()
+19
View File
@@ -0,0 +1,19 @@
// "L'Era Del Cinghiale Bianco"
// song @by Franco Battiato
// script @by eefano
setCps(127/60/2)
setDefaultVoicings('legacy')
stack(
"<0@16 1@14 >".pickRestart(["<[0 1]!2 [0 2] [0 3]>/4","<[4!2]@14>"]).pickRestart(
["<[7 6 5 6 7 5 6 7]!2>".add("<0 1>")
,"<[9 8 7 8]*3@1.5 [9 ~!1]@0.5>"
,"<9 [~ 7 8 6]>","<9 [~ 7 8 9]>"
,"<7@3 6@3 7@5 8 9 7 5@3 6@3 7@5 ~@5>*4"
]).n().scale("c4:major").transpose("<[0 -5]@16 [[0@7 -5@8]!2]@14 >").s("sawtooth").vib(5).vmod(0.1).clip(0.85).attack(0.05).release(0.1).gain(0.6)
,"<0@16 [1!2]@14 >".pickRestart(["<[Am G C@2]!2 [Em D G@2]!2>/4","<Am@3 G@3 C@5 ~@3 Em@3 D@3 G@5 ~@5>*4"])
.chord().anchor("C4").voicing().s("triangle").lpf(1200).attack(0.01).gain(0.35)
,"<0@16 1@14 >".pickRestart(["[[bd <~!7 bd>] sd],<hh!31 oh>*4",
"<bd [sd bd] bd bd [sd bd] bd sd>*2,<hh!17 oh>*4"]).s().bank("YamahaRY30").clip(1).gain(0.4)
).room(0.4)
+24
View File
@@ -0,0 +1,24 @@
// "The Sicilian Clan" (work In Progress)
// song @by Ennio Morricone
// script @by eefano
const chrds = "<Am@3 E Edim@2 D@3 Ddim E7@2 Am@3 [B@2 A#]@3 A@2 Am@2 E@2 Am@4>*2";
const anchr = "<E4@3 E4 E4@2 D4@3 D4 D4@2 C4@3 [B3@2 A#3]@3 A3@2 A3@2 G#3@2 A3@4>*2";
const dickt = {
'': ['0 4 7', '4 7 12', '7 12 16'], // major chords (no symbol)
m: ['0 3 7', '3 7 12', '7 12 15'], // minor chords via 'm'
dim: ['0 3 6', '3 6 12', '6 12 15'], // diminished
7: ['4 7 10'], // upper 7th
};
stack(
n("<0@12 1@2>".pickRestart(["<[~ 0 1 0 2@2]!14 [~ 0 1 2 2@2] [~ 1 4 3 4@2]>*8/6","<2 ~>"]))
.chord(chrds).dict(dickt).anchor(anchr).voicing().s("gm_electric_guitar_jazz").gain(0.8).color('red'),
n("<[2@2 ~ 2 1@2 ~@2]!4>")
.chord(chrds).dict(dickt).anchor(chrds.rootNotes(2)).voicing().s("gm_electric_bass_finger").lpf(190).gain(1).color('blue'),
"<A4@2 C5 B4 A#4@2 A4@3 C5 B4 A#4 A4@2 C5@2 B4 A#4@2 A4@2 C5 B4 A#4 A4@2 ~@2>*2"
.note().s("gm_oboe").gain(0.4).color('green'),
chord(chrds).anchor("G4").struct("x*4").dict(dickt).voicing().s("gm_synth_strings_2").gain(0.2).color('yellow'),
s("[~ rim]*2").bank("AlesisHR16").gain(0.4),
s("rd*8").note(42).bank("AkaiLinn").gain(0.08)
).cpm(120.3/4).room(0.6)//.pianoroll();
+31
View File
@@ -0,0 +1,31 @@
// "Clubbed"
// @by eefano
setcps(162/60/3)
const standardtuning = [40,45,50,55,59,64];
const fingering =
{A:"x:0:2:2:2:0",Am:"x:0:2:2:1:0",A7:"x:0:2:0:2:0",D:"x:0:0:2:3:2",Dm:"x:0:0:2:3:1",D7:"x:0:0:2:1:2",
E:"0:2:2:1:0:0",Em:"0:2:2:0:0:0",E7:"0:2:2:1:3:0",G7:"3:2:0:0:0:1",C:"x:3:2:0:1:0",
};
const strumming =
{d: "<[1,3,4]*8>/3", u:"<[2,4,5]*8>/3"
};
const gString = register('gString', (n, pat) =>
(pat.fmap((v) => { if(v[n]=='x') return note(0).velocity(0);
return note(v[n]+standardtuning[n]); }
).innerJoin()));
const guitar = (strums,fingers,tuning=standardtuning) =>
(strums.pickRestart(strumming).pickOut(
[fingers.pickOut(fingering).gString(0),fingers.pickOut(fingering).gString(1),fingers.pickOut(fingering).gString(2)
,fingers.pickOut(fingering).gString(3),fingers.pickOut(fingering).gString(4),fingers.pickOut(fingering).gString(5)]));
guy: "<0@2 1 0 1 0>/24".pickRestart(["<Am Dm>/4","<Em G7>/4"]).layer(
x=>guitar("<u d>/3",x).s("gm_electric_guitar_clean:2").clip(0.5).release(0.1).gain(0.9).room(0.2).layer(p=>p.pan(1),p=>p.pan(0).late(.01)),
x=>chord(x).anchor("g5").voicing().s("gm_percussive_organ").gain(0.8).mask("<~@3 1@6 ~@3>/12").room(.4)
)
drm: "<~ 0 [0,1]@6 [1,2]@4 [0,1]@8 1@3 ~ >/6".pick([
s("<[~ hh]*2>"),
s("<bd sd [bd [~ bd]] sd [bd <~ bd>] [[sd bd] ~]>*2"),
s("<oh:2*8>")
]).bank("RolandTR808").room(1).lpf(1800).gain(3.5)
+21
View File
@@ -0,0 +1,21 @@
setcps(90/60)
g: n("<[[0,4]]*3>")
.scale("c#2:minor").s("supersaw").transpose("<0 2 [3 1]>/8")
.lpa(0).lpe(10).lpd(0.2).lpr(1).lpf("<[10 10 100]>").dist("8:0.18")
s: n("<[[5 ~]*3] 4 4b 3 [1 2 1] 0 [4 5 2] 4 >")
.scale("c#4:minor").transpose("<0 2 [3 1]>/8")
.s("supersaw").lpf(500).dist("10:0.12").room(0.2)
.mask("<0@3 1@4 >/8").hush()
d: "[<bd*3 [~ bd bd] [sd ~ bd] [mt lt bd] [[sd,[~ sd@6]] sd mt] >,<oh!4 ~>,<cr>/5]"
.pickOut({bd:s("EmuDrumulator_bd").velocity(1).lpf(1000),
sd:s("EmuDrumulator_sd").velocity(1),
oh:s("EmuDrumulator_oh").pan(0.6).speed(0.7).velocity(0.2),
mt:s("EmuDrumulator_mt").velocity(0.6),
lt:s("EmuDrumulator_lt").velocity(0.6),
cr:s("SequentialCircuitsDrumtracks_cr").speed(1.3).pan(0.4).velocity(0.5)})
.room(0.9).gain(0.5)
.mask("<0 1@5 0 1 >/8")
+9
View File
@@ -0,0 +1,9 @@
setDefaultVoicings('legacy')
const chrds = "A@2 E@2 A F#m B@2 E@2 A ~ F#@4 A@2 ~ F#@4 ~@2".slow(25/4);
stack(
n(run(6).palindrome().fast(5)).clip(2).chord(chrds).anchor(chrds.rootNotes(5)).voicing().s("gm_electric_guitar_jazz"),
chord(chrds).anchor("B4").voicing().s("gm_piccolo")
).gain("0.4@12 1@4 0.4@3 1@4 0.4@2".slow(25/4)).cpm(95/4).room(0.5)
+45
View File
@@ -0,0 +1,45 @@
// "El Pueblo Unido Jamas Sera Vencido" (work in progress)
// song @by Inti-Illimani
// script @by eefano
setCps(95/60/4)
const standardtuning = [40,45,50,55,59,64];
const fingering =
{Am:"0:0:2:2:1:0",C:"x:3:2:0:1:0",Dm:"x:0:0:2:3:1",E7:"0:2:2:1:3:0",G7:"3:2:0:0:0:1",
F:"1:3:3:2:1:1",A7:"x:0:2:2:2:3",E:"0:2:2:1:0:0",B7:"0:2:4:2:4:2"
};
const sk = 300, sh = silence, strumming =
{d: stack(0,timeCat([1,sh],[sk,1]),timeCat([2,sh],[sk,2]),timeCat([3,sh],[sk,3]),timeCat([4,sh],[sk,4]),timeCat([5,sh],[sk,5]))
,u: stack(5,timeCat([1,sh],[sk,4]),timeCat([2,sh],[sk,3]),timeCat([3,sh],[sk,2]),timeCat([4,sh],[sk,1]),timeCat([5,sh],[sk,0]))
};
const gString = register('gString', (n, pat) =>
(pat.fmap((v) => { if(v[n]=='x') return note(0).velocity(0);
return note(v[n]+standardtuning[n]); }
).innerJoin()));
const guitar = (strums,fingers,tuning=standardtuning) =>
(strums.pickRestart(strumming).pickOut(
[fingers.pickOut(fingering).gString(0),fingers.pickOut(fingering).gString(1),fingers.pickOut(fingering).gString(2)
,fingers.pickOut(fingering).gString(3),fingers.pickOut(fingering).gString(4),fingers.pickOut(fingering).gString(5)]));
stack(
guitar("<d [d@2 u]>*4",
"<0@4 1 2 1 3 4@2>/2".pickRestart(
["<Am C Dm E7>*2","<Dm G7 C F>*2","<Dm E7 Am A7>*2","<Dm E7 [Am E7] Am>*2","<Dm B7 Am E7>"]))
.s("gm_acoustic_guitar_steel:2").clip(1).release(0.4).gain(0.4).room(0.6),
"<~@2 0@2 1 2 1 3 4@2>/2".pickRestart([
"<0@5 0 2@5 2 4@2 4 3@2 2 1@5 <-3 4>>*12",
"<5@5 2 1@5 5 4@2 3 4@2 1 0@5 4>*12",
"<3@5 0 0b@5 3 2@2 1 2@2 3 4@2 4b 4@2 6>*12",
"<3@5 0 0b@5 3 2@2 1 0@2 0b 0@5 0>*12",
"<[3!2]@4 ~ 3 [3!2]@4 ~ 3 [4b@!2]@4 ~ 4b [4b!2]@4 ~ 4b [4!2]@4 ~ 4 [4!2]@4 ~ 4 [4!2]@4 ~ 4 [4!2]@4 ~ ~>*12",
]).scale("a5:minor").note().clip(0.95).color('yellow')
.layer(x=>x.s("gm_ocarina").gain(0.6).room(0.6)
,x=>x.transpose(-24).attack(0.01).release(0.1).s("gm_choir_aahs:3").gain(0.8).room(0.5)),
"<0@2 ~@8>/2".pickRestart([note("<b@2 f@2 ~ b b@2 f@2 ~ b b@2 b b@b b@2 f@2 ~ <b ~>>*12")])
.clip(0.90).s("gm_applause:3").color('red').room(2).gain(0.35)
)//.pianoroll()
+21
View File
@@ -0,0 +1,21 @@
// "Enjoy The Silence (coda)"
// song @by Depeche Mode
// script @by eefano
setCps(113/60/4)
await samples({'gtr': 'gtr/0001_cleanC.wav'}, 'github:tidalcycles/Dirt-Samples/master/');
const melodia = x => x.note().s("ocarina").gain(0.6).clip(1).release(0.1)
const guitar = x => x.note().s("gtr").room(1).gain(0.25).clip(1).release(0.5)
const accordi = x => x.note().s("recorder_bass_sus").gain(1.5).clip(1).release(0.5)
const basso = x => x.note().s("triangle").gain(0.8).clip(1).sustain(0.8)
const ritmo = x => x.bank("AlesisHR16").clip(1).gain(0.08)
const scala = cat('c minor') // IV VI I III
stack(
"<[3,5,0] [5,0,2] [0,2,4] [2,4,-1]>".scale(scala).apply(accordi),
"<[2@3 3] [0@3 2] [4@3 6] [2@3 3] [0@3 1] [-1@3 -2] -3 [0 1]>".scale(scala).transpose(12).apply(melodia),
"~@2 2 <7 9 6 6>@2 2 <8 6 4 4>@2".scale(scala).transpose(-12).apply(guitar),
"<-4 -2 0 -1>".struct("[[x ~]!2 x x@0.5 [x ~]!2 x@0.5 [x ~]!2]").scale(scala).apply(basso),
s("bd!4,[~ sd]!2,[~ hh!2 hh*2]!2").apply(ritmo),
//s("hh!4").apply(ritmo)
)
+61
View File
@@ -0,0 +1,61 @@
// "Epic Biopic" version 1.0
// song @by eefano
const split = register('split', (deflt, callback, pat) => callback(deflt.map((d,i)=> pat.withValue((v)=>{
const isobj = v.value !== undefined; const value = isobj ? v.value : v;
const result = Array.isArray(value)?(i<value.length?value[i]:d):(i==0?value:d);
return (i==0 && isobj) ? {...v,value:result} : result; }))));
const toscale = register('toscale', (pat) => pat.withValue((v)=>
v.endsWith('m') ? [v.substring(0,v.length-1),'minor']:[v,'major']));
setCps(1)
orch: "<~ a@2 b a@2 b c@6 d@2 a@2 b e@2 f@9 i@6 g@4 h ~>/5".pickRestart({
a:"<B@3 Am F>",
b:"<F# C#@2 E@2>",
c:"<Fm@4:1 F#@2:1 A#@4:1>",
d:"<Fm@2:2 F@3:2 D#m:2 D@3:2 A:2>",
e:"<A@6 ~ Cm@3:4>",
f:"<G@2:4 B:4 F#m@2:4 A@2:4 Em@2:4 G:4 Dm:4 F@2:4 <Cm!2 [C F#]>@2:4>",
g:"<C#@2:2 Dm@2:2 D#@2:2 F@3:2 C#:2 G#@4:2 A#m@2:2 F@4:2>",
h:"<F@3 ~@2>",
i:"<[[Fm@4:1 F#@2:1 A#@4:1]!2]@20 [Fm@2:2 F@3:2 D#m:2 D@3:2 A:2]@10>"
}).split([0,0],t=>stack(
chord(t[0]).anchor('c5').voicing().s(t[1].pickOut([
"supersaw".lpf(5000).velocity(.9),
"triangle".velocity(.65),
"supersaw".lpf(4800).velocity(.51).attack(.05).release(.05),
"triangle".lpf("4000").velocity(.55)
])).room(.4).gain(.75).color('yellow'),
n(t[1].pickRestart([
"<-1 [0 1]*3 0>".velocity(1.1),
"<1 0*3>".velocity(.7).lpf(2800),
"<[1 1*3] 2*3>","<[1 0] ~>".lpf(2500).velocity(.78)
])).chord(t[0]).mode('root').anchor('g2').voicing().clip(.97).s("square").color('cyan').gain(.85),
"<~@4 a@2 b ~@2 c@4 d@2 e ~@2 ~@2 f@6 i@3 c@4 d@2 g@4 h ~>/5".pickRestart({
a: "<~ [[5b 4 2]*2] [7 8b 7] [4 6b 4] [4 6] [[2 3] 4@7]@2 [~@3 6b*2] [6b@3 7*2] 9 >",
b: "<9*3 11 9*3 11@2>",
c: `<[2 1 0] [4@2 4*2] [4 ~ 0] [2@3 1 0@2] 2 [5@2 4] [2@3 1 2@2] [0 1] [2@3 1 2@2] [0@2 1]
[9@3 7*2] [7@2 7] [9@3 7*2] [4 ~ 0] [2@3 1 0@2] [7@3 6 7@2] [6 7] [7@3 6 7@2] [6 7] [7@3 6 7@2]>`,
d: "<[11 10] <[9 8] [9 10]> [9 8 7] [6 5 4]>",
e: "<2@2 ~@3>",
f: "<[[2 3] 4@2]!2 <[2] [4 3]> >".add("<0 [0,-2]>/15"),
g: "<[9@8 9]@2 7@2 [9@8 8 9]@2 9@3 [9@2 [10 11]] 9@3 [[9 7 9]!2] [9@5 9]@2 9@4>".add("<0@14 [0,-2]@6>"),
h: "<[11 ~]>/5".add("0,-2"),
i: "<[2 1 0] <[4@2 4*2]!2 4> <[4 ~ 0] 2*3 2> [2@3 1 0@2] 2 [4 3 2]>".add("<[0,-2]>/15"),
}).scale(t[0].toscale()).s("gm_tuba").clip(.9).note().color('magenta').gain(1).room(.2)
))
drums: "<x a@2 b a@2 b [c,k]@6 d@2 a@2 b e@2 f@9 [i,k]@6 g@4 h ~>/5".pickRestart({
a: s("<[[cr,lt]!2]@10>").lpf(2600),
b: s("<~ [[cr,lt]!2]@4>").lpf(2600),
c: s("<[lt ~ lt]>").lpf(200),
d: s("<[[cr,lt]!5]@10>").lpf(2600),
e: s("<[cr,lt]@5 [cr,lt] [lt mt*2 lt*2] lt@3>").lpf(2800),
f: s("<[lt mt lt]!30 [lt mt*2 lt*2]!13 lt*3 [lt mt*2 lt*2]>")
.lpf("<200@15 400@15 1000@13 1500@2>").velocity("<.9@28 1.2@2>"),
g: s("<[mt mt*2 mt*2]>,<[[cr,lt]!3]@6 [[cr,lt]!4]@8 [[cr,lt]!3]@6>").lpf(2600).velocity(.78),
h: s("<[[cr,lt]!2]@4 ~>").lpf(2800).velocity(.9),
i: s("<[lt mt*2 lt*2],<~@20 [cr!3]@6 [cr!2]@4>>").lpf("<1500 1800 2400>/10").velocity(.78),
k: s("<cr,lt>/30").lpf(2800).velocity(.45),
x: s("<[mt mt lt] lt>").lpf("<800@2 1200@2 2400>")
}).bank("BossDR550").room(1.4).speed(.7).gain(.45)
+35
View File
@@ -0,0 +1,35 @@
// "The Everso Closely Guarded Line (Coda)" - Work In Progress
// song @by Cardiacs
// script @by eefano
setCps(93.2/60*3/4/9)
setDefaultVoicings('legacy')
const epic = "<D Dm Am D Gm C F Am A#>*9";
const mels ={0:"d4@2 a d4 g c4 f a d4"
,1:"a@7 c4@3 d4@6 e4@2 c4@7 d4@2"
,2:"a@7 e4 c4 [d4@3 e4]@2 f#4 ~ g4@2 [c4@3 d4]@2 e4 [c4@5 ~]@4 c5@2 ~ d5@2"
,3:"a@2 f#4 f4@2 a ~ e4@2 d4@2 a ~ g4@2 c4@2 e4 ~ f4@2 c5@2 e4 ~ d4@2"
,4:"a d4 f#4 [a4 e5 c5]@6 d5 a4 f#4 [a4 g4]@4 c5@3 a4 f4 [e4 c4]@4 d4@2"
,5:"a d4 f#4 [a4 c5 a4]@6 d5 a4 f#4 [a4 g4]@4 c5@3 a4 f4 [e4 c4]@4 d4@2"
,6:"f#4 f4 e4 f#4 g4 e4 f4 [a@2 c4] [[a#@3 c4]@2 d4]"
,7:"[f#4 f4]@6 <e4 [e4 e4@2]>@3 [d4@3 e4]@2 f#4 [g4 a#4 c5 a4]@8 f4 e4 <[c5@2 ~ a#4@2] [c4@3 a#@2]>@5"
,8:"[~@25 d4@29]/2"
,9:"<0,1,2,3,4,5,6,7>*9"}
stack
("<0 1 2 3 4 0 1 2 3 [4@26 ~] 0 1 2 3 [[4@25 ~@29],8]@2 >".pickRestart(mels).sub(12).note().s("gm_overdriven_guitar").gain(.8)
,"<~ ~ ~ ~ 5 5 6 7@2 [2@4 ~] 5 5 6 7 [[5@25 ~@29],8]@2>".pickRestart(mels).note().s("gm_tenor_sax").gain(.8).color("yellow")
,"<1@14 [[4@25 ~@29],8]@2>".pickRestart(mels).add(24).note().s("gm_ocarina").gain(.3).color("red")
,"<9@14 ~@2>".pickRestart(mels).n().chord(epic).anchor("C4").voicing().s("<gm_reed_organ@10 gm_church_organ:1@4 ~@2>").gain("<.25@10 .45@4 ~@2>").color("green").midichan(3)
,"<0@14 [[4@25 ~@29],8]@2>".pickRestart(mels).sub(24).note().s("gm_electric_bass_finger").lpf(400).gain(.77).color("blue")
,"<0 [0@2 1@2 0 2@4] 0!4 [0@2 1@2 0 2@4] 0!2 [0@26 ~] 0!2 [0@2 1@2 0 2@4] 0 3@2>".pickRestart(
["<rd*3 , <<<bd!4 sd> sd> ~ bd>*3 , cr/9>*9"
,"[[sd [bd,cr] ~]!2@3]*9/2"
,"<[sd,[~ sd@10]] [[[bd,cr] ~]!2]@4 bd [sd,[~ sd@10]] mt lt >*9*3"
,"< [<[sd,[~ sd@10]]!2 ~> <[bd,cr]!2 [sd,[~ sd@10]]> [bd,cr]!2 ~ [bd,cr] ~ [bd,cr,cr] ~]*3 ~*4 >"
]).pickOut({rd:s('rd').velocity(.12).hpf(9000).pan(.45),
bd:s('bd').velocity(.5).lpf(2500),
sd:s('sd').velocity(.5).hpf(200),
cr:s('cr').velocity(.1).pan(.55),
mt:s('mt').velocity(.3).pan(.6),
lt:s('lt').velocity(.3).pan(.7)
}).bank("Linn9000").speed(.95).gain(.7).color("cyan").midichan(10) ).room(.8)
+13
View File
@@ -0,0 +1,13 @@
// HAPPY BIRTHDAY
setDefaultVoicings('legacy')
const chrds = "F@3 C@6 F@6 Bb@3 F@2 C F@3".slow(8);
stack(
"[C4@3 C4] D4 C4 F4 E4@2 [C4@3 C4] D4 C4 G4 F4@2 [C4@3 C4] C5 A4 F4 E4 D4 [Bb4@3 Bb4] A4 F4 G4 F4@2".slow(8).early(1/3).note().s("gm_harmonica").gain(0.4).color('green'),
chord(chrds).anchor("G4").struct("x*3").voicing().piano().gain(0.2).color('yellow'),
n("2 ~ ~ 2 1 ~").chord(chrds).anchor(chrds.rootNotes(2)).voicing().s("gm_electric_bass_finger").lpf(190).gain(1).color('blue'),
s("hh*3, <bd ~>, ~ ~ rim").bank("KorgDDM110").gain(0.2)
).cpm(120/4).room(0.3)//.pianoroll();
+18
View File
@@ -0,0 +1,18 @@
// "HAPPY BIRTHDAY BURNSIE"
// song @by Ramones
// script @by eefano
setDefaultVoicings('legacy')
const chrds = "F@3 C@6 F@6 Bb@3 F@2 C F@3".slow(8);
stack(
"C4*2 [D4 C4]@3 F4 E4 ~@2 C4*2 [D4 C4]@3 G4 F4 ~@2 C4*2 [C5 A4]@3 ~ [E4 D4]@3 Bb4*2 [A4 F4]@3 G4 F4 ~@2".slow(8).early(1/4).note().s("gm_distortion_guitar").gain(1).color('green'),
n("0,2").chord(chrds).anchor("E3").mode('root').struct("[[x ~]*2 x*2]*2").voicing().s("gm_distortion_guitar").clip(0.95).gain(0.7).color('yellow'),
n("0").chord(chrds).anchor("E2").mode('root').voicing().s("gm_electric_bass_finger").lpf(190).gain(1).color('blue'),
s("<[~@5 crow crow ~]!2 ~ [~@3 crow crow ~@3 ]>").slow(2).gain(1.2),
s("oh*4, <bd!3 [bd*2 ~]>*2 , [~ sd]*2").bank("Linn9000").gain(0.15)
).cpm(200/4).room(0.3)//.scope()//.pianoroll()
+21
View File
@@ -0,0 +1,21 @@
// "Hey Moon" (work in progress)
// song @by John Maus
// script @by eefano
setcps(88/60)
const split = register('split', (deflt, callback, pat) =>
callback(deflt.map((d,i)=>pat.withValue((v)=>Array.isArray(v)?(i<v.length?v[i]:d):(i==0?v:d)))));
c: n("<~ 1 2 3>*2").chord("<F C G F>/2").anchor("<F4 C4 G4 F4>/2").voicing().s("gm_pad_warm").release(2).room(0.6).gain(0.6)
m: "<0@16>/2".pickRestart([
"<~!14 3 1 3@2 ~@4 0 5 4 4 4 [5 3@3]@2 ~!5 [1 0] -1b 0@2 0 [0 0] ~!14 >*2",
"<~!15 3 3@3 0 0@2 5@2 4@2 3 2 2 3 3 0 0 >*2"])
.layer(x=>x.scale("g4:major").note().s("gm_piccolo").pan(0.4).room(1).gain(0.5),
x=>x.scale("g2:major").note().s("supersaw").pan(0.6).room(1).gain(0.6))
$: s("<hh*2>").gain(0.3).room(1)
$: s("<bd>/2").gain(0.1).room(1)
$: s("<[~ <~!3 sd>] sd>").gain(0.3).room(1)
+45
View File
@@ -0,0 +1,45 @@
// "Human Performance" (work in progress)
// @song by Parquet Courts
// @script by eefano
setcps(110 / 60 / 2)
const song = "<0@2 1@11 1@11 1@6 2@3 3@24 4@4 1@11 1@11 1@6 2@3 3@24 4@4>"
const zero = register('zero', (pat) => pat.withValue((v)=>0))
const chseq = song.pickRestart(["~","<B@2 F#m@2 E@2 D@2 D A@2>","<B@3>".struct("x*4"),
"<A@3 <F#m!2 E D B F#m E D>@9>*4".struct("x*4"),"<F#m@4>"])
const cs = zero(chseq).pickRestart(["<[0,[~ 1@40],[~@2 2@40],[~@3 3@40]]@2>"])
const ds= "<0@3 0@2 0 0@2 0!2 0@2>*4".pickRestart(["[0,1,2,3]"])
const cln = x=>x.s("gm_electric_guitar_clean:2").lpf(1800).gain(.7)
const dst = x=>x.s("gm_electric_guitar_clean:2").hpf(100).lpf(1800).clip(1).gain(.7)
$: n(song.pick([cs,cs,ds,ds,cs])).chord(chseq).mode('above').anchor('e3')
.voicing().mode("root").pickF(song,[cln,cln,cln,dst,cln]) ._pianoroll()
$: n(song.pickRestart(["~", "<~ 8 8 7 9 8 ~ ~ ~ 7 7 5 8 7 ~ ~ ~ 8 8 7 9 8 7 6 7 5 ~ 4 7 5 ~ ~ ~ 7 7 6 7 2@2 ~@5>*4",
"<7@2 ~ [7 5] [9 7]@2 ~@100>*4",
"<<[12!2 11 12]!2 [9!3 8] [9 8 7 9] [9!3 8] [9 8 7 9] [9!3 8] [9 8 7 9]> ~@2>","~"]))
.scale("a2:major").s("gm_tenor_sax:1").gain(1).color('yellow')
$: n(song.pickRestart(["<~ [~ 0 2 2b]>",
"<1 [4b 4] 5 [2 5] 4 [1 4] [3@3 3] [0@3 0] [-4@3 -4] [0 0] [0 0 2 2b]>",
"<1>*4","<<0!2 2 0!2 2 0!2>@3 <-2!2 4 3 1 -2 4 3>@9>*4".struct("x*4"),"<5!4 2!4 -2!3 2 5 -2 2 2b>*4"]))
.scale("a2:major").s("gm_electric_bass_finger:3").clip(.97).lpf(350).gain(1).color('cyan')
$: song.pickRestart(["<~>","<rd*4,[bd sd]>","<rd*4,[sd bd]*2>",
"<cr@3 cr@9>*4,<sd ~ bd sd ~ sd!7>*4","~"]).pickOut({
rd:s("<r8_rd:1>").speed(1.1).hpf(4000).velocity(.1),
bd:s('linn9000_bd').velocity(.55).lpf(500),
sd:s('linn9000_sd').velocity(.55).hpf(200),
cr:s('linn9000_cr').velocity(.1).pan(.55),
mt:s('linn9000_mt').velocity(.3).pan(.6),
lt:s('linn9000_lt').velocity(.2).pan(.7)}).speed(.94).gain(.6) .color('magenta')
all(x => x
.room(.3)
//.ribbon(24*2,1*8)
)
+26
View File
@@ -0,0 +1,26 @@
await initHydra()
let bass = note("<C3 Eb3 G2 Bb2>").euclid(3,8).s("sawtooth").lpf(sine.range(400, 1000))
let kick = s("<[bd ~ ~ bd]!3 [bd(5,8,1)]> ")
let hihat = s("hh!6 [hh*2 hh]!2").slow(2)
let final = stack(note("c3@4, c2@4").s("sawtooth").lpf(1000),
s("cr")).delay(.5).delaytime(".75")
let silence = s("bd").hush()
let sequence = "0@4 1@4 2@8 3 4@7".slow(24)
solid(0,0,0)
.add(osc(10, 0.1, 10) ,H(sequence.pick([1,0,0,1])))
.add(noise() ,H(sequence.pick([0,1,0,1])))
.add(shape() ,H(sequence.pick([0,0,1,0])))
.out()
sequence.pick([ bass, // = 0
stack(bass, kick), // = 1
stack(bass,kick,hihat), // = 2
final, // = 3
silence]) // = 4
+29
View File
@@ -0,0 +1,29 @@
// "Il Re Del Mondo (intro)"
// song @by Franco Battiato
// script @by eefano
setCps(91/60/4)
const accordi = x => x.note().s("recorder_tenor_sus").clip(1).release(0.5)
const melodia = x => x.note().s("sax").gain(0.3).clip(1).release(0.5)
const walking = x => x.note().s("triangle").clip(1).release(0.1)
const ritmo = x => x.bank("YamahaRY30").clip(1).gain(0.08)
const scaleggio = x => x.piano().gain(0.2)
const myscale = "[e:major e:minor]!3 [e:major]@0.5".slow(14)
const scala2 = "<e:major e:minor>".slow(2.5)
const verse = stack(
"[4 5 6 7]*2".scale(scala2).note().apply(scaleggio),
"[0@4 [7 ~]!2 0@3 7@2 ~ 7 ~ 0@3 7@3]/2.5".scale(scala2).transpose(-12).apply(walking),
s("hh!4").apply(ritmo),
"<-3,-2,-1,0,1,2,3 ~@1000>".scale(myscale).velocity(0).apply(melodia).color('black')
)
const chorus = stack(
"[0,2,4]/2".scale(myscale).apply(accordi),
"[-3@3 -2 -1@3 0 -1@8 0@3 1 2@3 3 2@8 2@8 2@8 1@8]/14".scale(myscale).transpose(12).apply(melodia),
"~ -3 [0 ~] [0 ~] [1 ~] [1 ~] [2 3] [4 ~] ".scale(myscale).apply(walking),
s("[[bd [sd [~ bd]] [bd bd] sd,hh!7 oh]!13 [bd sd sd*4 lt*4,hh!3 oh ~!4]]/14").apply(ritmo),
)
arrange([10,verse],[14,chorus])
+27
View File
@@ -0,0 +1,27 @@
// "Jitterbug (Coda)"
// song @by Cardiacs
// script @by eefano
setDefaultVoicings('legacy')
const m1 = `f#4@3 d4@4 g4@6 g#4@4 f4@3 d#4@3 e4@4 c#4@6 b3@4 g#3@3 g#4@5 a4@4 f#4@3 d#4@3 f#4@4 g4@6 a4@4 a#4@6 d#4@3.9 ~@0.1 d#4@3`.slow(82/8);
const m2 = `f4@3 d4@4 d#4@5 e4@3 g4@4 e4@6 f#4@4 c4@2.9 ~@0.1 c4@3 g#3@4 a#3@4 b3@6 c#4@4 g4@6 a4@4 a#4@6 d#4@3.9 ~@0.1`.slow(73/8);
const m3 = `d#4@3 f#4@3.5 ~@0.5`.slow(7/8);
const m4 = `c#4@4 f#4@4 `.slow(8/8);
const m5 = `e4@4 g4@7.9 ~@0.1 f4@4 f#4@4.9 ~@0.1 d#4@3 e4@4 c#4@6.9 ~@0.1 f#4@2 f4@3.9 ~@0.1`.slow(41/8);
const melody = arrange([82/8,m1],[73/8,m2],[7/8,m3],[82/8,m1],[8/8,m4],[73/8,m2],[41/8,m5]);
const h1 = `D@2 G@2 C D#@2 G#@2 C# B@2 E@2 A F#m@2 B@2 G#@2 C#@2 A@2 D Cm@2 F#@2 D# Em@2 A@2 F# D#m@2 G#@2`.slow(40/4);
const h2 = `Cm F@2`.slow(3/4);
const h3 = `Bm@2 B@2 C@2 G@2 C A@2 D@2 Am C@2 G#@2 F#@2 E B@2 C#m@2 D# Em@2 A@2 F# D#m@2 G#@2`.slow(35/4);
const h4 = `Cm F#@2`.slow(3/4);
const h5 = `Cm F#@4 F@2`.slow(7/4);
const h6 = `C#m@2 D#@4 C#@2 F#@2 B@2 E@2 C#m@2 F#@2 A#@2`.slow(20/4);
const chords = arrange([40/4,h1],[3/4,h2],[35/4,h3],[3/4,h4],[40/4,h1],[7/4,h5],[35/4,h3],[20/4,h6]);
stack(
n(stack("0","1".late(.1),"2".late(.2)).fast(4)).chord(chords).anchor("G5").voicing().s("gm_pad_choir").echo(2,1/6,.7).gain(0.8),
chords.rootNotes(2).note().s("gm_lead_2_sawtooth").attack(0.2).sustain(1.2).lpf(1000).gain(0.4),
melody.note().s("gm_lead_1_square").attack(0.02).sustain(1.5).lpf(1200).gain(0.75),
s("<rd*4>").bank('LinnDrum').gain(0.07)
).cpm(115/4)
.room( slider(0.91,0,10))
.rsize( slider(4,0,8,1))
+31
View File
@@ -0,0 +1,31 @@
// "Jitterbug (Coda)" - In Reverse
// song @by Cardiacs
// script @by eefano
setDefaultVoicings('legacy')
const melody =
`f#4@3 d4@4 g4@6 g#4@4 f4@3 d#4@3 e4@4 c#4@6 b3@4 g#3@3 g#4@5 a4@4 f#4@3 d#4@3 f#4@4 g4@6 a4@4 a#4@6 d#4@3.9 ~@0.1 d#4@3
f4@3 d4@4 d#4@5 e4@3 g4@4 e4@6 f#4@4 c4@2.9 ~@0.1 c4@3 g#3@4 a#3@4 b3@6 c#4@4 g4@6 a4@4 a#4@6 d#4@3.9 ~@0.1
d#4@3 f#4@3.5 ~@0.5
f#4@3 d4@4 g4@6 g#4@4 f4@3 d#4@3 e4@4 c#4@6 b3@4 g#3@3 g#4@5 a4@4 f#4@3 d#4@3 f#4@4 g4@6 a4@4 a#4@6 d#4@3.9 ~@0.1 d#4@3
c#4@4 f#4@4
f4@3 d4@4 d#4@5 e4@3 g4@4 e4@6 f#4@4 c4@2.9 ~@0.1 c4@3 g#3@4 a#3@4 b3@6 c#4@4 g4@6 a4@4 a#4@6 d#4@3.9 ~@0.1
e4@4 g4@7.9 ~@0.1 f4@4 f#4@4.9 ~@0.1 d#4@3 e4@4 c#4@6.9 ~@0.1 f#4@2 f4@3.9 ~@0.1`
.rev();
const chords =
`D@2 G@2 C D#@2 G#@2 C# B@2 E@2 A F#m@2 B@2 G#@2 C#@2 A@2 D Cm@2 F#@2 D# Em@2 A@2 F# D#m@2 G#@2
Cm F@2
Bm@2 B@2 C@2 G@2 C A@2 D@2 Am C@2 G#@2 F#@2 E B@2 C#m@2 D# Em@2 A@2 F# D#m@2 G#@2
Cm F#@2
D@2 G@2 C D#@2 G#@2 C# B@2 E@2 A F#m@2 B@2 G#@2 C#@2 A@2 D Cm@2 F#@2 D# Em@2 A@2 F# D#m@2 G#@2
Cm F#@4 F@2
Bm@2 B@2 C@2 G@2 C A@2 D@2 Am C@2 G#@2 F#@2 E B@2 C#m@2 D# Em@2 A@2 F# D#m@2 G#@2
C#m@2 D#@4 C#@2 F#@2 B@2 E@2 C#m@2 F#@2 A#@2`
.rev();
stack(
chord(chords).anchor("C5").voicing().s("gm_rock_organ").pan(0.4).gain(0.9),
chord(chords).anchor("G5").voicing().s("gm_pad_choir").pan(0.6).gain(0.9),
chords.rootNotes(2).note().s("gm_lead_2_sawtooth").attack(0.2).sustain(1.2).lpf(1000).gain(0.5),
melody.note().s("gm_lead_1_square").attack(0.02).sustain(1.5).lpf(1200).gain(0.75),
).cpm(115/183).room( slider(0.91,0,10)) .rsize( slider(4,0,8,1))
+42
View File
@@ -0,0 +1,42 @@
// "Love Goes On" (work in progress)
// song @by The Go-Betweens
// script @by eefano
const standardtuning = [40,45,50,55,59,64];
const fingering =
{Am:"0:0:2:2:1:0",C:"x:3:2:0:1:0",
D:"x:0:0:2:3:2", Dm:"x:0:0:2:3:1",
G:"3:2:0:0:0:3", G7:"3:2:0:0:0:1",
F:"1:3:3:2:1:1", A7:"x:0:2:2:2:3",
E:"0:2:2:1:0:0", Em:"0:2:2:0:0:0", E7:"0:2:2:1:3:0",
B7:"0:2:4:2:4:2",Bm:"0:2:4:4:3:2"
};
const sk = 300, sh = silence, strumming =
{d: stack(0,timeCat([1,sh],[sk,1]),timeCat([2,sh],[sk,2]),timeCat([3,sh],[sk,3]),timeCat([4,sh],[sk,4]),timeCat([5,sh],[sk,5]))
,u: stack(5,timeCat([1,sh],[sk,4]),timeCat([2,sh],[sk,3]),timeCat([3,sh],[sk,2]),timeCat([4,sh],[sk,1]),timeCat([5,sh],[sk,0]))
};
const gString = register('gString', (n, pat) =>
(pat.fmap((v) => { if(v[n]=='x') return note(0).velocity(0);
return note(v[n]+standardtuning[n]); }
).innerJoin()));
const guitar = (strums,fingers,tuning=standardtuning) =>
(strums.pickRestart(strumming).pickOut(
[fingers.pickOut(fingering).gString(0),fingers.pickOut(fingering).gString(1),fingers.pickOut(fingering).gString(2)
,fingers.pickOut(fingering).gString(3),fingers.pickOut(fingering).gString(4),fingers.pickOut(fingering).gString(5)]));
setcps(150/60)
strum:
guitar("<d@2 d u@2 u d u >*2",
"<0@2>/16".pickRestart(
["<Am Em Bm C G Em D C>/4"]))
.s("gm_acoustic_guitar_steel:2").clip(1).release(0.4).gain(0.4).room(0.6)
voice:
"<0 1>/16".pickRestart([
"<2 2@2 2@2 2 2 2@2 1@2 ~@5 3 3@2 3@2 1 1@2 2@2 ~@6>*2",
"<3 1@2 -1@2 -1 -1 0@2 1@2 ~@5 0 0@2 0@2 1 1@2 -1@4 ~@4>*2"
]).scale("a3:minor").note().clip(0.95).color('yellow')
.s("gm_bassoon:2").gain(1).room(0.4)
+62
View File
@@ -0,0 +1,62 @@
// "Made All Up (wip)"
// song @by Cardiacs
// script @by eefano
const split = register('split', (deflt, callback, pat) => callback(deflt.map((d,i)=> pat.withValue((v)=>{
const isobj = v.value !== undefined; const value = isobj ? v.value : v;
const result = Array.isArray(value)?(i<value.length?value[i]:d):(i==0?value:d);
return (i==0 && isobj) ? {...v,value:result} : result; }))));
setCps(138/60)
const sequence = "<a@38 b@38 c@48 d@16 e@30 a@38 b@38 c@48 d@16 e@18 e@30>";
orch: sequence.pickRestart({
a: `<C!2 [C B] B [B D] D!2 F!2 [F C] C [C D#] D# A#!2 [A# F] F!2 D#!2 [D# A#] A# F!2
G#!2 [G# D#] [D#@3 F]@2 F C G!2 [G D] [D@3 E]@2 E B>`,
b: `<C#!2 [C# Fm] Fm [Fm A#] A# D# F#!2 [F# C#] C# [C# E] E B!2 [B F#] F#!2 E!2 [E B] B F#!2
A!2 [A E] [E@3 F#]@2 F# C# G#!2 [G# D#] [D#@3 F]@2 F C>`,
c: `<E@6 B!2>`,
d: `<D#@6 G#m!2 E@6 B!2 >`,
e: `<[F# D A]@6 [[[C#:1 ~]!2 [C#:1:-2 ~]!2 [C#:1:-4 ~]!2]!4]@24>`
}).split([0,0,0],t=>stack(
chord(t[0])
.anchor(sequence.pickRestart(
{a:"<b4@7 b4@6 b4@5 c5@6 d5@7 c#5@7>",
b:"<c5@7 c5@6 c5@5 c#5@6 d#5@7 d5@7>",
c:"<c4>",d:"<c4>",e:"<g5>"
})).voicing().s("gm_piano").room(.4).gain(.9).color('yellow')
.superimpose(x=>x.late(0.1).attack(.1).velocity(.7).pan(.2)),
n(t[1].pickRestart(["<0>/8","<[0 ~]>"])).chord(t[0]).mode('root').anchor('e2').voicing()
.transpose(t[2]).s("gm_electric_bass_finger").lpf(200).gain(1.4).color('cyan')
).rsize(4)
)
const choirline = note(`<c4@2 c4!3 b3 b3@2 b3 a3 [a3!2]@4
[c4!2]@4 c4!2 c4@2 c4 d#4 d#4@2
[f4!2]@4 f4 c4 [c4!2]@4
d#4@2 f4@2 f4 c4 c4@2 a#3@2 d#4@10 ~@20>*2`);
const mode1 = x => x.adsr([0,.1,.8,0]).clip("0.92")
.superimpose(x=>x.transpose(12).velocity(.8).speed(1.002).pan(.4),
x=>x.transpose(24).velocity(.4).speed(.998).pan(.6));
const mode2 = x => x.attack(.04).release(.02).clip("0.85");
choir: sequence.pickRestart({
a: mode1(choirline),
b: mode1(choirline.transpose(1)),
c: mode2(note(`<~ b4@2 g#4@2 a#4@2 f#4 ~ g#4@2 a#4@2 b4@2 d#5
~ f#5@2 a#4@2 e5@2 d#5 ~ c#5@2 b4@2 a#4@2 ~>`)),
d: mode2(note(`<~ a#4@2 g4@2 c5@2 b4 ~ a#4@2 f#4@2 g#4@2 ~>`)),
e: mode2(note(`<~ c#5@2 d5@2 c#5@8 ~@18 >`))
}).s("triangle").gain(0.9).lpf(5000).color('magenta').room(.5).rsize(4)//.pdec("<0@23 1@15>")
const tricky = "<0@7 0@6 0@4 0 0@6 0@7 0@7>"
.pickRestart(["<cr,<bd [sd@3 sd] [bd bd] sd [bd bd] [sd bd] sd>>"]);
drums: sequence.pickRestart({
a: tricky,
b: tricky,
c:"<cr/16,rd,<[<bd ~> <~ bd>] sd>>",
d:"<cr/16,rd,<[<bd ~> <~ bd>] sd>>",
e:"<[rd!3]@6 sd!22 sd*4@2>"
}).pickOut({
bd: s('bd').lpf(800).velocity(1.1),
sd: s('sd').velocity(.7),
rd: s('rd').velocity(0.3).hpf(8000),
cr: s('cr').speed(0.7).velocity(0.1).hpf(6000),
}).bank("Linn9000").room(0.4).gain(0.5).rsize(4)
+70
View File
@@ -0,0 +1,70 @@
// "Mammals Chilling" version 1.0
// song @by eefano
const split = register('split', (deflt, callback, pat) => callback(deflt.map((d,i)=> pat.withValue((v)=>{
const isobj = v.value !== undefined; const value = isobj ? v.value : v;
const result = Array.isArray(value)?(i<value.length?value[i]:d):(i==0?value:d);
return (i==0 && isobj) ? {...v,value:result} : result; }))));
setCps(155/60)
orch: "<a b@2 a [b@11 ~]@2 c e d c>/40".pickRestart({
a: "<<F:f3:h D7:g3:i> ~>/5",
b: "<F:f3:h@8 Em7:b3:i@12 C:f3:i@8 D7:g3:h@12>",
c: "<Bm7:b3:j@8 Em7:b3:k@8 F:g3:j@8 C:f3:k@8 G7:b3:j@4 G7:b3:l@4>".velocity(1.4),
d: "<Bm7:b3:j@8 Em7:b3:k@8 F:g3:k@8 C:f3:k@8 D7:f3:j@8 >".velocity(1.6),
e: "<<F:f3:h Em7:b3:i C:f3:h D7:g3:i> ~>/5".velocity(1.3),
}).split([0,0,0],s=>stack(
n(s[2].pickRestart({
h:"<~ [<0@2 2 1>@3 ~]>*2", i:"<~ [<3@2 0 1>@3]>*2",
j:"<0 2>/2", k:"<1 <0 2>>/2", l:"<2 ~>/8"
})).chord(s[0]).anchor(s[1].transpose(-22)).mode('above').voicing()
.s("gm_pizzicato_strings:4").gain(1.35).color('green'),
n(s[2].pickRestart(
{h:"<[[0,[~ 1@40],[~@2 2@40],[~@3 3@40]] ~@2]>/2",
i:"<[[3,[~ 2@40],[~@2 1@40],[~@3 0@40]] ~@2]>/2",
j:"<[[~ 0@3],[~@1 1@3],[~@2 <2 3>@2],[~@3 <3 2>]]>/2",
k:"<[[~ 3@3],[~@1 2@3],[~@2 <1 0>@2],[~@3 <0 1>]]>/2",
l:"<[[1,[~ 2@30],[~@2 3@30],[~ 0]]]>/4"}))
.chord(s[0]).anchor(s[1]).mode('above').voicing()
.s("gm_acoustic_guitar_nylon").gain(.65).color('yellow')
)).room(.2)
melo: "<~ a b ~@2 c d e ~ d>/40".pickRestart({
a: n(`<~ 4 0 ~ 1 0 ~ 1 2*3 ~@2 5 5 6 ~ 2 ~ 5 2 5 ~ 2 ~@5 6 ~ 2*3 ~@5 6 ~ 1*3 ~ [6*3]@2
5 4 5 ~ 2 ~ 6 ~ 4 ~@3 4 ~ 3#!2 [2 0# 2]@2 3# ~ 4 ~ 3#!2 0# ~ 3# ~ 5!2 6!2 2 ~@6>*2`).late(.1),
b: n(`<~@4 2 ~ 3# ~ 4 ~@7 3# ~@5 7 ~ 8 ~@15 9*2 8 ~@14 8*2 6 ~@10 [4*3]@4 ~@6>*2`),
c: n(`<7 [9 13 12@2]@3 ~@2 [9 12 13 9 8 6]@4 ~@8 [9 12 13 9 8 6]@4 ~@8 [6 8 9 13 12 9]@4 ~@6>`),
d: n(`< ~ [~ 2] [~ 5] [~ 3#] ~@5 [~ 8] [~ 7] [~ 6] ~@8 [9*2 8] ~@7 [8*2 6]
~@3 8*2 9*3 10#*4 9*5 6*3 6*4 5*5 ~>`),
e: n(`<~@10 12 12 13 ~ 9 ~ 12 9 12 ~ ~@32 [9 12 13 9 8 6]@8 ~@100>*2`).velocity(.5).pan(.3)
}).scale('f4:major').s("gm_marimba").room(.2).gain("<.65 .75 .85>").color('cyan')
trom: "<~@2 b ~ a c d e ~ d>/40".pickRestart({
a: `<~ [2 ~] [6:1 ~] [4 ~] ~ [2 ~] [5:1 ~] [6 ~] [1@4 0# 1]@3
[2 ~] [3# ~] ~ [3# 4] [4# ~] [5 ~] 7*2 6*2 5*2 [4 6:2@3]@2 4@3
~ 4*2 [3# 3] 2 ~ 2*2 [1# 1] 0# [3# 0# 2@2]@3 0# [3# 6 5@2]@3 >`.clip(.9),
b: `< ~ 2:3@5 6 ~ 4 ~ ~@4 2:3@2 1@6 9:1 ~ 8 ~ ~@6 9:1 8 ~@14 8:1 6 ~@10 [[0# ~]*3]@4 ~@20>*2`.clip(.9),
c: `<~@10 [[[-2 ~] [1 ~] 2 [-2 ~] [3# ~] ~]!2]@8 ~@4
[[[3# ~] [2 ~] 1 [-1 ~] [2 ~] ~]!2]@8 ~@6 >`.clip(.9),
d: `<[2:3@5 5]@3 [~ 3#] [~@5 2:3@2 1@6 7]@7 [~ 8] ~@4 [9:1 8] ~@7 [8:1 6]
~@7 1 2 3# 2:2 -1 ~ -2 ~>`.clip(.9),
e: `<~@30 0!2 -1!2 -2!2 -3 -1:2@3 -3@2 ~@10 [2 -2 -1 2 1 -1]@8 ~@100 >*2`.velocity(.5).pan(.7).clip(.4)
}).split([0,0],t=>n(t[0]).scale('f3:major').penv(t[1]))
.s("gm_trombone:4").room(.2).gain(.85).color('magenta')
drums: `<[a,c]@4 [a,c,e]@7 [a,c,e,f] [v,a,b]@4 [[a,b,d]@11 g]@8 [v,a]@4 [~ a]!3 [~ h] [a,k]@4 a@4>/10`
.pickRestart({
a:"<sh ~ sk sh ~ sk sh sk ~ sh sk ~ sh ~ sk sh ~ sk sh sk>*2",
b:"<~@8 [~ cw]!2>", c:"<~@8 [cw ~]!2>",
d:"<[<cm ~@3> [<cl ~>,<bd ~@7>]]>", e:"<<[<~ cl>@3 <cm,<~ bd> ~@3>]>@2>",
f:"<~@6 [[cj*3]!2]@4>",g:"<[~ cj!6 wh@5]@8>", h:"<cj*2 cl*2 ~ wx*2 vi>",
k:"<se@8 ~@2>",v:"<vi@40>"
}).pickOut({
sh: s("shaker_small:0").velocity(3), sk: s("shaker_small:1").velocity(2),
cl: s("clave").velocity(7), cm: s("clave").velocity(4).speed(.95),
bd: s("bongo:3").velocity(5), cj: s("agogo").velocity(7),
cw: s("cowbell").velocity(1.2).pan("<.2 .8>/10"),
wh: s("ballwhistle"), wx: s("ballwhistle:1"),
vi: s("vibraslap").velocity(.9),
se: s("brown").adsr([1,0,1,1]).speed("<1.4 1.5>/10").pan("<.4 .6>/10")
}).room(.2).gain(1)
+40
View File
@@ -0,0 +1,40 @@
let markovstates = {};
let markovtables = {
'drums':
//bd sd hh
[[ 0, .2, .8], // bd
[ .3, 0, .7], // sd
[ .9, .1, 0]] // hh
, 'chords':
[[ .2, .2, .4, .2],
[ .5, .3, .2, .1],
[ 0, .2, .7, .1],
[ .7, .1, .1, .1]]
}
const markov = register('markov', (id, pat) => pat.withHap((hap)=> {
if(markovstates[id]===undefined) markovstates[id]=[0];
const mystate = markovstates[id];
const mytable = markovtables[id];
//console.log(mytable)
const p = hap.whole.begin.n;
while(mystate.length<=p)
{
const prev = mystate[mystate.length-1];
const t = mytable[prev];
let next = prev;
for(let i=0,j=t[i];i<t.length;i++,j+=t[i]) if(hap.value<j) { next = i; break; }
mystate.push(next);
//console.log(mystate);
}
return hap.withValue((v)=>mystate[p]);
}))
$: s(rand.segment(1).markov('drums').pick(["bd","sd","hh"])).fast(8)
$: chord(rand.late(.2).segment(1).markov('chords').pick(["C","Dm","F","A"])).fast(2).voicing().piano()
+22
View File
@@ -0,0 +1,22 @@
// "Mouth Breather" (work in progress)
// composed @by The Jesus Lizard
// script @by eefano
setcps(215/60*2)
const xposes = "<0@9 -5 -7 0@4 ~ 0@2 -5 -7 ~@2>/48"
g:"<0@5 1 0 1 0@3 ~@2 0 ~ 0@4 ~@2 >/48".pickRestart(
[stack("<c3@9 c#3 c3@2>","<g3 f3@2 g3@4 f3 g3 g#3 g3 f3>".add("<0,5>")).struct("<x!4 ~!2 x!9 x@3 x!6>")
,"<[c3,g3,c4]@6 ~@42>".add(-3).penv(-3).patt(1)
]).note().transpose(xposes).s("gm_electric_guitar_clean:2").distort("10:.17").room(.1)
b:"<~@3 0@2 ~ 0 ~ 0@6 ~ 0@4 ~@2 >/48".pickRestart(["<c2!3 c2@2 ~ c2!3 <[c#2 f2 c#2] [c2 f2 g2]>@3>"])
.note().transpose(xposes).s("gm_electric_bass_pick").release(.06).distort("5:.3").room(.2).color('green')
d:"<~ 0@14 ~ 0@6>/48".pickRestart(
[stack(s("<bd ~ bd ~!2 bd!2 ~!2 bd ~!2 bd ~!2 bd ~ bd ~ bd ~!2 bd ~>"),
s("<~!3 sd ~!6 sd ~!5 sd ~!3 sd ~!3>").gain(1.4),
s("<oh>/2").speed(1.03).gain(.3).pan(.4),
s("<cr>/12").speed(1.1).gain(.2).pan(.6))])
.room(.8).color('cyan')
// all((x)=>x.scope({scale:.05})) //._pianoroll({minMidi:10,maxMidi:60,autorange:false})
+35
View File
@@ -0,0 +1,35 @@
// "Mouth Breather" (work in progress, complex variant)
// composed @by The Jesus Lizard
// script @by eefano
setcps(215/60*2)
const fvi = register('fvi', (i, d, pat) => pat.filterValues(v=>v[i]==d))
const ati = register('ati', (i, d, pat) => pat.withValue((v)=>{
const isobj = v.value !== undefined; const value = isobj ? v.value : v;
const result = Array.isArray(value)?(i<value.length?value[i]:d):(i==0?value:d);
return (i==0 && isobj) ? {...v,value:result} : result; }));
// Index0 = Instrument, Index1 = Part, Index2 = Transpose
`<G@3 [G,D]@6 [G,D,B]@6 [G:1,D]@3 [G,D,B]@3 [G:1,D]@3 [G,D,B]@3 [G:0:-5,D,B:0:-5]@3 [G:0:-7,D,B:0:-7]@3
[D,B]@6 [G,D,B]@3 ~ [G,D,B]@6 [G:0:-5,D,B:0:-5]@3 [G:0:-7,D,B:0:-7]@3 D@3 ~@3 >/16`
.layer(
x=>x.fvi(0,'G').ati(1,0).pickRestart(
[stack("<c3@9 c#3 c3@2>".pan(.51),"<g3 f3@2 g3@4 f3 g3 g#3 g3 f3>".add("<0,5>").pan(.49)).struct("<x!4 ~!2 x!9 x@3 x!6>")
,"<[c3,g3,c4]@3 ~@45>".add(-8).penv(-3).patt(.6).lpf(3000)
]).note()
.transpose(x.fvi(0,'G').ati(2,0))
.s("gm_electric_guitar_clean:2").hpf(80).distort("10:.17").room(.1)
,x=>x.fvi(0,'B').ati(1,0).pickRestart(
["<c2!3 c2@2 ~ c2!3 <[c#2 f2 c#2] [c2 f2 g2]>@3>"])
.note()
.transpose(x.fvi(0,'B').ati(2,0))
.s("gm_electric_bass_pick").release(.06).distort("5:.31").room(.2).color('green')
,x=>x.fvi(0,'D').ati(1,0).pickRestart(
["<[bd ~ bd sd ~ bd!2 ~!2 bd sd ~ bd ~!2 bd sd bd ~ bd sd ~ bd ~],oh*12,cr*2>/24"])
.pickOut({bd:s('bd').lpf(1800),
sd:s('sd').speed(.88),
oh:s('oh').speed(.9).velocity(.15).pan(.45),
cr:s('cr').speed(.95).velocity(.2).pan(.55)
}).bank("linn9000").gain(1.3).room(.85).color('cyan')
)
+36
View File
@@ -0,0 +1,36 @@
setcpm(120/4)
let key = "<c:major c:minor>/2";
let tra = "0, 3, 5".add("<0 [0 2]>/2");
$: n("<6 3> - [2 <1 0>] <0*2 ->")
.scale(key)
.scaleTranspose(tra)
.s("kawai")
.lpf("<2000 1000 500>/2")
.gain("<0 .3 .7@2>/8")
$: n("<[2 -]*4 [0 -]*6>")
.scale(key)
.s("supersaw")
.scaleTranspose(tra)
.transpose("<0 -5>/8")
.room(.5)
.gain(.5)
$: n("<0 0 0>").scale(key).transpose(-12)
.penv("<0 12 -12>")
.patt(.3)
.s("gm_fretless_bass")
.gain(1)
$: s("white*16").clip(.5)
.speed("<<1@2 1 2> <2 3>>*16")
.hpa(.05).hpd(.05).hpe(3).hpf("<1000@2 2000 500>*8")
.gain(0.4)
$: s("<<bd bd*2> ~@14 <~@15 bd>>*8")
.speed(1.2).lpf(1000).gain(0.6).room(1)
$:
s("- - [clap | -] clap*2:<0 4 5 1>").room(.6).gain(.5)
+22
View File
@@ -0,0 +1,22 @@
// "Odd Even" (Work In Progress)
// song @by Cardiacs
// script @by eefano
setDefaultVoicings('legacy')
const k = 0.01;
stack(
n(stack("0@2 0 3@2 3 0 3",
"1@2 1 2@2 2 1 2".late(k),
"2@2 2 1@2 1 2 1".late(k*2),
"3@2 3 0@2 0 3 0".late(k*3)))
.chord("<G [Bm E] [G@3 C]>".slow(2)).voicing()
.s("gm_electric_guitar_jazz").clip(1).release(0.2).gain(0.5),
`< ~!4
[4 3 [2 ~] [1 ~] 0@2 4@2]
[4 3 [2 ~] [1 ~] 0@2 7@2]
>`.scale("g2:lydian").note().s("gm_bassoon")
).cpm(120/4)//.pianoroll()
+21
View File
@@ -0,0 +1,21 @@
// "Oh"
// song @by Tim Smith Spratleys Japs
// script @by eefano
setDefaultVoicings('legacy')
const ln = 24;
const cresc = saw.range(0.4,0.7).slow(ln*2);
const chrds = "G#@4 F#@2 B@3 E A@2 D G@2 A G@4 A G@4 G# C# F# B E A@2 B A@2 C D#@6 F@2 D#@4".slow(ln);
const meldy = "[d#5@4 d#5@2 d#5@3 e5 c#5@2 d5 d5@2 c#5 b4@4 c#5 b4@4 c5 f5 a#4 d#5 g#4 e5 [b4@3 d#5] f#5 d#5@2 e5 g4 g5@3 f5 a5@4 a#5@3]".slow(ln);
stack(
meldy.note().s('gm_piccolo').velocity(.9).gain(add(cresc,0.1)).color("yellow"),
chord(chrds).anchor("C4".transpose(run(12).slow(ln))).voicing().s('gm_choir_aahs').velocity(.8).pan(0.6).gain(add(cresc,tri.range(0,0.1).slow(ln))),
chord(chrds).anchor("C5".transpose(run(12).slow(ln))).voicing().s('gm_string_ensemble_2').pan(0.4).gain(add(cresc,tri.range(0,0.1).slow(ln))),
n("[0 1 2 3 4 3 4 5 4 3 2 3 2 1]*1.7").chord(chrds).anchor("C6").voicing().s('gm_oboe').room(0.5).gain(0.2),
chrds.rootNotes("[1 2]!2").struct("x*8").clip(0.90).note().s('gm_electric_bass_finger').lpf(280).gain(0.5),
s("[bd!2 ~ bd]*2").bank("AkaiLinn").lpf(300).gain(0.15),
s("<~ sd>*4").bank("AkaiLinn").hpf(250).lpf(3500).gain(0.30),
s("hh*8").hpf(8000).gain(0.08)
).cpm(90/4).room(0.8) //.pianoroll()
+26
View File
@@ -0,0 +1,26 @@
// old mcdonalds has bad samples
setDefaultVoicings('legacy')
const beast = ["crow","space","gm_bird_tweet","space:4","clash","space:1"]
const bsequ = "<~@2 0 ~@3 1 0 ~@3 2 1 0 ~@3 3 2 1 0 ~@3 4 3 2 1 0 ~@2>".pick(beast)
const chrds = "F [A# F] [F C] [F@3 ~]";
const strct = "[[x ~]!2] [[x ~]!2 x ~]";
const bstrc = "[[~ x]!2] [[~ x]!2 ~ x]";
const trnsp = "<0!4 1!5 2!6 3!7 4!8 ~>";
"<[0,3] [0,1] 2 0!2 [0,1] [2,1] 2 0!2 [0,1] [2,1]!2 2 0!2 [0,1] [2,1]!3 2 0!2 [0,1] [2,1]!4 2 [0@7 ~] ~>".pick(
[stack(
"F5*2 [F5 C5] D5*2 C5 A5*2 G5*2 F5@2".note().clip(0.9),
chord(chrds).anchor("G4").voicing().struct("[~ x]*4 [[~ x]*2 [x@3 ~]]").gain(0.6),
n("[2 1]*4").chord(chrds).anchor("F2").voicing().struct("[x ~]*8").gain(0.6),
).piano().add(note(trnsp))
,"~@7 [C5 D5]".note().clip(0.8).piano().add(note(trnsp))
,stack(
stack(
"[[F5*2 ~]!2] [[F5 ~]!2 F5*2 ~]".note(),
chord("F").anchor("G4").voicing().struct(strct).gain(0.6),
"F2".struct(strct).note().gain(0.6)
).clip(0.8).piano().add(note(trnsp)),
"F".struct(bstrc).s(bsequ).release(0))
,"0,1,2,3,4,5".pick(beast).gain(0) // samples preload trick
]).cpm(140/8).room(0.4)
+23
View File
@@ -0,0 +1,23 @@
// "O'Malley, Former Underdog" (work in progress)
// song @by Deerhoof
// script @by eefano
setDefaultVoicings('legacy')
const crdpart = "<~@6 0@17 1@4 0@17 1@4 2@10>".pickRestart(
["< C@2 D@2 [[C ~]!3 D@2 [D ~] D@2]@2 G@2 D@3 Am G D A D@2 >"
,"< Em@2 D@2 >"
,"< [G A] [[C ~]!3 D@2 [D ~] D@2]!3 D >/2"
,"< G [D@6 G@10] >"
]);
stack("~"
,"<0@6 1@17 2@4 1@17 2@4 3@2 ~@8>".pickRestart(
["< <~ 0 1 2 3 4 5 6 7 4 5 6 7 8 9 10 11 7 8 9 10 11 12 13> ~>*8".sub(7)
,"< ~@2 5 6 7@2 6 5 6 ~ 4 ~@3 8 ~@11 7 8 9@2 8 7 8 ~ 6 ~@3 11@4 10 9 10 ~ 8 ~ 9@2 8 7 8 ~ 6 ~ 7 6 5 ~ 6 ~ 4 ~@5 >*4"
,"< 7@3 8 9@2 12@2 11@3 8 6@4 >*4"
,"< 7@2 6@2 5 6 5 4 >*4"
,"< 7 ~@7 6 ~@7 5 ~@2 5 ~ 5 4 ~@9 >*4"
]).n().scale("g3:major").s("gm_lead_1_square").room(0.4).delay(0.4).dfb(0.3).dt(60/128).gain(0.65)
,crdpart.chord().anchor("A4").voicing().s("gm_lead_8_bass_lead").room(0.4).color("blue").gain(0.5)
,s("hh*2").bank("RolandTR909").room(0.2).color("yellow").gain(0.2)
).cpm(147/2)
+42
View File
@@ -0,0 +1,42 @@
// "Pump Up The Jam" - Work In Progress
// song @by Technotronic
// script @by eefano
const pickRestart = register('pickRestart', (arr, pat) => pat.pick(arr.map((x)=>x.restart(pat.collect().fmap(v=>v+1)))))
const as = register('as', (mapping, pat) => { mapping = Array.isArray(mapping) ? mapping : [mapping];
return pat.fmap((v) => { v = Array.isArray(v) ? v : [v, 0];
return Object.fromEntries(mapping.map((prop, i) => [prop, v[i]])); }); });
stack("~"
,"<~@8 0@4 1@4 ~@8>".pickRestart(
["[u [u e] a [u i] [u ~] [a u] [i a] [o@3 i] ~ [a e] [a i] [o@3 i] [~ u@2 a] [e e] [o i] [o@3 i]]/4"
,"~ [u i] [u ~ ~ a] [i i@2 o]"
]).vowel().s("z_sawtooth").clip(0.8).gain(1.4)
,"<~@16 0@8>".pickRestart(
["[ ~@2 4 [5:1 ~] ~ [~ 0] [3:-1@5 3:1@2 2]@2 ~ [4@3:1 3 3@3 2 2@3 3 4:1@3 0 0@2 2:2@2]@5 [~ ~ 0@2 ~ 0@2 -2:-3]@2 ]/4"
]).as("n:penv").scale("c4:minor").clip(0.90).patt("0.15").s("square").delay(0.3).dfb(0.3).dt(60/128).gain(0.7)
,"<0@32>".pickRestart(
["[~@13 [[~@3 [0,-2,-4]@2 ~]@3 [0,-2,-4] [1,-1,-3]!2]@3 ]/4"
]).scale("c4:minor").note().clip(0.7).s("z_sawtooth").color("red").adsr("0.07:.1:0.6:0.1").gain(0.5)
,"<0@12 0 1 ~@2 3@8>".pickRestart(
["[0 ~@23]/2"
,"~@2 [~ [e2 ~]] [[0 2] ~]"
,"[0 ~ ~ 0 ~ ~ 0 ~] <[[~ [0 1]] [2 ~]] ~>"
]).scale("c2:minor").note().clip(0.9)
.layer(x=>x.s("z_sawtooth").delay(0.6).dfb(0.5).dt(60/125*3/4).pan(0.55).gain(0.8)
,x=>x.s("z_square").lpf(300).lpe(2).lpa(-1.5).lpd(0.1).lpr(0.05).pan(0.45).gain(1)).color("green")
,"<0@4 [0,1]@12 [0,1,2]@4 [0,1,2,3]@4>".pickRestart(
[stack(s("oh*16").pan(0.45).gain("[0.08 0.16]*4").release(0),s("hh*4").pan(0.7).gain(0.20))
,s("bd*4").lpf(150).gain(1)
,s("[~ cp]*2").gain(0.5).pan(0.25)
,s("[~ rd]*4").gain(0.15).release(0).hpf(1500).pan(0.75)
,s("[~ sd!3]!4 [sd*4]!4").slow(2).gain(run(32).slow(2).mul(1/31).add(0.1).mul(0.4))
,s("cr").gain(0.2)
,s("bd").gain(0.8)
]).bank("RolandTR909").color("yellow").velocity(0.7)
).cpm(124.5/4).room(0.3)
+40
View File
@@ -0,0 +1,40 @@
// "Pyramid Song (wip)"
// song @by Radiohead
// script @by eefano
setcps(104/60/4)
const split = register('split', (deflt, callback, pat) => callback(deflt.map((d,i)=> pat.withValue((v)=>{
const isobj = v.value !== undefined; const value = isobj ? v.value : v;
const result = Array.isArray(value)?(i<value.length?value[i]:d):(i==0?value:d);
return (i==0 && isobj) ? {...v,value:result} : result; }))));
let chr = {X:"f#2,c#3,a#3,c#4,f#4", Y:"g2,d3,b3,d4,f#4", Z:"a2,e3,a3,c#4,f#4", J:"g2,d3,b3,d4,g4", K:"f#2,c#3,a#3,c#4,g4",
V:"f#2,c#3,a3,c#4,f#4", W:"e2,b2,g#3,b3,f#4"}
piano: "<[i1 i2 i3 i4] ooooh [v1 v2]!4 ooooh@2 [v1 v2]!3 [v1 v3] [v3 v2] [i1 i2 i3 i2] [i3 i2 i3 i2] end>/8".pickRestart(
{i1:`<[[X:.6 X:.8]@3 Y:.5@2 [Z:.5 Z:.5]@3]>/2`, i2: `<[[Z:.4 Y:.4]@3 Y:.3@2 [J:.6 J:.9]@3]>/2`,
i3:`<[[K:.8 X:.6]@3 Y:.5@2 [Z:.5 Z:.5]@3]>/2`, i4: `<[[Z:.4 Y:.4]@3 Y:.4@2 [Y:.4 Y:.7]@3]>/2`,
ooooh:`<[[X X]@3 Y@2 [Z Z]@3] [[Z Y]@3 Y@2 [X X]@3] [[X X]@3 Y@2 [Z Z]@3] [[Z Y]@3 Y@2 [Y Y]@3]>/2`,
v1:`<[[X X]@3 Y@2 [Z Z]@3] [[Z Y]@3 Y@2 [X X]@3]>/2`,
v2:`<[[V V]@3 W@2 [W W]@3] [[Y Y]@3 Y@2 [Y Y]@3]>/2`,
v3:`<[[V V]@3 W@2 [W W]@3] [[Y Y]@3 X@2 [X X]@3]>/2`,
end:`<X:1>/8`,
}).split([0,.5],(x)=>x[0].pickOut(chr).velocity(x[1])).note().piano().gain(0.8).room(.6)
ooooh: "<~ 0 ~@4 0@2 ~@8>/8".pickRestart([
"<f#5@11 e5:-2 g#5:4 e5:-4 [f#5:2 ~] [~ g#5 e5] f#5@4 g#5 f#5 e5 d5 c#5@5 ~@3>*4"
]).split([0,0],(x)=>x[0].penv(x[1])).patt(0.04).s("triangle").attack(.08).release(.08).note().vmod(.1).vib(5).gain(0.3).lpf(2000).room(1.5)
drums: "<~@6 [~@15 0@15 1@2] [2,3]@8 3>/8".pick([
"<[bd,rd] ~ [~ sf*3] [bd,rd] ~ [~ sf*3] [bd,rd] ~ ~ [~ sf*3] [bd,rd] ~ [~ sf*3] [bd,rd] ~ [~ sf*3]>*8",
"<[sd sf bd] [sf sd sd]>*4",
"<[rd*4],[<~ ~ ~ bd ~ bd ~ ~ bd ~ bd ~ ~ bd ~ bd> <~!14 sf!2> <~ sd bd ~ sd ~ sd bd ~ sd ~ ~ sd ~ sd sd>]*4>",
"<cr,bd>/8",
]).pickOut({
bd: s('bd').bank('Linn9000').lpf(1000),
sd: s('sd').bank('RolandMT32').velocity(.5),
sf: s('sd').bank('RolandMT32').velocity(.2),
rd: s('rd').bank('Linn9000').velocity(0.3).hpf(8000),
mt: s('mt').bank('RolandMT32'),
lt: s('lt').bank('RolandMT32'),
cr: s('cr').bank('Linn9000').speed(0.4).velocity(0.3).hpf(4000),
}).room(.2).gain(0.5)
+40
View File
@@ -0,0 +1,40 @@
// "The Rhythm Of The Night" - Work In Progress
// song @by Corona
// script @by eeefano
setDefaultVoicings('legacy')
const as = register('as', (mapping, pat) => { mapping = Array.isArray(mapping) ? mapping : [mapping];
return pat.fmap((v) => { v = Array.isArray(v) ? v : [v, 0];
return Object.fromEntries(mapping.map((prop, i) => [prop, v[i]])); }); });
const crdpart = "<~ 0@10 1@24 0@19>".pickRestart(
["Ab Cm Bb F@2".slow(5)
,"Bb@3 Ab@3 Cm@2".slow(8)
]);
stack
("<0 1@4 0 1@4 ~@8 2 3@7 2 3@7 0 1@4 0 1@4 0 1@4 0 1@4>".pickRestart(
["~ [4@3 ~]!3 7:5 6 4 3"
,"2:-1 0:-2 ~@4 6:1 4:-1 6 4:2 ~@4 [4:2 3]@3 ~@6 4 7:5 6 [4@2 ~] [3:-1 2@3]@2 0 ~@2".slow(4)
,"~@6 [6 ~]!2"
,"6 5@0.5 [5 ~] [4 ~]!2 [3 ~] 3:2@1.5 ~@7 6@2 6:2 [5 ~ ]!2 4 3@2 4 2 0:-2 ~@7 [0 2]@3 3@2 4 6:4 4:-4 ~ 0 2 0 4 ~ 0 0:2@2 ~@7".slow(7)
]).as("n:penv").scale("c4:minor").patt("0.07").s("gm_lead_1_square").room(0.4).delay(0.3).dfb(0.35).dt(60/128).gain(0.85)
,crdpart.chord().anchor("F4").voicing().s("gm_synth_strings_1").color("blue").gain(0.4)
,"<~@11 1@23 ~ 0@19>".pickRestart(
["2 ~@2 2 ~@2 2 ~@3 2 ~@3 2 ~"
,"[2 ~@2 2 ~@2 2 ~]!2"
]).n().chord(crdpart).anchor(crdpart.rootNotes(2)).voicing().s("gm_synth_bass_1").lpf(1500).room(0.5).color("green").gain(0.9)
,"<~@11 1@8 ~@16 0@19>".pickRestart(
["<5 7 6 3!2> ~ 9 ~ 10 ~ ~ 12 ~ 11 ~ 10 ~ 11 9 ~"
,"<6!3 5!3 7!2> ~ 9 ~ 10 ~ ~ 12 ~ 11 ~ 10 ~ 11 9 ~"
]).scale("c3:minor").note().s("gm_lead_2_sawtooth").room(0.3).delay(0.3).dfb(0.5).dt(60/128*2).color("red").gain(0.6)
,"<[2,3] ~@10 0@6 [0,1]@2 [0,2] 0@5 [0,1]@2 [0,2] 0@6 [2,3] 0@8 [0,1]@2 [0,2] 0@8>".pickRestart(
[stack(s("bd*4").gain(0.8),s("[~ oh]*4").gain(0.14),s("hh*16").gain(0.09),s("[~ cp]*2").gain(0.4))
,s("[~ sd!3]!4 [sd*4]!4").slow(2).gain(run(32).slow(2).mul(1/31).add(0.1).mul(0.4))
,s("cr").gain(0.2)
,s("bd").gain(0.8)
]).bank("RolandTR909").room(0.2).color("yellow").velocity(1)
).cpm(128/4)
+15
View File
@@ -0,0 +1,15 @@
// "Shanghai" (work in progress)
// composed @by King Gizzard
// script @by eefano
setcps(81 / 60)
shangai: n("<0 1 2 ~ 4 5 5 ~ 4 2 1 5 8 7 9!2 7 8 5 1 2 4 ~ 5!2 4 ~ 2 1 0 -7!8>*4").scale('ab4:major').clip(.5).s("triangle").room(.8)
chords: n("<[0,2,4]!4>".add("<0 1 0 1 -2 0>/8")).scale("<ab3:major@5 bb3:major@1>/8").piano().gain(.5)
bass: n("<0@7 -4 0@6 0@4 -4 0@9 3@2 4@2>*4".add("<0 1 0 1 5 1>/8")).scale('ab1:major').clip(.95).s("gm_electric_bass_finger").lpf(800)
hh: s("<hh*4>").bank('9000').speed(1.5).gain(.2)
bd: s("<[bd@3 <~ bd>] ~>").bank('9000').gain(.7)
sd: s("<~ sd>").bank('9000').gain(.7)
+62
View File
@@ -0,0 +1,62 @@
// "She don't use jelly" (work in progress)
// composed @by The Flaming Lips
// script @by eefano
const gString = register('gString', (n,tuning, pat) =>
(pat.fmap((v) => { if(v[n]=='x') return note(0).velocity(0);
return note(v[n]+tuning[n]); }
).innerJoin()));
const guitar = (strums,fingers,tuning=[40,45,50,55,59,64]) => (strums.pickOut(
[fingers.pickOut(fingering).gString(0,tuning),fingers.pickOut(fingering).gString(1,tuning),fingers.pickOut(fingering).gString(2,tuning)
,fingers.pickOut(fingering).gString(3,tuning),fingers.pickOut(fingering).gString(4,tuning),fingers.pickOut(fingering).gString(5,tuning)]));
const split = register('split', (deflt, callback, pat) => callback(deflt.map((d,i)=> pat.withValue((v)=>{
const isobj = v.value !== undefined; const value = isobj ? v.value : v;
const result = Array.isArray(value)?(i<value.length?value[i]:d):(i==0?value:d);
return (i==0 && isobj) ? {...v,value:result} : result; }))));
setCps(86 / 60 )
const fingering =
{D5:"x:5:7:7:x:x",G5:"3:5:5:x:x:x",A5:"5:7:7:x:x:x",
D:"10:12:12:11:10:10",C:"8:10:10:9:8:8",G:"3:5:5:4:3:3",A:"5:7:7:6:5:5"
};
const sk = 300, sh = silence, strumming =
{d: stack(0,timeCat([1,sh],[sk,1]),timeCat([2,sh],[sk,2]),timeCat([3,sh],[sk,3]),timeCat([4,sh],[sk,4]),timeCat([5,sh],[sk,5]))
,u: stack(5,timeCat([1,sh],[sk,4]),timeCat([2,sh],[sk,3]),timeCat([3,sh],[sk,2]),timeCat([4,sh],[sk,1]),timeCat([5,sh],[sk,0]))
};
const song = "<0 1@8 2>/4"
lead: song.pickRestart(
["<~ ~ ~ [~ c4:7:.5]>"
,"<f#4 f#4*2 [a4:3:.1 f#4:-2:.1] [e4 f#4@2:3:.1 f#4]@2 f#4*2 [g4 f#4] [c#5:-2:.1 e4:2:1] >"
,"<f#4 ~@3>"
]).as("note:penv:patt").release(song.pickRestart([0,0,2]))
.s("gm_overdriven_guitar:11").color('magenta').gain(.55).hpf(400).lpf(5000).pan(.5)
rthm: song.pickRestart(
["~"
,"<D5:d [D5:d D5:u] G5:d [G5:d A5:u@2 A5:d]@2 [G5:d G5:u] [A5:d A5:u] [G5:d ~]>"
,"<D5:d ~@3>"
]).split([0,0],s=>guitar(s[1].pickRestart(strumming),s[0]).transpose(-12)
.release(song.pickRestart([.1,.1,2]))
.s("gm_overdriven_guitar:6").color('cyan').hpf(700).lpf(6000)).gain(1.5).pan(.4)
bass: song.pickRestart(
["~"
,note("<d2 d2*2 g1*2 [g1 a1@2 a1]@2 g1*2 a1*2 [g1 ~]>")
,"~"
]).s("gm_electric_bass_finger").color('green').lpf(500).dist("4:.25")
drum: song.pickRestart(
["~"
,"<cr,[hh!15 oh],[bd sd bd*2 [sd bd] [~ sd] [bd ~] [sd bd] [bd sd]]>/8"
,"<cr,bd>/4"
]).pickOut({
bd:s('linndrum_bd').hpf(50).lpf(2000).velocity(.8),
sd:s('linndrum_sd').hpf(200).velocity(.7),
hh:s('linndrum_hh').hpf(7000).speed(1.5).velocity(.3),
oh:s('linndrum_oh').hpf(7000).speed(1.1).velocity(.3),
cr:s('linndrum_cr').hpf(7000).speed(1.2).velocity(.3),
}).color('yellow').gain(1.2)
all(x=>x.rsize(.8).room(1.3)
// .ribbon(1*4,2*4)
)
+17
View File
@@ -0,0 +1,17 @@
await samples({'gtr': 'gtr/0001_cleanC.wav'}, 'github:tidalcycles/Dirt-Samples/master/');
const melodia = x => x.note().s("ocarina").gain(0.6).clip(1).release(0.1).color(2)
const guitar = x => x.note().s("gtr").room(1).gain(0.20).clip(1).release(0.3)
const accordi = x => x.note().s("recorder_bass_sus").gain(1.5).clip(1).release(0.5)
const basso = x => x.note().s("gm_electric_bass_pick").gain(0.8).clip(1).sustain(0.8)
const ritmo = x => x.bank("AlesisHR16").clip(1).gain(0.08)
const scala = "<c#4:major [f#4:major b3:major] [g#4:minor e4:major] [a4:major f#4:minor] [e4:major a4:major]>"
stack(
"<[0,2,4]*2>".struct("[x ~]*4").scale(scala).apply(accordi),
"<[4 2 0 4]*2 >".scale(scala).transpose(-12).apply(guitar),
"-3".struct("[x ~]*4").scale(scala).transpose(-12).apply(basso),
s("[sd,hh*2]!4").apply(ritmo),
).cpm(120/4)
+17
View File
@@ -0,0 +1,17 @@
stack("c","e","g")
.withHap((hap)=>{
hap.context.tempvalue=hap.value;
hap.value=hap.context.stacking===undefined?0:hap.context.stacking[0];
return hap;})
.eq("<0 1 2>").filterValues((val) => val)
.withHap((hap)=>{
hap.value=hap.context.tempvalue;
delete hap.tempvalue;
return hap;})
.note().piano()
+11
View File
@@ -0,0 +1,11 @@
setcps(0.7);
p1: n("0 2 4 6 7 6 4 2")
.scale("<c3:major>/2")
.s("supersaw")
.distort(0.7)
.superimpose((x) => x.detune("<0.5>"))
.lpenv(perlin.slow(3).range(1, 4))
.lpf(perlin.slow(2).range(100, 2000))
.gain(0.3);
p2: "<a1 e2>/8".clip(0.8).struct("x*8").s("supersaw").note();
+23
View File
@@ -0,0 +1,23 @@
// "Strudelman will eat you"
// @by eefano
setcps(1)
die: s("cr/16").late(666)
.bank(rand.range(0,3).pick(["RolandTR707","RolandS50","SequentialCircuitsDrumtracks","Linn9000"]))
.clip(rand.range(1,3))
.loop(1).loopBegin(.1)
.loopEnd(rand.range(.18,.3))
.speed(rand.range(.06,.10))
.pan(rand.range(.3,.7))
.gain(.2).attack(.5).release(3).color('black')
doom: note("a1/8").late(333)
.s(rand.range(0,40).pick(["numbers:0","numbers:1","numbers:2","numbers:3","numbers:4",
"numbers:5","numbers:6","numbers:7","numbers:8","numbers:9","~"]))
.speed(rand.range(.2,.3))
.gain(.9).color('black')
pain: s(`<[RolandTR707_cr,RolandS50_cr,SequentialCircuitsDrumtracks_cr,Linn9000_cr,
numbers:0,numbers:1,numbers:2,numbers:3,numbers:4,
numbers:5,numbers:6,numbers:7,numbers:8,numbers:9] ~@666>`).gain(0).color('black')
+30
View File
@@ -0,0 +1,30 @@
// "Strudelwall"
// guitar prototype @by eefano
const standardtuning = [40,45,50,55,59,64];
const fingering =
{C:"x:3:2:0:1:0",A:"x:0:2:2:2:0",G:"3:2:0:0:0:3",E:"0:2:2:1:0:0",D:"x:0:0:2:3:2"
,Am:"0:0:2:2:1:0",Em:"0:2:2:0:0:0",Dm:"x:0:0:2:3:1",Em7:"0:2:2:0:3:3", G_:"3:2:0:0:3:3"
,Dsus4:"x:x:0:2:3:3",A7sus4:"x:0:2:0:3:3"
};
const sk = 300, sh = silence, strumming =
{d: stack(0,timeCat([1,sh],[sk,1]),timeCat([2,sh],[sk,2]),timeCat([3,sh],[sk,3]),timeCat([4,sh],[sk,4]),timeCat([5,sh],[sk,5]))
,u: stack(5,timeCat([1,sh],[sk,4]),timeCat([2,sh],[sk,3]),timeCat([3,sh],[sk,2]),timeCat([4,sh],[sk,1]),timeCat([5,sh],[sk,0]))
//{d: "[~@0 0@300],[~@1 1@300],[~@2 2@300],[~@3 3@300],[~@4 4@300],[~@5 5@300]"
//,u: "[~@5 0@300],[~@4 1@300],[~@3 2@300],[~@2 3@300],[~@1 4@300],[~@0 5@300]"
};
const gString = register('gString', (n, pat) =>
(pat.fmap((v) => { if(v[n]=='x') return note(0).velocity(0);
return note(v[n]+standardtuning[n]); }
).innerJoin()));
const guitar = (strums,fingers,tuning=standardtuning) =>
(strums.pickRestart(strumming).pickOut(
[fingers.pickOut(fingering).gString(0),fingers.pickOut(fingering).gString(1),fingers.pickOut(fingering).gString(2)
,fingers.pickOut(fingering).gString(3),fingers.pickOut(fingering).gString(4),fingers.pickOut(fingering).gString(5)]));
stack(
guitar("[d@4 d@3 u d u d@2 d@3 u d u d@2 d@2 d u@2 u@2 u d u d u]/4","[Em7@9 G_@8 Dsus4@6 A7sus4@7 G_@2]/4")
.s("gm_acoustic_guitar_steel:2").clip(1).release(0.4).gain(0.6)
).cpm(174/4)//.pianoroll()
+19
View File
@@ -0,0 +1,19 @@
const k = 0.02;
function tablature(te,tB,tG,tD,tA,tE)
{ return stack(tE.add(64).late(k*5),
tA.add(59).late(k*4),
tD.add(55).late(k*3),
tG.add(50).late(k*2),
tB.add(45).late(k),
te.add(40)); }
const guitar = seq(tablature("0","2","2","1","0","0"),
tablature("0","3","2","0","1","0"),
"~");
stack(
guitar.note().s("gm_electric_guitar_jazz").clip(1).release(0.4).gain(0.5),
).cpm(110/4/2).pianoroll()
+9
View File
@@ -0,0 +1,9 @@
setDefaultVoicings('legacy')
const k = 0.01;
stack(
n(stack("~ -1","~@0.5 0@1.5","1 1".late(k),"~ 2".late(k*2),"~ 3".late(k*3)))
.chord("G!2 Bm E ".slow(4)).anchor("G4!2 F#4 E4".slow(4)).voicing()
.s("gm_electric_guitar_jazz").clip(1).release(0.4).gain(0.5),
).cpm(140/4).pianoroll()
+13
View File
@@ -0,0 +1,13 @@
setDefaultVoicings('legacy')
const k = 0.01;
stack(
n(stack("0@2 0 3@2 3 0 3",
"1@2 1 2@2 2 1 2".late(k),
"2@2 2 1@2 1 2 1".late(k*2),
"3@2 3 0@2 0 3 0".late(k*3)))
.chord("G!2 Bm E ".slow(4)).anchor("G4!2 F#4 A4".slow(4)).voicing()
.s("gm_electric_guitar_jazz").clip(1).release(0.2).gain(0.5),
).cpm(140/4).pianoroll()
+102
View File
@@ -0,0 +1,102 @@
// "Swim And Sleep Like A Shark" (Work In Progress)
// song @by Unknown Mortal Orchestra
// script @by eefano
setCps(123/60)
Pattern.prototype.enumerate = function () {
const pat = this.sortHapsByPart()
return new Pattern(state => {
const haps = pat.query(state.withSpan(span => span.begin.wholeCycle()))
const chunks = haps.length
return haps.map((hap, i) => new Hap(hap.whole, hap.part.intersection(state.span), [hap.value, i, chunks])
).filter(hap => hap.part != undefined)
}).splitQueries()
}
Pattern.prototype.warp = function (tpat) {
const pat = this;
return tpat.enumerate().withValue(v => pat.zoom(Fraction(v[1]).div(v[2]),
Fraction(v[1]).add(1).div(v[2])) ).outerJoin()}
function tablature(te,tB,tG,tD,tA,tE)
{ return stack(te.add(64),tB.add(59),tG.add(55),tD.add(50),tA.add(45),tE.add(40)); }
const parts =
{theme: tablature(
"~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 11 ~",
"9 ~ 9 ~ 10 9 7 ~ 9 6 ~ 10 ~ 10 ~ 12 14 14 ~ 13",
"~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 6 ~ ~ ~ ~ ~ ~ ~ ~ ~",
"~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~",
"7 7 ~ 7 ~ 7 5 5 ~ 4 ~ 9 9 ~ 9 ~ ~ 11 ~ 11",
"~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~",
).warp("t@2 t!4 [t!2]@4 t!2 [t!3]@6 t!4 t@2 t@3 t t@4").slow(16)
,arp1: tablature(
"~ ~ ~ 0 ~ ~ ~ 0 ~ ~ ~ 0",
"~ ~ ~ ~ ~ ~ ~ ~ ~ 0 ~ ~",
"~ 6 ~ ~ ~ 4 ~ ~ ~ ~ 2 ~",
"~ ~ 6 ~ ~ ~ 4 ~ ~ ~ ~ ~",
"4 ~ ~ ~ 2 ~ ~ ~ 0 ~ ~ ~",
"~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~",).slow(6)
,chords: tablature(
"~ ~ ~",
"0 2 0",
"1 2 1",
"2 2 2",
"2 0 2",
"0 ~ 0",).warp("t@3 t t@4").slow(8)
,arp2: tablature(
"~ ~ ~ 4 ~ ~ ~ ~ ~ 4 ~ ~ ~",
"~ ~ 2 ~ 2 ~ ~ 4 ~ ~ 4 ~ ~",
"~ 3 ~ ~ ~ 3 ~ ~ 4 ~ ~ 4 ~",
"~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 4",
"~ ~ ~ ~ ~ ~ 2 ~ ~ ~ ~ ~ ~",
"2 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~",).warp("t!3 t@2 t t@2 t!6 t@2").slow(8)
,arp3: tablature(
"~ ~ ~ 0 ~ ~ ~ ~ ~ ~ 0 ~ ~ ~ ~",
"~ ~ ~ ~ ~ ~ ~ ~ 0 ~ ~ 0 ~ ~ ~",
"~ 4 ~ ~ 4 ~ ~ ~ ~ 2 ~ ~ 2 ~ ~",
"~ ~ 4 ~ ~ 4 ~ ~ ~ ~ ~ ~ ~ ~ ~",
"2 ~ ~ ~ ~ ~ 2 0 ~ ~ ~ ~ ~ 0 2",
"~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 0",).warp("t!3 t@2 t!11").slow(8)
,lick1: tablature(
" ~ ~ ~ ~ 17 ~",
"17 ~ 17 ~ ~ 17",
" ~ ~ ~ ~ ~ ~",
" ~ ~ ~ ~ ~ ~",
"16 16 ~ 16 ~ ~",
" ~ ~ ~ ~ ~ ~",).warp("t@2 t!4 t@2").slow(4)
,lick2: tablature(
" ~ ~ ~ ~ 16 ~",
"16 ~ 16 ~ ~ 16",
" ~ ~ ~ ~ ~ ~",
" ~ ~ ~ ~ ~ ~",
"14 14 ~ 14 ~ ~",
" ~ ~ ~ ~ ~ ~",).warp("t@2 t!4 t@2").slow(4)
,coda: tablature(
"~ ~ ~ ~ ~ ~ ~ ~",
"7 5 7 9 10 10 12 9",
"~ ~ ~ ~ ~ ~ ~ ~",
"~ ~ ~ ~ ~ ~ ~ ~",
"5 4 5 7 9 9 11 7",
"~ ~ ~ ~ ~ ~ ~ ~",).warp("t@3 t!3 t@2 t@3 t t@4").slow(8)
}; // end of parts
const split = register('split', (deflt, callback, pat) =>
callback(deflt.map((d,i)=>pat.withValue((v)=>Array.isArray(v)?(i<v.length?v[i]:d):(i==0?v:d)))));
stack(
"<~@2 intro@16 verse@66 intro@16 verse@66 intro@16 solo@32 verse@66 intro@16 solo@32 ~@4>".pickRestart(
{intro: "<theme@16>",
verse: "<arp1@6 chords@8 arp2@8 arp1@6 chords@8 arp1@6 chords@8 arp3@8 chords@8>",
solo: "<lick1 lick2 lick2:-2 lick1:-5 lick1:-7 lick2:-7 coda@2>/4"}).split([0,0],(x)=>x[0].pickRestart(parts).transpose(x[1]))
.note().s("gm_electric_guitar_jazz:0").clip(1).release(0.4).gain(0.6).color('yellow'),
"<~@2 ~@16 0@66 ~@16 0@66 ~@48 0@66 ~@48 ~@4>".pickRestart([
`<7@2 9 7 6@2 8@2 5@2 7@2 7@2 6 5 4@2 2@6 ~@2
4@2 4b@5 4 5 6 4@5 4 6@2 7@4 6@4 5@3 4 2@6 ~@8
8@2 9@4 8@4 7@4 7@6 ~@7
5@3 [4@4 5 4]@8 [3 4 5 7 5 3]@8 2@6 ~@10>*2`]).scale("e:major").transpose(12)
.note().s("gm_ocarina").gain(0.6).color('green'),
"<0@2 1@16 1@66 1@16 1@66 1@48 1@66 1@48 ~@4>".pickRestart([
"<mt sd*4 sd lt>*2",
"<bd ~ bd*2 bd*2>,sd,hh*2"])
.s().bank("Linn9000").clip(1).gain(0.08).color('cyan')
).room(0.3)
+37
View File
@@ -0,0 +1,37 @@
// "Swimming With The Snake" - Work In Progress
// song @by Tim Smith of Cardiacs
// script @by eefano
setCps(95/60)
const rando1 = `4 5 6 3 5 6 5 2 3 4 5 2 6 ~ 7 6
4 2 5 3 6 5 3 7 4 5 6 3 7 ~ 9 4 6 7 3 5 3 6 5 1 4 5 3 4 2 3 4 5
7 8 9 7 8 9 10 6 3 7 6 4 5 6 7 8 9 3 5 6 7 8 3 5 6 7 5 6 7 9 8@2`
const rando2 = `0 1 2 -1 0 1 -2 2 1 5 4 -3 0 1 2 -2
2 1 0 1 2 0 1 0 1 -1 0 -2 0 -1 -2 -1 -2 -3 -2 -1 0 -1 0 -2 -1 -2 1 0 ~ 0 -2 0
1 3 0 1 -1 2 1 0 -1 -2 -1 0 1 -3 -1 0 1 -2@2 -1 0 1 -1 -2 1 3 4 5 -1 2 3 1`
const halo = x =>
x.slow(20).scale("c#:minor").add(12).note()
const part = stack(rando1.apply(halo).gain(0.2), rando2.apply(halo).gain(0.1))
const pats =
{ba1: "[0@8 -1@4 -2@2 -3@2 -2@8]/24"
,ba2: "[-2 -1 0]/6"
,ba4: "[-1 -2 -3 2 -2 -5 [-4 -3 -2 -1 0 2 -4 -3]@12 -2@8]/26"
,al2: "[[5,2] ~ [5,2] [3,0] ~ [3,0] [4,1] ~ [4,1] [0,-3] ~ [0,-3]]/6"
,vr1: "[~@0.5 11 13!2 11@4 ~ 11 13!2 11 9 10 11 <[ 9@2.5 8@2 7@3 ~] [~@0.5 9@3 ~@5]>@8.5 ]/24"
,vr4: "[10 13 11 9 10 11 [9!2]@3 [7!2]@3 ~@14]/26"
,tr1: "[0 3 1 4 2 5 -1 2 0 3 1 4 2 5 3 6 4 1 2 -1 3 0 4 1]/6"
}
stack(part.layer(x=>x.pan(0.2),x=>x.pan(0.8).late(3/4)).s("gm_pad_warm").release(0.05).room(0.5).color("white")
,"<ba1@48 ba2@24 ba1@24 ba1@22 ba4@26 ba1@24 ba1@22 ba4@26>"
.pickRestart(pats).scale("c#:minor").sub(12).note().s("gm_synth_strings_2").gain(1).color("green")
,"<~@48 al2@24 ~@24 ~@22 ~@26 ~@46 ~@26>".pickRestart(pats).scale("c#:minor").add(24).note()
.s("gm_recorder").superimpose(x=>x.late(1/2).velocity(.5)).release(0.2).gain(0.4).color("red")
,stack("<~@48 ~@24 vr1@46 vr4@26 vr1@46 vr4@26>".pickRestart(pats),
"<~@48 ~@24 ~@46 ~@26 vr1@46 vr4@26>".pickRestart(pats).sub(2))
.scale("c#:minor").transpose(0).note().s("triangle").hpf(900).attack(.05).release(.05).clip(.97).gain(1.2).color("yellow")
,"<~@48 ~@24 ~@46 ~@26 ~@46 tr1@26>".pickRestart(pats).scale("c#4:minor")
.superimpose(x=>x.transpose(12)).note().s("supersaw").gain(0.20).lpf(2000).color("red")
,s("shaker_small").struct("[x ~ ~ x]").gain("4.0 ~ ~ 2.0").color("brown")
,s("handbells").struct("x*2 x").gain(rand.range(0.1,0.4)).color("brown")
)//.pianoroll()
+21
View File
@@ -0,0 +1,21 @@
// NOT WORKING UNTIL mixJoin is implemented
const k = 2;
const tablature = (pat) => reify(pat)
.fmap(([te,tB,tG,tD,tA,tE]) => stack(
pure(tE+64).late(k*5).color("#FFF0F0"),
pure(tA+59).late(k*4).color("#FFE0E0"),
pure(tD+55).late(k*3).color("#FFD000"),
pure(tG+50).late(k*2).color("#FFD8D8"),
pure(tB+45).late(k*1).color("#FFD0D0"),
pure(te+40).late(k*0).color("#FFE8E8"))
).outerJoin()
const guitar = tablature("0:2:2:1:0:0!2 0:3:2:0:1:0 ~");
stack(
"E3 C3 ~".s("triangle"),
guitar.note().s("gm_electric_guitar_jazz").clip(1).release(0.4).gain(0.5),
).slow(5).pianoroll()
+19
View File
@@ -0,0 +1,19 @@
// "Endless Tarantella"
// script @by eefano
setcps(140/60)
//let pizza = run(16).slow(16)
let pizza = rand.range(0,16).segment(16).slow(16)
iamme: pizza.pick(["4 ~ 4","7 ~ 7","4","4 ~ 4","5 ~ 5","5 6 5","4","4 ~ 5","4@2 3","3 ~ 4","3@2 2","2 ~ 3","4 5 4","3 2 1","0","7 ~ 7"])
.scale("a:minor").s('gm_clarinet').note()
let pasta = pizza.pick([0,0,0,0,1,1,0,0,2,2,0,0,2,2,0,0]).fast(2)
funiculi: pasta.pick(["[0 ~] [-3 ~]","[3 ~] [-2 ~]","[1 ~] [-3 ~]"]).slow(2)
.scale("a2:minor").s('gm_tuba').note().lpf(800)
funicula: pasta.pick(["[~@2 [0,2,4]]!2","[~@2 [1,3,5]]!2","[~@2 [4,-1,1]]!2"]).slow(2)
.scale("a3:minor").s('gm_harmonica').note()
uagliu: s("tambourine")
+55
View File
@@ -0,0 +1,55 @@
// "Il Vento Caldo Dell'Estate (wip)"
// song @by Alice
// script @by eefano
const split = register('split', (deflt, callback, pat) => callback(deflt.map((d,i)=> pat.withValue((v)=>{
const isobj = v.value !== undefined; const value = isobj ? v.value : v;
const result = Array.isArray(value)?(i<value.length?value[i]:d):(i==0?value:d);
return (i==0 && isobj) ? {...v,value:result} : result; }))));
setCps(115/60)
synt: "<a@27 b@70 b@75 ~@56 b@70 b@75 ~@56 ~@87 ~@8>".pickRestart({
a: "<0@6 0@6 0@7 0@7 0@8 0@10 0@10>*2",
b: "<0@6 0@6 0@6 0@7 0@7 0@6 0@6 0@6 0@6 0@7 0@7 0@6 0@8 0@10 0@8 0@10 0@8 0@10 0@10 0@10>*2"
}).pickRestart(["<0 4 7 8 10 11 9 12 14 12>*2"])
.scale("c#4:major").note().s("gm_drawbar_organ:4").room(.3).lpf(1200).gain(0.7).color('yellow')
bass: "<a@172 b@56 a@145 b@56 c@87 ~@8>".pickRestart({
a: "<[<c#2:1!22 [c#2:.8 c#2:.9] > <c#3:1!6 [c#3:.8 c#3:.9]>]>".s("gm_electric_bass_finger:2"),
b: "<~@2 c#2:1@4 c2:1@2 a#1:1@6 c2:1@2 g#1:1@8 d#2:1@8 c2:1@8 f2:1@8 c#2:1@8>".s("triangle"),
c: "<~@2 [[c#2!6 a#1!8 g#1!6 d#2!8 c2!8 f2!8 c#2!8]!2]@104>".fast(1.2).s("gm_electric_bass_finger:2"),
}).split([0,.6],s=>note(s[0]).clip(s[1])).lpf(400).gain(1.5).color('cyan')
wind: "<~@172 a@56 ~@145 a@56 b@87 ~@8>".pickRestart({
a: "<~@2 C#:g#2@4 G#:g#2@2 A#m:g#2@6 C#:g#2@2 G#:g#2@8 D#:d#2@8 Cm:d#2@8 F7:d#2@8 C#:d#2@8>",
b: "<~@2 [[C#:g#2:1@6 A#m:g#2:1@8 G#:g#2:1@6 D#:a#2:1@8 Cm:a#2:1@8 F7:a#2:1@8 C#:a#2:1@8]!2]@104>".fast(1.2)
}).split([0,0,0],s=>
n(s[2].pickRestart(["<0,1,2,3>/8","<[0,1,2,3]*3>/2"]))
.chord(s[0]).anchor(s[1]).mode('above').voicing().s("gm_church_organ").gain(0.7)
.superimpose(u=>u.when(s[2],w=>
n("<4 5 6 7 8 7 6 5 4>*8").chord(s[0]).anchor(s[1])).mode('above').voicing().s("sawtooth").gain(0.65))
).room(.7).color('green')
voic: "<~@172 a@56 ~@145 a@56 b@87 ~@8>".pickRestart({
a: note(`<~ c#4 d#4@2 c#4@2 [c4 c#4] [d#4 f4] c#4@2 d#4@2 ~ [~ c#4] [c4 c#4] [d#4 f4] d#4 g#3@5
~ [~ d#4] f4@2 d#4@2 d4 d#4 ~ [~ d#4] f4@2 [g4 f4] [d#4 f4] d#4@2
~ [~ d#4] f4@2 d#4@2 [f4@3 d#4@3]@3 f4@9 >`)
.s("gm_oboe").gain(1.7).lpf(3000).release(.1),
b: note(`<~@2 [[d#4@2 c#4@2 [c4 c#4] [d#4 f4] c#4@2 [d#4@6 ~ c#4]@4 [c4 c#4] [d#4 f4] d#4
[g#3@8 ~ d#4]@5 f4@2 d#4@2 d4 [d#4@4 ~ d#4]@3 f4@2 g4@2 d#4@3
[~ d#4] f4@2 d#4@2 f4@2 d#4 f4@8 [~ <c#4 ~>]]!2]@104 >`).fast(1.2)
.s("gm_distortion_guitar:2").gain(1).lpf(3000).release(.1)
}).color('purple').room(.2)
drums: `<a@27 [a,b]@24 [a,b,c]@5 [a,d]@56 [a,d,e]@2 [a,d]@20 [a,d,f]@2 [a,d]@24 [a,d,g]@2 [a,d]@10
~@56 [a,d]@145 ~@56 h@87 ~@8>`.pickRestart({
a: "<bd,hh>", b: "<~ ~ sd ~>", c:"<[~ sd*2] ~@4>", d:"<~ sd>", e:"<~ [~ sd*2]>",
f:"<~ [[~ sd] [sd ~]]>", g:"<~ [~ sd]>",
h:"<[[[sd,[~ sd@15]] sd] sd]@2 [[bd sd [~ bd] sd]!24]@96 bd@8>".fast(1.2)
}).pickOut({
bd: s('bd').lpf(800).velocity(1.1),
sd: s('sd').velocity(.7),
hh: s('hh').velocity(0.1).hpf(8000),
cr: s('cr').speed(0.7).velocity(0.1).hpf(6000),
}).bank("Linn9000").room(0.2).gain(0.8).rsize(4)
+31
View File
@@ -0,0 +1,31 @@
// "Vermin Mangle" (work in progress)
// song @by Tim Smith (Cardiacs)
// script @by eefano
setcps(52 / 60)
const song = `< i@8 j@27 >`
const melody = {
i: "<f#4 ~ c#5@3 ~ a#4@2 g#4 ~ f#4 ~ a4@2 g#4 ~ f#4 ~ e4 ~ d4@2 ~@2 >*6",
j: `<f#5@2 [e5@2 c#5] c#5 [f#4 a#4 c#5] [f#5@2 g#5] g#5 a5 [c#5@2 f#5 f#5@2 f#5] f#5 e5
[c#5 b4 a#4 f#4] f#4 g#4 [c#4@3 a#4 e5@2] [d5 c#5 b4] [b4 a4 g4] f#4!2 g#4 [c#4@2 f#4] f#4@2 ~@100>`,
}
const ch0rds = {
i: "<F#@2 E7@2>",
j: "<F#@2 E7@2 F#@2 E D F# D E F# B E F# E G D B E F# D E F#@2 E@2>",
}
$: note(song.pickRestart(melody)).clip(.98)
.apply(song.pickRestart(
{ i: x=>x.s("gm_trumpet").pan(.3).gain(.6),
j: x=>x.s("gm_vibraphone:4").vib(10).vibmod(.09).delay(.4).dt(.2).dfb(.10).gain(.7).dec(2)
}))
$: chord(song.pickRestart(ch0rds)).anchor('E4').voicing()
.layer(x=>x.s("gm_accordion:2").struct("[~ x x]").clip(.6).pan(.40).gain(.4),
x=>x.transpose(12).s("gm_string_ensemble_2:2").pan(.5).gain(.4))
$: n("[0 ~ ~]").chord(song.pickRestart(ch0rds)).mode('root').anchor('f#2').voicing()
.s("gm_tuba:3").gain(1)
$: s("bassdrum2:2,tambourine:0").clip(1.5).gain(1.5)
all(x => x.room(.8))
+18
View File
@@ -0,0 +1,18 @@
// "Veronica In Ecstasy" (Chorus)
// song @by Tim Smith (of Cardiacs)
// script @by eefano
setDefaultVoicings('legacy')
const chrds = "<B [F# A] [C G] [D C#] [E A] [B C#] [Fm A#] [E A] [A# Fm] [E F#] [E F#]>";
const meldy = `[[f#6]*3 [f#6 [~ ~ f#6]]] [[f#6]*3 [[f#6 e6 ~] e6]]
[[e6 e6 [e6 f#6]] [[g6 ~ d6] d6]] [[d6 d6 [e6 f#6]] [g#6 f6 c#6]]
[[g#5 [ ~ ~ g#5]] [[a5 b5] c#6 c#6]] [[f#6]*3 [f6 c#6 g#5]]
[[g#5 [ ~ ~ g#5]] [[a#5 c6] d6 a#5]] [[g#5 a5 b5] [c#6 d6 e6]]
[[d6 a#5 f5] [[g#5 ~] g#5]] ~ [~@3 [~ ~ f#6]]`.slow(11);
stack(
meldy.clip(0.9).note(),
//meldy.transpose("-12").note(),
chord(chrds).anchor("G4").voicing().struct("<[[~ x x] [x@2 x] [~ x ~] x]!8 [x!4] [~ x ~ x]!2>").gain(0.6),
chrds.rootNotes(2).note().struct("<[x@2 ~]*2!9 [x ~ [~ ~ x] ~]!2>").gain(0.6),
).cpm(120/4).room(0.4).piano()//.pianoroll()
.room( slider(1.93,0,10))
.rsize( slider(2,0,8,1))
+16
View File
@@ -0,0 +1,16 @@
setDefaultVoicings('legacy')
const chrds = "<B [F# A] [C G] [D C#] [E A] [B C#] [Fm A#] [E A] [A# Fm] [E F#] [E F#]>".rev();
const meldy = `[[f#6]*3 [f#6 [~ ~ f#6]]] [[f#6]*3 [[f#6 e6 ~] e6]]
[[e6 e6 [e6 f#6]] [[g6 ~ d6] d6]] [[d6 d6 [e6 f#6]] [g#6 f6 c#6]]
[[g#5 [ ~ ~ g#5]] [[a5 b5] c#6 c#6]] [[f#6]*3 [f6 c#6 g#5]]
[[g#5 [ ~ ~ g#5]] [[a#5 c6] d6 a#5]] [[g#5 a5 b5] [c#6 d6 e6]]
[[d6 a#5 f5] [[g#5 ~] g#5]] ~ [~@3 [~ ~ f#6]]`.slow(11).rev();
stack(
meldy.clip(0.9).note(),
chord(chrds).anchor("G4").voicing().struct("<[[~ x x] [x@2 x] [~ x ~] x]!8 [x!4] [~ x ~ x]!2>").gain(0.55),
n("0").chord(chrds).mode("root:c3").voicing().struct("<[x@2 ~]*2!9 [x ~ [~ ~ x] ~]!2>").gain(0.7),
).cpm(105/4).piano()
.room( slider(1.93,0,10))
.rsize( slider(2,0,8,1))
+48
View File
@@ -0,0 +1,48 @@
// "Vine" (work in progress)
// composed @by Tim Smith of Spratleys Japs
// script @by eefano
setCps(143 / 60 / 4)
const song = "<0@8 1@28 2@24 3@24 1@25 1@28 2@36 3@24 4@16 5@12 6@66 7@66 8@66 ~@8>*4"
const chordseq = song.pickRestart(["~",
"<C@3 G# C# Cm G# C# Cm B F# A@3>*2", // verse
"<E B C# G# A# F>*2", // chorus
"<G# C@2>/2", "~", // post-chorus
"<E@4 C@2 A#@3 D@4 C@2 G#@5 D@4>*8", // interlude
"<Dm@9 G@5 A@5 G@4 A@6 Dm@4 G@10 A@5 G@3 A@4 G@5 Dm@13 G@7 A@5 G@7 A@4 G@4 Dm@7 G@9 A@4 G@5 A@3 G@4>*8", //snare
"<Dm@9 G@5 A@5 G@4 A@6 Dm@4 G@9 A@6 G@3 A@4 G@5 Dm@13 G@7 A@5 G@7 A@4 G@4 Dm@7 G@9 A@4 G@5 A@3 G@4>*8", //handclaps
"<Dm@9 G@6 A@5 G@4 A@6 Dm@4 G@9 A@6 G@3 A@4 G@5 Dm@13 G@7 A@5 G@7 A@4 G@4 Dm@7 G@9 A@4 G@5 A@3 G@3>*8"]); //triangle
voice: song.pickRestart(["~",
note("<c4*2 c4 [a#3 c4] c4@2 ~ c4*2 d#4 f4 ~ d#4*2!2 d#4 c4 g#4 ~ g4 ~ [f#4 f4] [d#4 c#4] a#3 ~ [e4 d#4] e4 [e4 f#4] g#4@2 g#4>*4"),
note("<[g#4@2 ~ f#4] [f#4@2 ~ f4] [f4@2 ~ d#4] [d#4@2 ~ d4] [d4@2 ~ c4] [c4 a4@3]>*2").gain(1.4),
"~"
]).s('gm_oboe').clip(.95).color('yellow')
bass: n(song.pickRestart(["~","0*4","[0@2 ~ 0]*2","0*8"])).chord(chordseq).mode("root:e2").voicing()
.s("gm_electric_bass_pick").clip(.90).lpf(300).gain(1).color('green')
guitar: n(song.pickRestart(["~","[0,2,3]*2","[[0,2,3]@3 [0,2,3]]*2","~"])).chord(chordseq).mode("root:e3").voicing()
.s(song.pick(["~","gm_acoustic_guitar_steel:2","gm_overdriven_guitar:2","~"])).color('red')
organ: n(song.pick(["~","~","~","~","[2 1]*4"])).anchor("g5").chord(chordseq).voicing()
.s("sawtooth").clip(.6).color('cyan')
drums: song.pickRestart([
"<hh*4,[<bd bd*2> sd]>*2",
"<hh*4,[bd sd]>*2",
"<hh*4,[bd sd]>*2",
"~","<sl*4>","<sl*4>",
"<hh*4,[<bd bd*2> sd]>*2",
"<hh*4,[<bd bd*2> [sd,cp]]>*2",
"<hh*4,tr*2,[<bd bd*2> [sd,cp]]>*2",
]).pickOut({
bd:s('linndrum_bd').lpf(3000).room(.2).velocity(.8),
sd:s('linndrum_sd').room(.2).velocity(.65),
hh:s('linndrum_hh').hpf(7000).speed(1.5).velocity(.3),
oh:s('linndrum_oh'),
sl:s('sleighbells'),
tr:s('anvil').speed(1.15).velocity(30),
cp:s('cp')
})
all(x=>x.room(.1)
// .ribbon(2*4,1*8)
)
+22
View File
@@ -0,0 +1,22 @@
// "Waltz #2" (cps function demo)
// composed @by Dmitri Shostakovich
// script @by eefano
setDefaultVoicings('legacy')
melody: "<~@4 0@16 1@7 2@11.5 ~@3.5>".pickRestart([
`<4 [2@2 1] [0@4 0 1]@2 [2 0 2] [4@2 5] 4 3
3 [1@2 0] [0b@4 -3 0b]@2 [1 0b 1] [3 4 5] 4b 4>`,
"<[9,7] [[8,6]@2 [7,5]] [[6,4]@2 [5,3]] [3,0] [8,6] [[7,5]@2 [6,4]] [6,4]>",
"<[~ [2 ~] [3 ~]] [[4 ~] [4 3] [4 5]] [[3 ~] [3 2] [3 4]] [[2 ~] ~ [4 ~]] > ".sub("<0 0 [0,2]>/4") ])
.scale("c4:minor").note().s("gm_oboe:2").gain(0.7)._pianoroll({minMidi:10})
piano: "<0@28 1@10 0@4>".pickRestart([
n("<<0 -1> [4,5]!2>*3").chord("<Cm@10 Fm@4 G@4 Cm@4 Fm@2 Bb@2 Eb Ab>"),
n("<3 <[4,5] > ~>*3").chord("<G Ab Cm Ab>")
]).anchor('f2').mode('root').voicing().piano()._pianoroll()
tempochanges: cps(sine.segment(32).slow(16).mul(30).add(160).div(60*3)).gain(0)
all(x=>x
//.ribbon(24,16)
.room(0.6))
+29
View File
@@ -0,0 +1,29 @@
// "Woodeneye" (wip)
// song @by Cardiacs
// script @by eefano
setCps(200 / 60 / 2)
const song = "<1@16 2@16 3@7 4@4>"
const chordseq = song.pickRestart([
"~",
"<[~ A:f4:.6:0!15]>/4",
"<[~ A:g4:.6!7] [F:f4:.6!8]>/2",
"<D:d4 G:d4 A:d4:.8@2 B:g4 C:g4 G:d4:.8>",
"<[~ D:g4:.6!3] [D:g4 A:d4]>"])
mello: chordseq.as("chord:anchor:clip:n").voicing().speed(0.97).begin(.03).s('gm_synth_bass_1').lpf(2000).gain(.7).color('cyan')
drums: song.pickRestart([
"<oh,<~ bd!3> [sd <~!3 [sd,oh]>]>*2",
"<hh,<~ bd!3> [sd <~!3 bd ~!3 [sd,oh]>]>*2",
"<hh,<~ bd!3> [sd <~!3 [sd,oh]>]>*2",
"<oh,[bd <~!3 bd>] sd>*2",
]).pickOut({
bd: s('linndrum_bd').lpf(2000).room(.2).velocity(.8),
sd: s('linndrum_sd').room(.2).velocity(.75),
hh: s('linndrum_hh').hpf(7000).speed(1.5).velocity(.4),
oh: s('linndrum_oh').speed(1.3).hpf(3000).velocity(.3).clip(1.2),
})
all(x => x.room(.1)
// .ribbon(2*4,1*8)
)