Files
strudel/website/src/pages/learn/csound.mdx
T
Ethan Crawford 4747fab4ed Remove outdated continuation link
Previously, the docs were designed to work as a series of consecutively read
documents.
This linear flow is no longer intended, and as such the link at the end of the
csound document has become obsolete. This commit removes it, as suggested by a
member of the dev team.
2026-05-15 17:24:10 +08:00

153 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.