diff --git a/README.md b/README.md index 8b38331..c479b78 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ compilation strategy / graph format based on ## examples - [acid machine + drum thing](https://felixroos.github.io/kabelsalat/#Ly8gbWF4aW1lY2IgLSB0aGUgbGl0dGxlIGFjaWQgbWFjaGluZSB0aGF0IGNvdWxkCi8vICsgbWF4aW1lY2IgZHJ1bSBtYWNoaW5lCi8vIGNvZGUgYnkgZnJvb3MKLy8gbm9pc2VjcmFmdCAtPiBrYWJlbHNhbGF0Ci8vIGh0dHBzOi8vbm9pc2VjcmFmdC5hcHAvNDcKCmxldCBraWNrID0gZ2F0ZSA9PiBnYXRlLmFkc3IoMCwuMTEsMCwuMTEpCiAgLmFwcGx5KGVudiA9PiBlbnYubXVsKGVudikKICAgIC5tdWwoMTU4KSAvLyBmcmVxdWVuY3kgcmFuZ2UKICAgIC5zaW5lKGVudikKICAgIC5kaXN0b3J0KC44NSkKICApCgpsZXQgc25hcmUgPSBnYXRlID0+IGdhdGUuYWRzcigwLC4xMSwuMSwuMSkKICAubXVsKG5vaXNlKCkpLmZpbHRlciguNzgsLjI5KQoKbGV0IGMgPSBjbG9jaygxNjApCmxldCBub3RlcyA9IGMuY2xvY2tkaXYoOCkKLnNlcSgyNywyNywzOSw1MSwwLDAsMjcsMjcsNDIsMjcsNDAsMCwzMSwzMSw1Niw1MSkKCmxldCBlbnYgPSBub3Rlcy5hZHNyKDAsLjMsLjM0LC41OSkKCm5vdGVzCi5hcHBseTIoaG9sZCkgLy8gaG9sZCBmcmVxIGFib3ZlIDBzCi5taWRpbm90ZSgpCi5zbGlkZSgKICBzaW5lKC4yMSkucmFuZ2UoMCwxKQopCi5wdWxzZSguNDgpCi5tdWwoZW52KQouZmlsdGVyKAogIGVudi5tdWwoc2luZSguMDkpLnJhbmdlKC41NSwxKSksIC8vIGN1dG9mZgogIHNpbmUoLjIyKS5yYW5nZSgwLC4zNSkgLy8gcmVzCikKLmRpc3RvcnQoCiAgc2luZSguMTgpLnJhbmdlKDAsLjg1KQopCi5tdWwoMC41KQoubXVsKGMuY2xvY2tkaXYoMTYpLnNlcSguMjUsMSkpIC8vIHNpZGVjaGFpbgouYWRkKGMuY2xvY2tkaXYoMzIpLnNlcSgxLDEpLmFwcGx5KGtpY2spKQouYWRkKGMuY2xvY2tkaXYoMzIpLnNlcSgwLDEpLmFwcGx5KHNuYXJlKSkKLm91dCgpCg==) -- [plucky feedback delay](https://felixroos.github.io/kabelsalat/#bGV0IGZyZXEgPSBjbG9jaygxNTApLmNsb2NrZGl2KDMyKQouc2VxKDY0LDAsMCw2NywwLDAsNjIsMCkKCmxldCBlbnYgPSBmcmVxLmFkc3IoLjAxLHNpbmUoLjEpLnJhbmdlKC4xLC4zKSwuNSkubXVsKC43NSkKCmZyZXEuYXBwbHkyKGhvbGQpCgoubWlkaW5vdGUoKQouc2F3KC40KQouZmlsdGVyKAogIHNpbmUoLjEpLnJhbmdlKC43LC44KS5tdWwoZW52KSwgCiAgLy9lbnYuZGl2KDIpCikKLy8uZGlzdG9ydChzaW5lKC4wMikucmFuZ2UoMCwuMSkpLm11bCguNSkKLm11bChlbnYpCi5hZGQoeD0+eC5kZWxheShzaW5lKC4wMykucmFuZ2UoLjEsLjUpKS5tdWwoLjkpKQoubXVsKC41KQoub3V0KCk=) +- [plucky feedback delay](https://felixroos.github.io/kabelsalat/#Ly8gbGV0J3MgY3JlYXRlIHNvbWUgbm90ZXMKbGV0IG5vdGUgPSBjbG9jaygxNTApIC8vIGNsb2NrIGF0IDE1MGJwbQouY2xvY2tkaXYoMzIpIC8vIGRpdmlkZSBjbG9jayBieSAzMgouc2VxKDY0LDAsMCw2NywwLDAsNjIsMCkgLy8gdXNlIGNsb2NrIGZvciBzZXF1ZW5jZQoKLy8gdXNlIHRoZSBub3RlcyB0byB0cmlnZ2VyIGFuIGVudmVsb3BlCmxldCBlbnYgPSBub3RlCi5hZHNyKAogIC4wMSwgLy8gYXR0YWNrCiAgc2luZSguMSkucmFuZ2UoLjEsIC4zKSwgLy8gbW9kdWxhdGVkIGRlY2F5CiAgLjUgLy8gc3VzdGFpbgopCi5tdWwoLjc1KSAvLyBldmVsb3BlIGFtb3VudAoKbm90ZQouaG9sZChub3RlKSAvLyBob2xkIG5vdGVzIGFib3ZlIHplcm9lcwoubWlkaW5vdGUoKSAvLyBjb252ZXJ0IG1pZGkgbnVtYmVycyB0byBmcmVxCi5wdWxzZSguMikgLy8gcHVsc2Ugd2F2ZSB3aXRoIC4yIHdpZHRoCi5maWx0ZXIoCiAgc2luZSguMSkucmFuZ2UoLjcsLjgpLm11bChlbnYpLCAvLyBtb2R1bGF0ZWQgY3V0b2ZmCiAgZW52Lm11bCguNSkgLy8gcmVzb25hbmNlIHdpdGggZW52ZWxvcGUKKQoubXVsKGVudikgLy8gYW1wbGl0dWRlIGVudmVsb3BlCi5hZGQoCiAgLy8gZmVlZGJhY2sgZGVsYXkKICB4PT54LmRlbGF5KHNpbmUoLjAzKS5yYW5nZSguMSwuNSkpIC8vIG1vZHVsYXRlZCBkZWxheSB0aW1lCiAgICAgIC5tdWwoLjkpIC8vIGZlZWRiYWNrIGFtb3VudAopCi5tdWwoLjUpIC8vIG1hc3RlciBsZXZlbAoub3V0KCkgLy8gc2VuZCB0byBvdXRwdXQ=) - [drone](https://felixroos.github.io/kabelsalat/#Ly8gU3luYyBhbmQgVW5zeW5jIE15IEhhcm1vbmljcyAob3NjIG9ubHkpCi8vIGh0dHBzOi8vbm9pc2VjcmFmdC5hcHAvMTYxNQoKbGV0IGZyZXEgPSBwdWxzZSguMDIpLnNlcSg4MCkuc2xpZGUoMTAwKQpsZXQgb3NjID0gcHVsc2UoZnJlcSkKCmFkZCgKIHNpbmUoMC4wMSkucmFuZ2UoMSwxMikubXVsKGZyZXEpLnNpbmUob3NjKSwKIHNpbmUoMC4wMSkucmFuZ2UoMSwxMikubXVsKGZyZXEpLnNpbmUob3NjKSwKIHNpbmUoMC4wMikucmFuZ2UoMSwxMikubXVsKGZyZXEpLnNpbmUob3NjKSwKKQouc2xpZGUoLjAxKQouYWRkKHg9PnguZGVsYXkoLjI1KS5tdWwoLjYpKQoub3V0KCk=) - [midi bass](https://felixroos.github.io/kabelsalat/#CmxldCBlbnYgPSBtaWRpZ2F0ZSgpLmFkc3IoLjAxLC4yLC43NSkubXVsKC43NSkKCm1pZGlmcmVxKCkuZGl2KDQpCi8vZnJlcS5hcHBseTIoaG9sZCkubWlkaW5vdGUoKQouc2F3KC40KQouZmlsdGVyKAogIHNpbmUoLjEpLnJhbmdlKC43LC44KS5tdWwoZW52KSwgCiAgZW52LmRpdigyKQopCi8vLmRpc3RvcnQoc2luZSguMDIpLnJhbmdlKDAsLjEpKS5tdWwoLjUpCi5tdWwoZW52KQovLy5hZGQoeD0+eC5kZWxheShzaW5lKC4wMykucmFuZ2UoLjEsLjUpKS5tdWwoLjkpKQoubXVsKC41KQoub3V0KCk=) - [fm with feedback](https://felixroos.github.io/kabelsalat/#Ly8gYWRhcHRlZCBmcm9tIGh0dHBzOi8vd3d3LmNoYXJsaWUtcm9iZXJ0cy5jb20vZ2VuaXNoL3R1dG9yaWFsL2luZGV4Lmh0bWwjZm1tRmVlZGJhY2sKTm9kZS5wcm90b3R5cGUuZm0gPSBmdW5jdGlvbiAoYzJtID0gMSwgaW5kZXggPSAzLCBmYiA9IDAuMDUpIHsKICBsZXQgY2FycmllciwKICAgIGZyZXEgPSB0aGlzOwogIG11bCgoZmVlZGJhY2spID0+IHsKICAgIGNvbnN0IG1vZHVsYXRvciA9IGZlZWRiYWNrCiAgICAgIC5tdWwoZmIpCiAgICAgIC5hZGQobXVsKGZyZXEsIGMybSkpCiAgICAgIC5zaW5lKCkKICAgICAgLm11bChmcmVxLCBpbmRleCkKICAgICAgLmFkZChmZWVkYmFjaykKICAgICAgLm11bCgwLjUpOwogICAgY29uc3QgZW52ID0gZnJlcS5hZHNyKDAuMDAxLCAwLjUsIDAsIDApLmFwcGx5MihtdWwpLmFwcGx5MihtdWwpOwogICAgY2FycmllciA9IG1vZHVsYXRvci5hZGQoZnJlcSkuc2luZSgpLm11bChlbnYpOwogICAgcmV0dXJuIG1vZHVsYXRvci5tdWwoZW52KTsKICB9KTsKICByZXR1cm4gY2FycmllcjsKfTsKCnB1bHNlKDQpCiAgLnJhbmdlKDEsIDApCiAgLnNlcSg1NSwgMTEwLCAxNjUsIDIyMCwgMjc1LCAzMzAsIDM4NSwgNDQwKQogIC5mbSgxLCAzLCAwLjA1KQogIC5vdXQoKTsK) diff --git a/repl/src/index.jsx b/repl/src/index.jsx index 2cee4ae..6d80fdf 100644 --- a/repl/src/index.jsx +++ b/repl/src/index.jsx @@ -4,9 +4,36 @@ import "./graphviz"; import "./index.css"; import { SalatRepl } from "@kabelsalat/core"; -const tremoloSine = `sine(220) -.mul(sine(4).range(.5,1)) -.out()`; +const defaultPatch = `// let's create some notes +let note = clock(150) // clock at 150bpm +.clockdiv(32) // divide clock by 32 +.seq(64,0,0,67,0,0,62,0) // use clock for sequence + +// use the notes to trigger an envelope +let env = note +.adsr( + .01, // attack + sine(.1).range(.1, .3), // modulated decay + .5 // sustain +) +.mul(.75) // evelope amount + +note +.hold(note) // hold notes above zeroes +.midinote() // convert midi numbers to freq +.pulse(.2) // pulse wave with .2 width +.filter( + sine(.1).range(.7,.8).mul(env), // modulated cutoff + env.mul(.5) // resonance with envelope +) +.mul(env) // amplitude envelope +.add( + // feedback delay + x=>x.delay(sine(.03).range(.1,.5)) // modulated delay time + .mul(.9) // feedback amount +) +.mul(.5) // master level +.out() // send to output`; function App() { const repl = new SalatRepl(); @@ -16,7 +43,7 @@ function App() { urlCode = atob(urlCode); console.log("loaded code from url!"); } - const initialCode = urlCode || tremoloSine; + const initialCode = urlCode || defaultPatch; let [code, setCode] = createSignal(initialCode); let container; async function run() {