mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-14 23:28:30 +00:00
155 lines
6.3 KiB
Plaintext
155 lines
6.3 KiB
Plaintext
---
|
|
title: Csound
|
|
layout: ../../layouts/MainLayout.astro
|
|
---
|
|
|
|
import { MiniRepl } from '../../docs/MiniRepl';
|
|
import { JsDoc } from '../../docs/JsDoc';
|
|
import Colors from '../../docs/Colors.jsx';
|
|
|
|
# Using CSound with Strudel
|
|
|
|
🧪 Strudel has experimental support for csound, using [@csound/browser](https://www.npmjs.com/package/@csound/browser).
|
|
|
|
## Importing .orc files
|
|
|
|
To use existing csound instruments, you can load and use an orc file from an URL like this:
|
|
|
|
<MiniRepl
|
|
client:only="react"
|
|
tune={`// livecode.orc by Steven Yi
|
|
await loadOrc('github:kunstmusik/csound-live-code/master/livecode.orc')
|
|
note("c a f e").csound('FM1')
|
|
`}
|
|
/>
|
|
|
|
Note that the above url uses the `github:` shortcut, which resolves to the raw file on github, but you can use any URL you like.
|
|
|
|
The awesome [`livecode.orc by Steven Yi`](https://github.com/kunstmusik/csound-live-code) comes packed with many sounds ready for use:
|
|
|
|
<MiniRepl
|
|
client:only="react"
|
|
tune={`// livecode.orc by Steven Yi
|
|
await loadOrc('github:kunstmusik/csound-live-code/master/livecode.orc')
|
|
note("c a f e").csound(cat(
|
|
"Sub1", // Substractive Synth, 3osc
|
|
"Sub2", // Subtractive Synth, two saws, fifth freq apart
|
|
"Sub3", // Subtractive Synth, three detuned saws, swells in
|
|
"Sub4", // Subtractive Synth, detuned square/saw, stabby. Nice as a lead in octave 2, nicely grungy in octave -2, -1
|
|
"Sub5", // Subtractive Synth, detuned square/triangle
|
|
"Sub6", // Subtractive Synth, saw, K35 filters
|
|
"Sub7", // Subtractive Synth, saw + tri, K35 filters
|
|
"Sub8", // Subtractive Synth, square + saw + tri, diode ladder filter
|
|
"SynBrass", // SynthBrass subtractive synth
|
|
"SynHarp", // Synth Harp subtracitve Synth
|
|
"SSaw", // SuperSaw sound using 9 bandlimited saws (3 sets of detuned saws at octaves)
|
|
"Mode1", // Modal Synthesis Instrument: Percussive/organ-y sound
|
|
"Plk", // Pluck sound using impulses, noise, and waveguides
|
|
"Organ1", // Wavetable Organ sound using additive synthesis
|
|
"Organ2", // Organ sound based on M1 Organ 2 patch
|
|
"Organ3", // Wavetable Organ using Flute 8' and Flute 4', wavetable based on Claribel Flute http://www.pykett.org.uk/the\_tonal\_structure\_of\_organ\_flutes.htm
|
|
"Bass", // Subtractive Bass sound
|
|
"ms20_bass", // MS20-style Bass Sound
|
|
"VoxHumana", // VoxHumana Patch
|
|
"FM1", // FM 3:1 C:M ratio, 2->0.025 index, nice for bass
|
|
"Noi", // Filtered noise, exponential envelope
|
|
"Wobble", // Wobble patched based on Jacob Joaquin's "Tempo-Synced Wobble Bass"
|
|
"Sine", // Simple Sine-wave instrument with exponential envelope
|
|
"Square", // Simple Square-wave instrument with exponential envelope
|
|
"Saw", // Simple Sawtooth-wave instrument with exponential envelope
|
|
"Squine1", // Squinewave Synth, 2 osc
|
|
"Form1", // Formant Synth, buzz source, soprano ah formants
|
|
"Mono", // Monophone synth using sawtooth wave and 4pole lpf. Use "start("Mono") to run the monosynth, then use MonoNote instrument to play the instrument.
|
|
"MonoNote", // Note playing instrument for Mono synth. Be careful to use this and not try to create multiple Mono instruments!
|
|
"Click", // Bandpass-filtered impulse glitchy click sound. p4 = center frequency (e.g., 3000, 6000)
|
|
"NoiSaw", // Highpass-filtered noise+saw sound. Use NoiSaw.cut channel to adjust cutoff.
|
|
"Clap", // Modified clap instrument by Istvan Varga (clap1.orc)
|
|
"BD", // Bass Drum - From Iain McCurdy's TR-808.csd
|
|
"SD", // Snare Drum - From Iain McCurdy's TR-808.csd
|
|
"OHH", // Open High Hat - From Iain McCurdy's TR-808.csd
|
|
"CHH", // Closed High Hat - From Iain McCurdy's TR-808.csd
|
|
"HiTom", // High Tom - From Iain McCurdy's TR-808.csd
|
|
"MidTom", // Mid Tom - From Iain McCurdy's TR-808.csd
|
|
"LowTom", // Low Tom - From Iain McCurdy's TR-808.csd
|
|
"Cymbal", // Cymbal - From Iain McCurdy's TR-808.csd
|
|
"Rimshot", // Rimshot - From Iain McCurdy's TR-808.csd
|
|
"Claves", // Claves - From Iain McCurdy's TR-808.csd
|
|
"Cowbell", // Cowbell - From Iain McCurdy's TR-808.csd
|
|
"Maraca", // Maraca - from Iain McCurdy's TR-808.csd
|
|
"HiConga", // High Conga - From Iain McCurdy's TR-808.csd
|
|
"MidConga", // Mid Conga - From Iain McCurdy's TR-808.csd
|
|
"LowConga", // Low Conga - From Iain McCurdy's TR-808.csd
|
|
))`}
|
|
/>
|
|
|
|
## Writing your own instruments
|
|
|
|
You can define your own instrument(s) with `loadCsound` like this:
|
|
|
|
<MiniRepl
|
|
client:only="react"
|
|
tune={`await loadCsound\`
|
|
instr CoolSynth
|
|
iduration = p3
|
|
ifreq = p4
|
|
igain = p5
|
|
ioct = octcps(ifreq)
|
|
|
|
kpwm = oscili(.05, 8)
|
|
asig = vco2(igain, ifreq, 4, .5 + kpwm)
|
|
asig += vco2(igain, ifreq * 2)
|
|
|
|
idepth = 2
|
|
acut = transegr:a(0, .005, 0, idepth, .06, -4.2, 0.001, .01, -4.2, 0) ; filter envelope
|
|
asig = zdf_2pole(asig, cpsoct(ioct + acut + 2), 0.5)
|
|
|
|
iattack = .01
|
|
isustain = .5
|
|
idecay = .1
|
|
irelease = .1
|
|
asig *= linsegr:a(0, iattack, 1, idecay, isustain, iduration, isustain, irelease, 0)
|
|
|
|
out(asig, asig)
|
|
|
|
endin\`
|
|
|
|
"<0 2 [4 6](3,4,2) 3\*2>"
|
|
.off(1/4, add(2))
|
|
.off(1/2, add(6))
|
|
.scale('D minor')
|
|
.note()
|
|
.csound('CoolSynth')`}
|
|
/>
|
|
|
|
## Parameters
|
|
|
|
The `.csound` function sends the following p values:
|
|
|
|
| | |
|
|
| --- | -------------------------------- |
|
|
| p1 | instrument name e.g. `CoolSynth` |
|
|
| p2 | time offset, when it should play |
|
|
| p3 | the duration of the event / hap |
|
|
| p4 | frequency in Hertz |
|
|
| p5 | normalized `gain`, 0-1 |
|
|
|
|
There is an alternative `.csoundm` function with a different flavor:
|
|
|
|
| | |
|
|
| --- | --------------------------------- |
|
|
| p4 | midi key number, unrounded, 0-127 |
|
|
| p5 | midi velocity, 0-127 |
|
|
|
|
In both cases, p4 is derived from the value of `freq` or `note`.
|
|
|
|
## Limitations / Future Plans
|
|
|
|
Apart from the above listed p values, no other parameter can be patterned so far.
|
|
This also means that [audio effects](./learn/effects) will not work.
|
|
In the future, the integration could be improved by passing all patterned control parameters to the csound instrument.
|
|
This could work by a unique [channel](https://kunstmusik.github.io/icsc2022-csound-web/tutorial2-interacting-with-csound/#step-4---writing-continuous-data-channels)
|
|
for each value. Channels could be read [like this](https://github.com/csound/csound/blob/master/Android/CsoundForAndroid/CsoundAndroidExamples/src/main/res/raw/multitouch_xy.csd).
|
|
Also, it might make sense to have a standard library of csound instruments for strudel's effects.
|
|
|
|
Now, let's dive into the [Functional JavaScript API](/functions/intro)
|