commit ebcb5cf91e7e41740bce54f0e7e3cf7da0116dc4 Author: Rob Canning Date: Thu Apr 25 13:30:05 2024 +0200 initial commit of performance instrument diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a7506a7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +ardour/radio_helsinki/interchange +ardour/radio_helsinki/radio_helsinki.ardour +ardour/radio_helsinki/klet +ardour/radio_helsinki/peaks diff --git a/ardour/radio_helsinki.ardour/instant.xml b/ardour/radio_helsinki.ardour/instant.xml new file mode 100644 index 0000000..34e7e7b --- /dev/null +++ b/ardour/radio_helsinki.ardour/instant.xml @@ -0,0 +1,42 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ardour/radio_helsinki.ardour/radio_helsinki.ardour b/ardour/radio_helsinki.ardour/radio_helsinki.ardour new file mode 100644 index 0000000..081626e --- /dev/null +++ b/ardour/radio_helsinki.ardour/radio_helsinki.ardour @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ardour/radio_helsinki.ardour/radio_helsinki.ardour.bak b/ardour/radio_helsinki.ardour/radio_helsinki.ardour.bak new file mode 100644 index 0000000..341d07c --- /dev/null +++ b/ardour/radio_helsinki.ardour/radio_helsinki.ardour.bak @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ardour/radio_helsinki/export/graz-2024-04-02-13-04-50.mp3 b/ardour/radio_helsinki/export/graz-2024-04-02-13-04-50.mp3 new file mode 100644 index 0000000..6ecb723 Binary files /dev/null and b/ardour/radio_helsinki/export/graz-2024-04-02-13-04-50.mp3 differ diff --git a/ardour/radio_helsinki/instant.xml b/ardour/radio_helsinki/instant.xml new file mode 100644 index 0000000..f123869 --- /dev/null +++ b/ardour/radio_helsinki/instant.xml @@ -0,0 +1,45 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ardour/radio_helsinki/plugins/3289/state1/manifest.ttl b/ardour/radio_helsinki/plugins/3289/state1/manifest.ttl new file mode 100644 index 0000000..9bca433 --- /dev/null +++ b/ardour/radio_helsinki/plugins/3289/state1/manifest.ttl @@ -0,0 +1,13 @@ +@prefix atom: . +@prefix lv2: . +@prefix pset: . +@prefix rdf: . +@prefix rdfs: . +@prefix state: . +@prefix xsd: . + + + lv2:appliesTo ; + a pset:Preset ; + rdfs:seeAlso . + diff --git a/ardour/radio_helsinki/plugins/3289/state1/state.ttl b/ardour/radio_helsinki/plugins/3289/state1/state.ttl new file mode 100644 index 0000000..af2a63d --- /dev/null +++ b/ardour/radio_helsinki/plugins/3289/state1/state.ttl @@ -0,0 +1,18 @@ +@prefix atom: . +@prefix lv2: . +@prefix pset: . +@prefix rdf: . +@prefix rdfs: . +@prefix state: . +@prefix xsd: . + +<> + a pset:Preset ; + lv2:appliesTo ; + state:state [ + [ + a atom:Tuple ; + rdf:value () + ] + ] . + diff --git a/ardour/radio_helsinki/radio_helsinki.ardour.bak b/ardour/radio_helsinki/radio_helsinki.ardour.bak new file mode 100644 index 0000000..9dfd1c5 --- /dev/null +++ b/ardour/radio_helsinki/radio_helsinki.ardour.bak @@ -0,0 +1,3536 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a0 0 +a4611686018427385600 0 + + + + a0 0 +a4611686018427385600 0 + + + + a0 160 +a4611686018427385600 160 + + + + a0 4 +a4611686018427385600 4 + + + + a0 50 +a4611686018427385600 50 + + + + a0 20 +a4611686018427385600 20 + + + + a0 6000 +a4611686018427385600 6000 + + + + a0 0 +a4611686018427385600 0 + + + + a0 1 +a4611686018427385600 1 + + + + a0 0 +a4611686018427385600 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a0 0 +a4611686018427385600 0 + + + + a0 0 +a4611686018427385600 0 + + + + a0 160 +a4611686018427385600 160 + + + + a0 4 +a4611686018427385600 4 + + + + a0 50 +a4611686018427385600 50 + + + + a0 20 +a4611686018427385600 20 + + + + a0 6000 +a4611686018427385600 6000 + + + + a0 0 +a4611686018427385600 0 + + + + a0 1 +a4611686018427385600 1 + + + + a0 0 +a4611686018427385600 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a0 0 +a4611686018427385600 0 + + + + a0 0 +a4611686018427385600 0 + + + + a0 160 +a4611686018427385600 160 + + + + a0 4 +a4611686018427385600 4 + + + + a0 50 +a4611686018427385600 50 + + + + a0 20 +a4611686018427385600 20 + + + + a0 6000 +a4611686018427385600 6000 + + + + a0 0 +a4611686018427385600 0 + + + + a0 1 +a4611686018427385600 1 + + + + a0 0 +a4611686018427385600 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a0 0 +a4611686018427385600 0 + + + + a0 0 +a4611686018427385600 0 + + + + a0 160 +a4611686018427385600 160 + + + + a0 4 +a4611686018427385600 4 + + + + a0 50 +a4611686018427385600 50 + + + + a0 20 +a4611686018427385600 20 + + + + a0 6000 +a4611686018427385600 6000 + + + + a0 0 +a4611686018427385600 0 + + + + a0 1 +a4611686018427385600 1 + + + + a0 0 +a4611686018427385600 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ardour/radio_helsinki/radio_helsinki.pending b/ardour/radio_helsinki/radio_helsinki.pending new file mode 100644 index 0000000..37d8555 --- /dev/null +++ b/ardour/radio_helsinki/radio_helsinki.pending @@ -0,0 +1,3567 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a0 0 +a4611686018427385600 0 + + + + a0 0 +a4611686018427385600 0 + + + + a0 160 +a4611686018427385600 160 + + + + a0 4 +a4611686018427385600 4 + + + + a0 50 +a4611686018427385600 50 + + + + a0 20 +a4611686018427385600 20 + + + + a0 6000 +a4611686018427385600 6000 + + + + a0 0 +a4611686018427385600 0 + + + + a0 1 +a4611686018427385600 1 + + + + a0 0 +a4611686018427385600 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a0 0 +a4611686018427385600 0 + + + + a0 0 +a4611686018427385600 0 + + + + a0 160 +a4611686018427385600 160 + + + + a0 4 +a4611686018427385600 4 + + + + a0 50 +a4611686018427385600 50 + + + + a0 20 +a4611686018427385600 20 + + + + a0 6000 +a4611686018427385600 6000 + + + + a0 0 +a4611686018427385600 0 + + + + a0 1 +a4611686018427385600 1 + + + + a0 0 +a4611686018427385600 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a0 0 +a4611686018427385600 0 + + + + a0 0 +a4611686018427385600 0 + + + + a0 160 +a4611686018427385600 160 + + + + a0 4 +a4611686018427385600 4 + + + + a0 50 +a4611686018427385600 50 + + + + a0 20 +a4611686018427385600 20 + + + + a0 6000 +a4611686018427385600 6000 + + + + a0 0 +a4611686018427385600 0 + + + + a0 1 +a4611686018427385600 1 + + + + a0 0 +a4611686018427385600 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a0 0 +a4611686018427385600 0 + + + + a0 0 +a4611686018427385600 0 + + + + a0 160 +a4611686018427385600 160 + + + + a0 4 +a4611686018427385600 4 + + + + a0 50 +a4611686018427385600 50 + + + + a0 20 +a4611686018427385600 20 + + + + a0 6000 +a4611686018427385600 6000 + + + + a0 0 +a4611686018427385600 0 + + + + a0 1 +a4611686018427385600 1 + + + + a0 0 +a4611686018427385600 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jack/jack_plumbing.sh b/jack/jack_plumbing.sh new file mode 100755 index 0000000..3bb4f32 --- /dev/null +++ b/jack/jack_plumbing.sh @@ -0,0 +1,6 @@ +jack_disconnect SuperCollider:out_1 system:playback_1 +jack_disconnect SuperCollider:out_2 system:playback_2 + +jack_connect SuperCollider:out_1 "ardour:SC-0/audio_in 1" +jack_connect SuperCollider:out_2 "ardour:SC-0/audio_in 2" + diff --git a/jack/radio_helsinki.xml b/jack/radio_helsinki.xml new file mode 100644 index 0000000..8b6059b --- /dev/null +++ b/jack/radio_helsinki.xml @@ -0,0 +1,264 @@ + + + + + capture_1 + capture_2 + capture_3 + capture_4 + + + out_1 + out_2 + out_3 + out_4 + out_5 + out_6 + out_7 + out_8 + + + out0 + out1 + + + LTC\-Out + Click\/audio_out\ 1 + Click\/audio_out\ 2 + Master\/audio_out\ 1 + Master\/audio_out\ 2 + Audio\ 1\/audio_out\ 1 + Audio\ 1\/audio_out\ 2 + Audio\ 2\/audio_out\ 1 + Audio\ 2\/audio_out\ 2 + Audio\ 3\/audio_out\ 1 + Audio\ 3\/audio_out\ 2 + Audio\ 4\/audio_out\ 1 + Audio\ 4\/audio_out\ 2 + SC\-0\/audio_out\ 1 + SC\-0\/audio_out\ 2 + DELAY\/audio_out\ 1 + DELAY\/audio_out\ 2 + DIST\/audio_out\ 1 + DIST\/audio_out\ 2 + auditioner\/audio_out\ 1 + auditioner\/audio_out\ 2 + + + Click\/audio_out\ 1 + Click\/audio_out\ 2 + Master\/audio_out\ 1 + Master\/audio_out\ 2 + auditioner\/audio_out\ 1 + auditioner\/audio_out\ 2 + + + Audio\ 1\/audio_out\ 1 + Audio\ 1\/audio_out\ 2 + Audio\ 2\/audio_out\ 1 + Audio\ 2\/audio_out\ 2 + Audio\ 3\/audio_out\ 1 + Audio\ 3\/audio_out\ 2 + Audio\ 4\/audio_out\ 1 + Audio\ 4\/audio_out\ 2 + SC\-0\/audio_out\ 1 + SC\-0\/audio_out\ 2 + DELAY\/audio_out\ 1 + DELAY\/audio_out\ 2 + DIST\/audio_out\ 1 + DIST\/audio_out\ 2 + + + capture_1 + capture_1 + capture_2 + capture_2 + capture_3 + capture_3 + capture_4 + capture_4 + + + MMC\ out + Scene\ out + x\-virtual\-keyboard + MTC\ out + MIDI\ Clock\ out + + + Midi\ Through\ Port\-0 + + + UMC404HD\ 192k\ UMC404HD\ 192k\ MID + + + nanoKONTROL2\ nanoKONTROL2\ _\ CTR + + + MidiSport\ 4x4\ MIDI\ 1 + MidiSport\ 4x4\ MIDI\ 2 + MidiSport\ 4x4\ MIDI\ 3 + MidiSport\ 4x4\ MIDI\ 4 + + + out0 + out1 + out2 + out3 + out4 + out5 + out6 + + + MidiSport\ 4x4\ MIDI\ 1 + MidiSport\ 4x4\ MIDI\ 1 + MidiSport\ 4x4\ MIDI\ 2 + MidiSport\ 4x4\ MIDI\ 2 + MidiSport\ 4x4\ MIDI\ 3 + MidiSport\ 4x4\ MIDI\ 3 + MidiSport\ 4x4\ MIDI\ 4 + MidiSport\ 4x4\ MIDI\ 4 + + + + + playback_1 + playback_2 + playback_3 + playback_4 + + + in_1 + in_2 + in_3 + in_4 + in_5 + in_6 + in_7 + in_8 + + + physical_audio_input_monitor_enable + LTC\ in + Master\/audio_in\ 1 + Master\/audio_in\ 2 + SC\ Master\/ACE\ Compressor\ \(stereo\)\ 1\/audio_in\ 1 + Audio\ 1\/audio_in\ 1 + Audio\ 2\/audio_in\ 1 + Audio\ 3\/audio_in\ 1 + Audio\ 4\/audio_in\ 1 + SC\-0\/audio_in\ 1 + SC\-0\/audio_in\ 2 + DELAY\/audio_in\ 1 + DELAY\/audio_in\ 2 + DIST\/audio_in\ 1 + DIST\/audio_in\ 2 + + + playback_1 + playback_2 + playback_1 + playback_2 + playback_1 + playback_2 + + + Master\/audio_in\ 1 + Master\/audio_in\ 2 + Master\/audio_in\ 1 + Master\/audio_in\ 2 + Master\/audio_in\ 1 + Master\/audio_in\ 2 + Master\/audio_in\ 1 + Master\/audio_in\ 2 + Master\/audio_in\ 1 + Master\/audio_in\ 2 + Master\/audio_in\ 1 + Master\/audio_in\ 2 + Master\/audio_in\ 1 + Master\/audio_in\ 2 + + + SC\-0\/audio_in\ 1 + SC\-0\/audio_in\ 2 + + + physical_audio_input_monitor_enable + Audio\ 1\/audio_in\ 1 + physical_audio_input_monitor_enable + Audio\ 2\/audio_in\ 1 + physical_audio_input_monitor_enable + Audio\ 3\/audio_in\ 1 + physical_audio_input_monitor_enable + Audio\ 4\/audio_in\ 1 + + + physical_midi_input_monitor_enable + MTC\ in + MIDI\ Clock\ in + MMC\ in + Scene\ in + Cue\ Control\ in + + + Midi\ Through\ Port\-0 + + + UMC404HD\ 192k\ UMC404HD\ 192k\ MID + + + nanoKONTROL2\ nanoKONTROL2\ _\ CTR + + + MidiSport\ 4x4\ MIDI\ 1 + MidiSport\ 4x4\ MIDI\ 2 + MidiSport\ 4x4\ MIDI\ 3 + MidiSport\ 4x4\ MIDI\ 4 + + + in0 + in1 + in2 + in3 + in4 + in5 + in6 + in7 + in8 + + + in5 + in4 + in6 + in5 + in7 + in6 + in8 + in7 + + + in3 + + + in4 + in8 + + + in2 + + + + + + + + + + + + + + + + + diff --git a/runme.sh b/runme.sh new file mode 100755 index 0000000..20699b2 --- /dev/null +++ b/runme.sh @@ -0,0 +1,21 @@ +#!/bin/bash +PROJECT="radio_helsinki" +echo $PROJECT.sh +kill `pidof ardour-7.2.0~ds0` +killall -9 qjackctl jackd scserver sclang scide; +/usr/bin/jackd -u -dalsa -r44100 -p256 -n3 -D -Chw:U192k -Phw:U192k & +sleep 1; +# sclang -D gtr.scd & +scide sc/$PROJECT.scd & +sleep 3; +rm ardour/*.bak & +rm ardour/*.history & +ardour ardour/$PROJECT & +sleep 5; +jack/jack_plumbing.sh & +qjackctl & + + + + + diff --git a/sc/radio_helsinki.scd b/sc/radio_helsinki.scd new file mode 100644 index 0000000..db0d7b2 --- /dev/null +++ b/sc/radio_helsinki.scd @@ -0,0 +1,478 @@ +/*RUN*/ + +OSCFunc.trace(true); // Turn posting on +OSCFunc.trace(false); // Turn posting off + +Server.default.waitForBoot { // see below .bundle timings for starting synths etc. + + ~b1 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer + ~b2 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer + ~b3 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer + ~b4 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer + ~b5 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer + ~b6 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer + ~b7 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer + ~b8 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer + + // SETUP OSC -------------------------------------- + // Open port 57121 for ESP32 UDP OSC + thisProcess.openUDPPort(57121); + + // allocate busses + // create group order + ~micGrp = Group.new; + ~recGrp = Group.after(~micGrp); + ~smpGrp = Group.after(~recGrp); + + // Setup MIDI + MIDIClient.init; + MIDIIn.connectAll; + + //MIDIOut.connectAll; + + ~m32_1 = MIDIOut.newByName("MidiSport 4x4", "MidiSport 4x4 MIDI 1").latency_(Server.default.latency); + ~m32_2 = MIDIOut.newByName("MidiSport 4x4", "MidiSport 4x4 MIDI 2").latency_(Server.default.latency); + + g = Group.new; + + SynthDef.new(\mic, { + arg in=0, out=0, amp=1; + var sig; + sig = SoundIn.ar(in) * amp; + Out.ar(out, sig); + }).add; + + // mono buffer recorder ---------------------------- + // with loop and overdub modes ///////////////////// + ////////////////////////////////////////////////////////////////// + + SynthDef.new(\recBuf,{ + arg micIn=2, buf=~b1, t_trig=0, l=0, overdub=0; + var sig, ptr, chain, onsets; + + //ptr = In.ar(ptrIn, 1); + sig = SoundIn.ar(micIn, 1); + + // Onsets + //chain = FFT(LocalBuf(512), sig); + //onsets = Onsets.kr(chain, MouseX.kr(0,1), \rcomplex); + + RecordBuf.ar(sig, buf, + loop:l, + recLevel: 1, + preLevel: overdub, + doneAction: 0, trigger:t_trig, + offset: 0); + }).add; + + ////////////////////////////////////////////////////////////////// + + SynthDef.new(\sampler, { + arg out=0, ploc=0, rate=1, buf=~b1, pos=10000, trate=100, amp=0.7; + var sig, dur, clk, pan; + // trate = //MouseY.kr(8,120,1); + dur = 12 / trate; + clk = Impulse.kr(trate); + // pos = position + // pos = MouseX.kr(0,BufDur.kr(b)) + TRand.kr(0, 0.01, clk); + pan = WhiteNoise.kr(0.6); + sig = TGrains.ar(2, clk, buf, rate, pos, dur, pan, amp * 0.20); + Out.ar(out, sig); + }).add; + + ////////////////////////////////////////////////////////////////// + + SynthDef.new(\sine, { + | freq=1, atk=1, rel=1, pspd=0.1, ppos=0.8, release = 1, amp = 1, envc=0, gate = 0, beat=0.2 | + var bal, soundL, soundR, cc1, cc2, cc3; + var env = Env.new([0,1,0], [atk, rel], [1, -1]); //.circle(envc); TODO + var gen = EnvGen.kr(env, gate, doneAction: 2); + cc1 = \cc1.kr(0.5); // a control called cc1 + cc2 = \cc2.kr(0.5); // a control called cc1 + cc3 = \cc2.kr(0.5); // a control called cc1 + /* soundL = SinOsc.ar(freq + (cc1 + cc2 )); + soundR = SinOsc.ar(freq + (cc1 + cc2 + cc3 ));*/ + soundL = SinOsc.ar(freq + (cc1 + cc2 )); + soundR = SinOsc.ar(freq + beat ); + bal = Balance2.ar(soundL, soundR, FSinOsc.kr(pspd, ppos)); + Out.ar(0, bal * gen *0.1); + }).add; + + + ////////////////////////////////////////////////////////////// + // DOEPFER POCKET DIAL MIDI CONTROLLER + + ////MIDI FOR ENVELOPED BEATIMG SINE WAVES ////////////////////////////////////////////////////////////// + + ~rndp = 0; ~tune = 0; ~beat = 0; + MIDIFunc.cc({|val, ccNum, chan, src| + val.postln; + ~synth = Synth.new(\sine, [ \freq, exprand(50,4000), \atk, rrand(0.5,3), \rel, rrand(4,23), \ppos, rrand(-0.8,0.8), \pspd, rrand(0.02,0.3)], g); + ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; + }, ccNum:10, chan:0); + + MIDIFunc.cc({|val, ccNum, chan, src| + ~tune = ~tune + 1; + val.postln; + ~synth.set(\cc2, ~tune); + }, ccNum:10, chan:1); + + MIDIFunc.cc({|val, ccNum, chan, src| + val.postln; + ~beat = ~beat + 1; + //~synth.set(\cc3, ~beat); + g.set(\beat, rrand(0.02,3)) + }, ccNum:10, chan:8); + + MIDIFunc.cc({|val, ccNum, chan, src| + val.postln; + + ~synth = Synth.new(\sine, [ + \midinote, 33, + \harmonic, exprand(1,80).round, + \atk, rrand(0.5,3), \rel, rrand(4,23), + \ppos, rrand(-0.8,0.8)], g); + + ~synth.set(\gate, 0); + ~synth.set(\gate, 1, \cc1, ~rndp); + ~tune = 0; + ~beat = 0; + + }, ccNum:10, chan:9); + + + /////////////////////////// + + MIDIFunc.cc({|val, ccNum, chan, src| val.postln; ~s1.set( \rate, rrand(1,12)); }, ccNum:10, chan:2); + + ////////////////////////////////////////////////////////////// + ///// KORG NANO CONTROLER //////////////////////////////////// + + // MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; }); + + n = MIDIFunc.cc({arg ...args; args.postln}); // match any noteOn + + // GRANULAR SAMPLER CONTROLS (4 INSTANCES ) + + // SLIDERS + + MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("A: AMP" + val).postln; ~s1.set( \amp, val); }, ccNum:0, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("B: AMP" + val).postln; ~s2.set( \amp, val); }, ccNum:1, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("C: AMP" + val).postln; ~s3.set( \amp, val); }, ccNum:2, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("D: AMP" + val).postln; ~s4.set( \amp, val); }, ccNum:3, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("E: AMP" + val).postln; ~s5.set( \amp, val); }, ccNum:4, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("F: AMP" + val).postln; ~s6.set( \amp, val); }, ccNum:5, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("G: AMP" + val).postln; ~s7.set( \amp, val); }, ccNum:6, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("H: AMP" + val).postln; ~s8.set( \amp, val); }, ccNum:7, chan:2); + + // RANDOM RATE TRIGGERS ///////// + + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s1.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s1.set(\rate, 1); "A: trate random OFF".postln; } }, ccNum:32, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s2.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s2.set(\rate, 1); "B: trate random OFF".postln; } }, ccNum:33, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s3.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s3.set(\rate, 1); "C: trate random OFF".postln; } }, ccNum:34, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s4.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s4.set(\rate, 1); "D: trate random OFF".postln; } }, ccNum:35, chan:2); + + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s5.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s5.set(\rate, 1); "E: trate random OFF".postln; } }, ccNum:36, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s6.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s6.set(\rate, 1); "F: trate random OFF".postln; } }, ccNum:37, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s7.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s7.set(\rate, 1); "G: trate random OFF".postln; } }, ccNum:38, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s8.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s8.set(\rate, 1); "H: trate random OFF".postln; } }, ccNum:39, chan:2); + + // RANDOM TRATE TRIGGERS ///////// + + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s1.set(\trate, rrand(1,100)); "A: trate random!".postln; } { ~s1.set(\trate, 1); "A: trate random OFF".postln; } }, ccNum:48, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s2.set(\trate, rrand(1,100)); "B: trate random!".postln; } { ~s2.set(\trate, 1); "B: trate random OFF".postln; } }, ccNum:49, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s3.set(\trate, rrand(1,100)); "C: trate random!".postln; } { ~s3.set(\trate, 1); "C: trate random OFF".postln; } }, ccNum:50, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s4.set(\trate, rrand(1,100)); "D: trate random!".postln; } { ~s4.set(\trate, 1); "D: trate random OFF".postln; } }, ccNum:51, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s5.set(\trate, rrand(1,100)); "E: trate random!".postln; } { ~s5.set(\trate, 1); "E: trate random OFF".postln; } }, ccNum:52, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s6.set(\trate, rrand(1,100)); "F: trate random!".postln; } { ~s6.set(\trate, 1); "F: trate random OFF".postln; } }, ccNum:53, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s7.set(\trate, rrand(1,100)); "G: trate random!".postln; } { ~s7.set(\trate, 1); "G: trate random OFF".postln; } }, ccNum:54, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s8.set(\trate, rrand(1,100)); "H: trate random!".postln; } { ~s8.set(\trate, 1); "H: trate random OFF".postln; } }, ccNum:55, chan:2); + + // REC TRIGGERS ///////// + + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r1.set(\t_trig, 1, \micIn, 2, \buf, ~b1, \l, 0, \overdub, 0 ); "A: SAMPLING!".postln; }}, ccNum:64, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r2.set(\t_trig, 1, \micIn, 2, \buf, ~b2, \l, 0, \overdub, 0 ); "B: SAMPLING!".postln; }}, ccNum:65, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r3.set(\t_trig, 1, \micIn, 2, \buf, ~b3, \l, 0, \overdub, 0 ); "C: SAMPLING!".postln; }}, ccNum:66, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r4.set(\t_trig, 1, \micIn, 2, \buf, ~b4, \l, 0, \overdub, 0 ); "D: SAMPLING!".postln; }}, ccNum:67, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r5.set(\t_trig, 1, \micIn, 2, \buf, ~b5, \l, 0, \overdub, 0 ); "A: SAMPLING!".postln; }}, ccNum:68, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r6.set(\t_trig, 1, \micIn, 2, \buf, ~b6, \l, 0, \overdub, 0 ); "B: SAMPLING!".postln; }}, ccNum:69, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r7.set(\t_trig, 1, \micIn, 0, \buf, ~b7, \l, 0, \overdub, 0 ); "C: SAMPLING!".postln; }}, ccNum:70, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r8.set(\t_trig, 1, \micIn, 0, \buf, ~b8, \l, 0, \overdub, 0 ); "D: SAMPLING!".postln; }}, ccNum:71, chan:2); + + // POTS + + MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b1.duration); ("A: POS" + val.postln; ~s1.set( \pos, val))} , ccNum:16, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b2.duration); ("B: POS" + val.postln; ~s2.set( \pos, val))} , ccNum:17, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b3.duration); ("C: POS" + val.postln; ~s3.set( \pos, val))} , ccNum:18, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b4.duration); ("D: POS" + val.postln; ~s4.set( \pos, val))} , ccNum:19, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b5.duration); ("E: POS" + val.postln; ~s5.set( \pos, val))} , ccNum:20, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b6.duration); ("F: POS" + val.postln; ~s6.set( \pos, val))} , ccNum:21, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b7.duration); ("G: POS" + val.postln; ~s7.set( \pos, val))} , ccNum:22, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b8.duration); ("H: POS" + val.postln; ~s8.set( \pos, val))} , ccNum:23, chan:2); + + + ////////////////////////////////////////////////////////////// + // OSC SETUP AND CONFIG FOR TACTUS SINE WAVE PLAYER + ////////////////////////////////////////////////////////////// + + p = OSCFunc({ arg msg, time; + + postln(msg ); + + /// mesages from tetractys esp32 + // 3C:E9:0E:AD:E5:00 + // 48:E7:29:C3:EF:BC - tetractys + + if (msg[1] == '3C:E9:0E:AD:E2:E8') { // use esp32 mac address to determine source of msg + + postln("from tetratys esp32 " + msg ); + + w = case + + { msg[2] == 0} { + + postln("1" + msg[2] ); + ~synth = Synth.new(\sine, [ + \freq, exprand(50,400), + \atk, rrand(0.5,3), \rel, rrand(4,23), + \ppos, rrand(-0.8,0.8), + \pspd, rrand(0.02,0.3) + ], g); + + ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; + + postln("0" + msg[2] ); + + } + + { msg[2] == 1} { + + postln("1" + msg[2] ); + ~synth = Synth.new(\sine, [ + \freq, exprand(50,4000), + \atk, rrand(0.5,3), \rel, rrand(4,23), + \ppos, rrand(-0.8,0.8), + \pspd, rrand(0.02,0.3) + ], g); + + ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; + + } + + { msg[2] == 2} { + + postln("2" + msg[2] ); + + } + + { msg[2] == 3} { + + postln("3" + msg[2] ); + + } + + { msg[2] == 4} { + + postln("4" + msg[2] ); + + } + + { msg[2] == 5} { + + postln("5" + msg[2] ); + + } + + { msg[2] == 6} { + + postln("6" + msg[2] ); + + } + + + { msg[2] == 7} { + + postln("6" + msg[2] ); + ~synth = Synth.new(\sine, [ + \freq, exprand(4000,8000), + \atk, rrand(0.5,3), \rel, rrand(4,23), + \ppos, rrand(-0.8,0.8), + \pspd, rrand(0.02,0.3) + + ], g); + + //~synth.set([\gate, 0]); + // + ~synth.set(\gate, 0); + ~synth.set(\gate, 1, \cc1, ~rndp); + ~tune = 0; + ~beat = 0; + + } + }; + + },'/touch_121_A'); + +s.sync; +s.wait(2); + +}; // END OF WAIT FOR SERVER BOOT + + +( + +// recorders + +~r1 = Synth(\recBuf, [\micIn, 2, \buf, ~b1, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); +~r2 = Synth(\recBuf, [\micIn, 2, \buf, ~b2, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); +~r3 = Synth(\recBuf, [\micIn, 2, \buf, ~b3, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); +~r4 = Synth(\recBuf, [\micIn, 2, \buf, ~b4, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); +~r5 = Synth(\recBuf, [\micIn, 2, \buf, ~b5, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); +~r6 = Synth(\recBuf, [\micIn, 2, \buf, ~b6, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); +~r7 = Synth(\recBuf, [\micIn, 2, \buf, ~b7, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); +~r8 = Synth(\recBuf, [\micIn, 0, \buf, ~b8, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); + +// samplers + +~s1 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b1, \amp, 0 ], ~smpGrp); +~s2 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b2, \amp, 0 ], ~smpGrp); +~s3 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b3, \amp, 0 ], ~smpGrp); +~s4 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b4, \amp, 0 ], ~smpGrp); +~s5 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b5, \amp, 0 ], ~smpGrp); +~s6 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b6, \amp, 0 ], ~smpGrp); +~s7 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b7, \amp, 0 ], ~smpGrp); +~s8 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b8, \amp, 0 ], ~smpGrp); + + ); + + +/////////////////////////////////////////////////////////////////// + +// TODO make sure jack reconnects midi interface to mothers after server restart + +a = PatternProxy(Prand([1, 2, 3, 6,8,9 ], inf)); +b = PatternProxy(Pseq([4, 5, 6], inf)); + +~a1 = PatternProxy(Pseq([1, 2, 3], inf)); +~b1 = PatternProxy(Pseq([3, 4, 5,7], inf)); + + +( + +Pdefn(\m1, Pbind( \type, \midi, \midicmd, \noteOn, \midiout, ~m32_1, + \root, 0, \scale, Scale.minor, + \degree, a, + \octave, b, + //Pwrand([6,7,8], [25, 50, 25].normalizeSum, inf), + \dur, 1/2 +)).play; + + +Pdefn(\m2, Pbind( \type, \midi, \midicmd, \noteOn, \midiout, ~m32_2, + \root, 0, \scale, Scale.minor, + \degree, ~a1, + \octave, ~b1, + //Pwrand([6,7,8], [25, 50, 25].normalizeSum, inf), + \dur, 1/2 +)).play; + + +); + +a.source = Prand([4, 5,6,7], inf); +b.source = Prand([4, 5,6], inf); + +// +Pdef(\m1).play(quant: 4); +Pdef(\m2).play(quant: 4); + + +//Pdef(\m1).play(quant: 4); +Pdef(\m2).play(quant: 4); + + +a.source = Prand([4, 2, 3,1,7], inf); +~a1.source = Prand([4, 2, 3,1,7], inf); + +b.source = Pseq([6,8,5,7], inf); +~b1.source = Prand([4,3,5,7], inf); + +~b1.source = Prand([2,3,4], inf); + + + +b.source = Pseq([1, 2,3,4], inf); +b.source = Prand([1, 3, 4, 5], inf); +b.source = Prand([3, 5], inf); + +Pdef(\m1).stop; + +Pdef(\m1).stop; + + + + +// +// Pdef(\m2).play(quant: 4); // TOP MOTHER +// +// Pbindef(\m2, \octave, 6); +// +// +// Pbindef(\m2, \octave, 3); +// +// Pbindef(\m2, \octave, 3); +// +// +// + + + + +z = Pseq([ // START SEQUENCER + + Ppar( [~m1, ~m2], 8 ) // chromatic slides + +], 1 ).play(~t1, quant:1); + + +// CONTROLS ---------------------- + +c.play(); +z.pause; +z.stop; +c.start; +z.resume; + + + + + +~r1.set(\t_trig, 1, \micIn, 2, \buf, ~b1, \l, 1, \overdub, 0 ); "/////////// SAMPLING!".postln; +~r2.set(\t_trig, 1, \micIn, 2, \buf, ~b2, \l, 1, \overdub, 0 ); "/////////// SAMPLING!".postln; +~r3.set(\t_trig, 1, \micIn, 2, \buf, ~b3, \l, 1, \overdub, 0 ); "/////////// SAMPLING!".postln; +~r4.set(\t_trig, 1, \micIn, 2, \buf, ~b4, \l, 1, \overdub, 0 ); "/////////// SAMPLING!".postln; + +~s1.set( \pos, 4111); +~s1.set( \trate, rrand(1,1)); +~s1.set( \rate, exprand(0.4, 10)); + +~s2.set( \pos, 44111); +~s2.set( \trate, 0.1); +~s2.set( \rate, 1); + +~s3.set( \pos, 45511); +~s3.set( \trate, 1); +~s3.set( \rate, 0.25); + +~s1.free; + + + + + + + + + + + diff --git a/sc/radio_helsinki_PERFORM.scd b/sc/radio_helsinki_PERFORM.scd new file mode 100644 index 0000000..02cc62a --- /dev/null +++ b/sc/radio_helsinki_PERFORM.scd @@ -0,0 +1,55 @@ +// /*RUUUUUUN*/ + +( + +// record into buffers + +~r1 = Synth(\recBuf, [\micIn, 2, \buf, ~b1, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); +~r2 = Synth(\recBuf, [\micIn, 2, \buf, ~b2, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); +~r3 = Synth(\recBuf, [\micIn, 2, \buf, ~b3, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); +~r4 = Synth(\recBuf, [\micIn, 2, \buf, ~b4, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); +~r5 = Synth(\recBuf, [\micIn, 2, \buf, ~b5, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); +~r6 = Synth(\recBuf, [\micIn, 2, \buf, ~b6, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); +~r7 = Synth(\recBuf, [\micIn, 2, \buf, ~b7, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); +~r8 = Synth(\recBuf, [\micIn, 0, \buf, ~b8, \t_trig, 1, \l, 0, \overdub, 0], ~recGrp); + +// granulating sample players + +~s1 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b1, \amp, 0 ], ~smpGrp); +~s2 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b2, \amp, 0 ], ~smpGrp); +~s3 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b3, \amp, 0 ], ~smpGrp); +~s4 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b4, \amp, 0 ], ~smpGrp); +~s5 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b5, \amp, 0 ], ~smpGrp); +~s6 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b6, \amp, 0 ], ~smpGrp); +~s7 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b7, \amp, 0 ], ~smpGrp); +~s8 = Synth(\sampler, [ \pos, 0, \trate, 1, \buf, ~b8, \amp, 0 ], ~smpGrp); + + ); + +/////////////////////////////////////////////////////////////////// + +( + +~m32_1.allNotesOff(0); +~m32_2.allNotesOff(0); + +Pbindef(\m1, \type, \midi, \midicmd, \noteOn, \midiout, ~m32_1, \root, 0, \scale, Scale.minor, \degree, 0, \octave, 4, \dur, 1/4).play; +Pbindef(\m2, \type, \midi, \midicmd, \noteOn, \midiout, ~m32_2, \root, 0, \scale, Scale.minor, \degree, 0, \octave, 4, \dur, 1/4).play; + +Pbindef(\m1).stop; +Pbindef(\m2).stop; + +); + + + + +Pbindef(\a, \instrument, \sineSeq, \degree, Pseq([1, 2, 3, 4,5,6,7,8], inf), \gate, 1, \dur, 1/2, \sustain, 10).play; + +Pbindef(\a, \instrument, \sineSeq).stop; + + + + + + diff --git a/sc/radio_helsinki_SETUP.scd b/sc/radio_helsinki_SETUP.scd new file mode 100644 index 0000000..51e4657 --- /dev/null +++ b/sc/radio_helsinki_SETUP.scd @@ -0,0 +1,528 @@ +/*RUN*/ + +OSCFunc.trace(true); // Turn posting on +OSCFunc.trace(false); // Turn posting off + +// Setup MIDI + +MIDIClient.init; +MIDIIn.connectAll; + +Server.default.waitForBoot { // see below .bundle timings for starting synths etc. + + ~b1 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer + ~b2 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer + ~b3 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer + ~b4 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer + ~b5 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer + ~b6 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer + ~b7 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer + ~b8 = Buffer.alloc(s, s.sampleRate * 4, 1); // Allocate a 3 second mono buffer + + // SETUP OSC -------------------------------------- + // Open port 57121 for ESP32 UDP OSC + + thisProcess.openUDPPort(57121); + + // allocate busses ---------------------------- + + // create group order + + g = Group.new; + + ~micGrp = Group.new; + ~recGrp = Group.after(~micGrp); + ~smpGrp = Group.after(~recGrp); + + //MIDIOut.connectAll; + + ~m32_1 = MIDIOut.newByName("MidiSport 4x4", "MidiSport 4x4 MIDI 1").latency_(Server.default.latency); + ~m32_2 = MIDIOut.newByName("MidiSport 4x4", "MidiSport 4x4 MIDI 2").latency_(Server.default.latency); + + // SYNTH DEFS ////////////////////////////////////// + + SynthDef.new(\mic, { + arg in=0, out=0, amp=1; + var sig; + sig = SoundIn.ar(in) * amp; + Out.ar(out, sig); + }).add; + + // mono buffer recorder ----- with loop and overdub modes ////////////// + + SynthDef.new(\recBuf,{ + arg micIn=2, buf=~b1, t_trig=0, l=0, overdub=0; + var sig, ptr, chain, onsets; + + //ptr = In.ar(ptrIn, 1); + + sig = SoundIn.ar(micIn, 1); + + RecordBuf.ar(sig, buf, + loop:l, + recLevel: 1, + preLevel: overdub, + doneAction: 0, trigger:t_trig, + offset: 0); + }).add; + + ////////////////////////////////////////////////////////////////// + + SynthDef.new(\sampler, { + arg out=0, ploc=0, rate=1, buf=~b1, pos=10000, trate=100, amp=0.7; + var sig, dur, clk, pan; + // trate = //MouseY.kr(8,120,1); + dur = 12 / trate; + clk = Impulse.kr(trate); + // pos = position + // pos = MouseX.kr(0,BufDur.kr(b)) + TRand.kr(0, 0.01, clk); + pan = WhiteNoise.kr(0.6); + sig = TGrains.ar(2, clk, buf, rate, pos, dur, pan, amp * 0.20); + Out.ar(out, sig); + }).add; + + + SynthDef.new(\sine, { + | freq=1, atk=1, rel=1, pspd=0.1, ppos=0.8, release = 1, amp = 1, envc=0, gate = 0, beat=0.2 | + var bal, soundL, soundR, cc1, cc2, cc3; + var env = Env.new([0,1,0], [atk, rel], [1, -1]); //.circle(envc); TODO + var gen = EnvGen.kr(env, gate, doneAction: 2); + cc1 = \cc1.kr(0.5); // a control called cc1 + cc2 = \cc2.kr(0.5); // a control called cc1 + cc3 = \cc2.kr(0.5); // a control called cc1 + /* soundL = SinOsc.ar(freq + (cc1 + cc2 )); + soundR = SinOsc.ar(freq + (cc1 + cc2 + cc3 ));*/ + soundL = SinOsc.ar(freq + (cc1 + cc2 )); + soundR = SinOsc.ar(freq + beat ); + bal = Balance2.ar(soundL, soundR, FSinOsc.kr(pspd, ppos)); + Out.ar(0, bal * gen *0.1); + }).add; + + SynthDef("sineSeq", { arg out, freq, atk=0.1, sustain=1, amp=1, pan; + var env, u=1; + env = EnvGen.kr(Env.perc(atk, sustain), 1, doneAction: Done.freeSelf); + // 1.do { var d; d = exprand(1, 1); u = SinOsc.ar(d * 300, u, rrand(0.1,1.2) * d, 1) }; + Out.ar(out, Pan2.ar(SinOsc.ar(freq, 0, amp * env), pan)); + }).add; + + + ////////////////////////////////////////////////////////////// + // DOEPFER POCKET DIAL MIDI CONTROLLER + + ////MIDI FOR ENVELOPED BEATIMG SINE WAVES ////////////////////////////////////////////////////////////// + + ~rndp = 0; ~tune = 0; ~beat = 0; + MIDIFunc.cc({|val, ccNum, chan, src| + val.postln; + ~synth = Synth.new(\sine, [ \freq, exprand(50,4000), \atk, rrand(0.5,3), \rel, rrand(4,23), \ppos, rrand(-0.8,0.8), \pspd, rrand(0.02,0.3)], g); + ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; + }, ccNum:10, chan:0); + + MIDIFunc.cc({|val, ccNum, chan, src| + ~tune = ~tune + 1; + val.postln; + ~synth.set(\cc2, ~tune); + }, ccNum:10, chan:1); + + MIDIFunc.cc({|val, ccNum, chan, src| + val.postln; + ~synth = Synth.new(\sine, [ \freq, 440, \atk, rrand(2,3), \rel, rrand(4,23), \ppos, rrand(-0.8,0.8), \pspd, rrand(0.02,0.3)], g); + ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; + }, ccNum:10, chan:2); +/* + MIDIFunc.cc({|val, ccNum, chan, src| + val.postln; + ~synth = Synth.new(\sine, [ \freq, exprand(50,4000), \atk, rrand(0.5,3), \rel, rrand(4,23), \ppos, rrand(-0.8,0.8), \pspd, rrand(0.02,0.3)], g); + ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; + }, ccNum:10, chan:3);*/ + + MIDIFunc.cc({|val, ccNum, chan, src| + val.postln; + ~beat = ~beat + 1; + //~synth.set(\cc3, ~beat); + g.set(\beat, rrand(0.02,3)) + }, ccNum:10, chan:8); + + MIDIFunc.cc({|val, ccNum, chan, src| + val.postln; + + ~synth = Synth.new(\sine, [ + \midinote, 33, + \harmonic, exprand(1,80).round, + \atk, rrand(0.5,3), \rel, rrand(4,23), + \ppos, rrand(-0.8,0.8)], g); + + ~synth.set(\gate, 0); + ~synth.set(\gate, 1, \cc1, ~rndp); + ~tune = 0; + ~beat = 0; + + }, ccNum:10, chan:9); + + + /////////////////////////////////////////////////////////////////// + + MIDIFunc.cc({|val, ccNum, chan, src| val.postln; ~s1.set( \rate, rrand(1,12)); }, ccNum:10, chan:2); + + + ///// KORG NANO CONTROLER //////////////////////////////////// + + // MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; }); + + n = MIDIFunc.cc({arg ...args; args.postln}); // match any noteOn + + // GRANULAR SAMPLER CONTROLS (4 INSTANCES ) + + // SLIDERS + + MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("A: AMP" + val).postln; ~s1.set( \amp, val); }, ccNum:0, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("B: AMP" + val).postln; ~s2.set( \amp, val); }, ccNum:1, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("C: AMP" + val).postln; ~s3.set( \amp, val); }, ccNum:2, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("D: AMP" + val).postln; ~s4.set( \amp, val); }, ccNum:3, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("E: AMP" + val).postln; ~s5.set( \amp, val); }, ccNum:4, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("F: AMP" + val).postln; ~s6.set( \amp, val); }, ccNum:5, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("G: AMP" + val).postln; ~s7.set( \amp, val); }, ccNum:6, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = val/128; ("H: AMP" + val).postln; ~s8.set( \amp, val); }, ccNum:7, chan:2); + + // RANDOM RATE TRIGGERS ///////// + + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s1.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s1.set(\rate, 1); "A: trate random OFF".postln; } }, ccNum:32, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s2.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s2.set(\rate, 1); "B: trate random OFF".postln; } }, ccNum:33, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s3.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s3.set(\rate, 1); "C: trate random OFF".postln; } }, ccNum:34, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s4.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s4.set(\rate, 1); "D: trate random OFF".postln; } }, ccNum:35, chan:2); + + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s5.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s5.set(\rate, 1); "E: trate random OFF".postln; } }, ccNum:36, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s6.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s6.set(\rate, 1); "F: trate random OFF".postln; } }, ccNum:37, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s7.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s7.set(\rate, 1); "G: trate random OFF".postln; } }, ccNum:38, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s8.set(\rate, rrand(0.5,10)); "A: rate random!".postln; } { ~s8.set(\rate, 1); "H: trate random OFF".postln; } }, ccNum:39, chan:2); + + // RANDOM TRATE TRIGGERS ///////// + + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s1.set(\trate, rrand(1,100)); "A: trate random!".postln; } { ~s1.set(\trate, 1); "A: trate random OFF".postln; } }, ccNum:48, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s2.set(\trate, rrand(1,100)); "B: trate random!".postln; } { ~s2.set(\trate, 1); "B: trate random OFF".postln; } }, ccNum:49, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s3.set(\trate, rrand(1,100)); "C: trate random!".postln; } { ~s3.set(\trate, 1); "C: trate random OFF".postln; } }, ccNum:50, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s4.set(\trate, rrand(1,100)); "D: trate random!".postln; } { ~s4.set(\trate, 1); "D: trate random OFF".postln; } }, ccNum:51, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s5.set(\trate, rrand(1,100)); "E: trate random!".postln; } { ~s5.set(\trate, 1); "E: trate random OFF".postln; } }, ccNum:52, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s6.set(\trate, rrand(1,100)); "F: trate random!".postln; } { ~s6.set(\trate, 1); "F: trate random OFF".postln; } }, ccNum:53, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s7.set(\trate, rrand(1,100)); "G: trate random!".postln; } { ~s7.set(\trate, 1); "G: trate random OFF".postln; } }, ccNum:54, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~s8.set(\trate, rrand(1,100)); "H: trate random!".postln; } { ~s8.set(\trate, 1); "H: trate random OFF".postln; } }, ccNum:55, chan:2); + + // REC TRIGGERS ///////// + + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r1.set(\t_trig, 1, \micIn, 2, \buf, ~b1, \l, 0, \overdub, 0 ); "A: SAMPLING!".postln; }}, ccNum:64, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r2.set(\t_trig, 1, \micIn, 2, \buf, ~b2, \l, 0, \overdub, 0 ); "B: SAMPLING!".postln; }}, ccNum:65, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r3.set(\t_trig, 1, \micIn, 2, \buf, ~b3, \l, 0, \overdub, 0 ); "C: SAMPLING!".postln; }}, ccNum:66, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r4.set(\t_trig, 1, \micIn, 2, \buf, ~b4, \l, 0, \overdub, 0 ); "D: SAMPLING!".postln; }}, ccNum:67, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r5.set(\t_trig, 1, \micIn, 2, \buf, ~b5, \l, 0, \overdub, 0 ); "A: SAMPLING!".postln; }}, ccNum:68, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r6.set(\t_trig, 1, \micIn, 2, \buf, ~b6, \l, 0, \overdub, 0 ); "B: SAMPLING!".postln; }}, ccNum:69, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r7.set(\t_trig, 1, \micIn, 0, \buf, ~b7, \l, 0, \overdub, 0 ); "C: SAMPLING!".postln; }}, ccNum:70, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| if (val==1){ ~r8.set(\t_trig, 1, \micIn, 0, \buf, ~b8, \l, 0, \overdub, 0 ); "D: SAMPLING!".postln; }}, ccNum:71, chan:2); + + // POTS + + MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b1.duration); ("A: POS" + val.postln; ~s1.set( \pos, val))} , ccNum:16, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b2.duration); ("B: POS" + val.postln; ~s2.set( \pos, val))} , ccNum:17, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b3.duration); ("C: POS" + val.postln; ~s3.set( \pos, val))} , ccNum:18, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b4.duration); ("D: POS" + val.postln; ~s4.set( \pos, val))} , ccNum:19, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b5.duration); ("E: POS" + val.postln; ~s5.set( \pos, val))} , ccNum:20, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b6.duration); ("F: POS" + val.postln; ~s6.set( \pos, val))} , ccNum:21, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b7.duration); ("G: POS" + val.postln; ~s7.set( \pos, val))} , ccNum:22, chan:2); + MIDIFunc.cc({|val, ccNum, chan, src| val = rrand(0, ~b8.duration); ("H: POS" + val.postln; ~s8.set( \pos, val))} , ccNum:23, chan:2); + + ////////////////////////////////////////////////////////////// + + // OSC SETUP AND CONFIG FOR TACTUS SINE WAVE PLAYER + + p = OSCFunc({ arg msg, time; + // postln(msg ); + if (msg[1] == '3C:E9:0E:AD:E2:E8') { // use esp32 mac address to determine source of msg + postln("from tetratys esp32 " + msg ); + w = case + + { msg[2] == 0} { + + postln("1" + msg[2] ); + ~synth = Synth.new(\sine, [ + \freq, exprand(50,400), + \atk, rrand(0.5,3), \rel, rrand(4,23), + \ppos, rrand(-0.8,0.8), + \pspd, rrand(0.02,0.3) + ], g); + + ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; + + postln("0" + msg[2] ); + + } + + { msg[2] == 1} { + + postln("1" + msg[2] ); + ~synth = Synth.new(\sine, [ + \freq, exprand(50,4000), + \atk, rrand(0.5,3), \rel, rrand(4,23), + \ppos, rrand(-0.8,0.8), + \pspd, rrand(0.02,0.3) + ], g); + + ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; + + } + + { msg[2] == 2} { + ~tfreq= [440,220,880,110, 55, 1760, 1760*2, 1760*3].choose; + postln("2; TUNING PITCH 440hz " + ~tfreq ); + ~synth = Synth.new(\sine, [ + \freq, ~tfreq, + \atk, rrand(2,3), \rel, rrand(4,23), + \ppos, rrand(-0.8,0.8), + \pspd, rrand(0.02,0.3) + ], g); + ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; + } + + { msg[2] == 3} { + + postln("1" + msg[2] + "chord [2]" ); + 2.do{ + ~synth = Synth.new(\sine, [ + \freq, exprand(50,4000), + \atk, rrand(0.5,3), \rel, rrand(4,23), + \ppos, rrand(-0.8,0.8), + \tune, rrand(-3.8,3.8), + \pspd, rrand(0.02,0.3) + ], g); + + ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; + }; + } + + { msg[2] == 4} { + + postln("1" + msg[2] + "chord [3]" ); + 3.do{ + ~synth = Synth.new(\sine, [ + \freq, exprand(50,4000), + \atk, rrand(0.5,3), \rel, rrand(4,23), + \ppos, rrand(-0.8,0.8), + \tune, rrand(-3.8,3.8), + \pspd, rrand(0.02,0.3) + ], g); + + ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; + }; + + } + + { msg[2] == 5} { + + postln("1" + msg[2] + "chord [4]" ); + 4.do{ + ~synth = Synth.new(\sine, [ + \freq, exprand(50,4000), + \atk, rrand(0.5,3), \rel, rrand(4,23), + \ppos, rrand(-0.8,0.8), + \tune, rrand(-3.8,3.8), + \pspd, rrand(0.02,0.3) + ], g); + + ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; + }; + + } + + { msg[2] == 6} { + + postln("6" + msg[2] + "4k - 10k Hz"); + ~synth = Synth.new(\sine, [ + \freq, exprand(400,1000), + \atk, rrand(0.05,0.1), \rel, rrand(2,10), + \ppos, rrand(-0.8,0.8), + \pspd, rrand(0.02,0.3) + + ], g); + ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; + } + + { msg[2] == 7} { + + postln("7" + msg[2] + "4k - 10k Hz"); + ~synth = Synth.new(\sine, [ + \freq, exprand(4000,10000), + \atk, rrand(0.5,3), \rel, rrand(4,23), + \ppos, rrand(-0.8,0.8), + \pspd, rrand(0.02,0.3) + + ], g); + ~synth.set(\gate, 0); ~synth.set(\gate, 1, \cc1, ~rndp); ~tune = 0; ~beat = 0; + + } + + // TACTUS A - $ CONTROLS + + { msg[2] == 8} { postln("8" + msg[2] + "4k - 10k Hz"); } + { msg[2] == 9} { postln("9" + msg[2] + "4k - 10k Hz"); } + + { msg[2] == 10} { postln("10" + msg[2] + "START SINE SEQUENCE"); + + Pbindef(\a, \instrument, \sineSeq,\scale, Scale.chromatic, + \degree, Pseq([0, 1, 2, 3, 4,5,6,7,8, 9 ,10,11 ], inf), + \octave, Prand([2, 3, 4,5,6,7,8], inf), \gate, 1, + \dur, Pwrand([4, 3, 2,1,1/2,1/4], [1,2,13,5,8,13].normalizeSum, inf), + \atk, Pwhite(0.01, 1), + \pan, Pwhite(-1, 1), + \sustain, Pwhite(0.2, 7.5) + ).play; + + } + { msg[2] == 11} { postln("11" + msg[2] + "STOP SINE SEQUENCE"); + Pbindef(\a, \instrument, \sineSeq).stop; + + } + }; + + },'/touch_121_A'); + + + /////////////////////////////////////////////////////////////////// + + MIDIFunc.cc({|val, ccNum, chan, src| + val = val%11; + w = case + { val == 0} { x = [0]; postln("M1 RANDOM ARP: " + x ); ~pseq1 = Prand(x, inf); } + { val == 1} { x = [0, 7]; postln("M1 RANDOM ARP: " + x ); ~pseq1 = Prand(x, inf); } + { val == 2} { x = [0, 7, 3]; postln("M1 RANDOM ARP: " + x ); ~pseq1 = Prand(x, inf); } + { val == 3} { x = [0, 7, 3 ,5]; postln("M1 RANDOM ARP: " + x ); ~pseq1 = Prand(x, inf); } + { val == 4} { x = [0, 7, 3 , 5, 9]; postln("M1 RANDOM ARP: " + x ); ~pseq1 = Prand(x, inf); } + { val == 5} { x = [0, 7, 3, 5, 9, 11]; postln("M1 RANDOM ARP: " + x ); ~pseq1 = Prand(x, inf); } + { val == 6} { x = [0, 7, 3, 5, 9, 11]; postln("M1 ARP: " + x ); ~pseq1 = Pseq(x, inf); } + { val == 7} { x = [0, 7, 3 , 5, 9]; postln("M1 ARP: " + x ); ~pseq1 = Pseq(x, inf); } + { val == 8} { x = [0, 7, 3 ,5]; postln("M1 ARP: " + x ); ~pseq1 = Pseq(x, inf); } + { val == 9} { x = [0, 7, 3]; postln("M1 ARP: " + x ); ~pseq1 = Pseq(x, inf); } + { val == 10} { x = [0, 7]; postln("M1 ARP: " + x ); ~pseq1 = Pseq(x, inf); } + }, ccNum:10, chan:4); + + MIDIFunc.cc({|val, ccNum, chan, src| + val = val%11; + w = case + { val == 0} { x = [0]; postln("M2 RANDOM ARP: " + x ); ~pseq2 = Prand(x, inf); } + { val == 1} { x = [0, 7]; postln("M2 RANDOM ARP: " + x ); ~pseq2 = Prand(x, inf); } + { val == 2} { x = [0, 7, 3]; postln("M2 RANDOM ARP: " + x ); ~pseq2 = Prand(x, inf); } + { val == 3} { x = [0, 7, 3 ,5]; postln("M2 RANDOM ARP: " + x ); ~pseq2 = Prand(x, inf); } + { val == 4} { x = [0, 7, 3 , 5, 9]; postln("M2 RANDOM ARP: " + x ); ~pseq2 = Prand(x, inf); } + { val == 5} { x = [0, 7, 3, 5, 9, 11]; postln("M2 RANDOM ARP: " + x ); ~pseq2 = Prand(x, inf); } + { val == 6} { x = [0, 7, 3, 5, 9, 11]; postln("M2 ARP: " + x ); ~pseq2 = Pseq(x, inf); } + { val == 7} { x = [0, 7, 3 , 5, 9]; postln("M2 ARP: " + x ); ~pseq2 = Pseq(x, inf); } + { val == 8} { x = [0, 7, 3 ,5]; postln("M2 ARP: " + x ); ~pseq2 = Pseq(x, inf); } + { val == 9} { x = [0, 7, 3]; postln("M2 ARP: " + x ); ~pseq2 = Pseq(x, inf); } + { val == 10} { x = [0, 7]; postln("M2 ARP: " + x ); ~pseq2 = Pseq(x, inf); } + }, ccNum:10, chan:12); + + + // set the central octave / register + + MIDIFunc.cc({|val, ccNum, chan, src| + val = val%6; + w = case + { val == 0} { x = [0]; postln("M1 OCTAVE: " + x ); ~poct1 = Prand(x, inf); } + { val == 1} { x = [0, 1]; postln("M1 OCTAVE: " + x ); ~poct1 = Prand(x, inf); } + { val == 2} { x = [0, 1, 2]; postln("M1 OCTAVE: " + x ); ~poct1 = Prand(x, inf); } + { val == 3} { x = [0, 1, 2]; postln("M1 OCTAVE: " + x ); ~poct1 = Prand(x, inf); } + { val == 4} { x = [0, 1, 2, 3]; postln("M1 OCTAVE: " + x ); ~poct1 = Prand(x, inf); } + { val == 5} { x = [0, 1, 2, 3, 4]; postln("M1 OCTAVE: " + x ); ~poct1 = Prand(x, inf); } + }, ccNum:10, chan:5); + + MIDIFunc.cc({|val, ccNum, chan, src| + val = val%6; + + w = case + + { val == 0} { x = [0]; postln("M1 OCTAVE: " + x ); ~poct2 = Prand(x, inf); } + { val == 1} { x = [0, 1]; postln("M1 OCTAVE: " + x ); ~poct2 = Prand(x, inf); } + { val == 2} { x = [0, 1, 2]; postln("M1 OCTAVE: " + x ); ~poct2 = Prand(x, inf); } + { val == 3} { x = [0, 1, 2]; postln("M1 OCTAVE: " + x ); ~poct2 = Prand(x, inf); } + { val == 4} { x = [0, 1, 2, 3]; postln("M1 OCTAVE: " + x ); ~poct2 = Prand(x, inf); } + { val == 5} { x = [0, 1, 2, 3, 4]; postln("M1 OCTAVE: " + x ); ~poct2 = Prand(x, inf); }; + }, ccNum:10, chan:13); + + + // set the central duration sequence + + MIDIFunc.cc({|val, ccNum, chan, src| + val = val%11; + + w = case + + { val == 0} { x = [1]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); } + { val == 1} { x = [1/2]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); } + { val == 2} { x = [1/3]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); } + { val == 3} { x = [1/4]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); } + { val == 4} { x = [1/5]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); } + { val == 5} { x = [1/5]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); } + { val == 6} { x = [1/6]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); } + { val == 7} { x = [1/7]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); } + { val == 8} { x = [1/8]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); } + { val == 9} { x = [1/16]; postln("M1 DURATIONS: " + x ); ~pdur1 = Pseq(x, inf); } + { val == 10} { x = [3, 2, 1, 1/2, 1/4, 1/8]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pwrand(x, [0.25, 0.5, 1, 3, 5, 8].normalizeSum, inf); }; + + }, ccNum:10, chan:6); + + MIDIFunc.cc({|val, ccNum, chan, src| + val = val%11; + + w = case + + { val == 0} { x = [1]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); } + { val == 1} { x = [1/2]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); } + { val == 2} { x = [1/3]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); } + { val == 3} { x = [1/4]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); } + { val == 4} { x = [1/5]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); } + { val == 5} { x = [1/5]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); } + { val == 6} { x = [1/6]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); } + { val == 7} { x = [1/7]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); } + { val == 8} { x = [1/8]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); } + { val == 9} { x = [1/16]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pseq(x, inf); } + { val == 10} { x = [3, 2, 1, 1/2, 1/4, 1/8]; postln("M1 DURATIONS: " + x ); ~pdur2 = Pwrand(x, [0.25, 0.5, 1, 3, 5, 8].normalizeSum, inf); }; + + }, ccNum:10, chan:14); + + + + ~poct1 = 3; ~oct1 = 0; + ~poct2 = 3; ~oct2 = 0; + + q = OSCFunc({ arg msg, time; + postln(msg ); + if (msg[1] == '3C:E9:0E:AD:E2:E8') { // use esp32 mac address to determine source of msg + postln("from tetratys esp32 " + msg ); + w = case + + // tactus changes + { msg[2] == 4} { postln("4" + msg[2] ); } + { msg[2] == 5} { + postln("5" + msg[2] ); Pbindef(\m1, \dur, ~pdur1);} // initiate selected duration set + { msg[2] == 6} { ~oct1 = ~oct1 + 1; ~oct1 = ~oct1%9; + postln("6" + msg[2] + ~oct1); Pbindef(\m1, \octave, ~poct1 + ~oct1);} // initiate selected octave set + { msg[2] == 7} { postln("7" + msg[2] ); Pbindef(\m1, \degree, ~pseq1);} // initiate selected pitch set + // tactus 4 playback controls + { msg[2] == 10} { postln("10" + msg[2] ); Pbindef(\m1).play; } // stop sequence + { msg[2] == 11} { postln("11" + msg[2] ); Pbindef(\m1).stop; } // start sequence + + // tactus changes + { msg[2] == 0} { postln("0" + msg[2] ); } + { msg[2] == 1} { postln("5" + msg[2] ); Pbindef(\m2, \dur, ~pdur2);} // initiate selected duration set + { msg[2] == 2} { + ~oct2 = ~oct2 + 1; ~oct2 = ~oct2%9; + postln("2" + msg[2] + ~oct2); Pbindef(\m2, \octave, ~poct2 + ~oct2);} // initiate selected octave set} // initiate selected octave set + { msg[2] == 3} { postln("3" + msg[2] ); Pbindef(\m2, \degree, ~pseq2); } // initiate selected pitch set + // tactus 4 playback controls + { msg[2] == 8} { postln("8" + msg[2] ); Pbindef(\m2).play; } // stop sequence + { msg[2] == 9} { postln("9" + msg[2] ); Pbindef(\m2).stop; }; // start sequence + + }},'/touch_121_B'); + + + + + +}; // END OF WAIT FOR SERVER BOOT