mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-24 12:08:28 +00:00
started german translation of workshop
This commit is contained in:
parent
f0faf5b42e
commit
61a9b01062
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
// import { getLanguageFromURL } from '../../languages';
|
import { getLanguageFromURL } from '../../languages';
|
||||||
import { SIDEBAR } from '../../config';
|
import { SIDEBAR } from '../../config';
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
@ -10,7 +10,7 @@ const { currentPage } = Astro.props as Props;
|
|||||||
const { BASE_URL } = import.meta.env;
|
const { BASE_URL } = import.meta.env;
|
||||||
let currentPageMatch = currentPage.slice(BASE_URL.length, currentPage.endsWith('/') ? -1 : undefined);
|
let currentPageMatch = currentPage.slice(BASE_URL.length, currentPage.endsWith('/') ? -1 : undefined);
|
||||||
|
|
||||||
const langCode = 'en'; // getLanguageFromURL(currentPage);
|
const langCode = getLanguageFromURL(currentPage) || 'en';
|
||||||
const sidebar = SIDEBAR[langCode];
|
const sidebar = SIDEBAR[langCode];
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@ -24,6 +24,7 @@ export type Frontmatter = {
|
|||||||
|
|
||||||
export const KNOWN_LANGUAGES = {
|
export const KNOWN_LANGUAGES = {
|
||||||
English: 'en',
|
English: 'en',
|
||||||
|
German: 'de',
|
||||||
} as const;
|
} as const;
|
||||||
export const KNOWN_LANGUAGE_CODES = Object.values(KNOWN_LANGUAGES);
|
export const KNOWN_LANGUAGE_CODES = Object.values(KNOWN_LANGUAGES);
|
||||||
|
|
||||||
@ -41,6 +42,16 @@ export const ALGOLIA = {
|
|||||||
export type SidebarLang = Record<string, { text: string; link: string }[]>;
|
export type SidebarLang = Record<string, { text: string; link: string }[]>;
|
||||||
export type Sidebar = Record<(typeof KNOWN_LANGUAGE_CODES)[number], SidebarLang>;
|
export type Sidebar = Record<(typeof KNOWN_LANGUAGE_CODES)[number], SidebarLang>;
|
||||||
export const SIDEBAR: Sidebar = {
|
export const SIDEBAR: Sidebar = {
|
||||||
|
de: {
|
||||||
|
Workshop: [
|
||||||
|
{ text: 'Intro', link: 'de/workshop/intro' },
|
||||||
|
{ text: 'Erste Sounds', link: 'de/workshop/first-sounds' },
|
||||||
|
{ text: 'Erste Töne', link: 'de/workshop/first-notes' },
|
||||||
|
{ text: 'Erste Effekte', link: 'de/workshop/first-effects' },
|
||||||
|
{ text: 'Pattern Effekte', link: 'de/workshop/pattern-effects' },
|
||||||
|
{ text: 'Rückblick', link: 'de/workshop/recap' },
|
||||||
|
],
|
||||||
|
},
|
||||||
en: {
|
en: {
|
||||||
Workshop: [
|
Workshop: [
|
||||||
{ text: 'Intro', link: 'workshop/intro' },
|
{ text: 'Intro', link: 'workshop/intro' },
|
||||||
|
|||||||
323
website/src/pages/de/workshop/first-effects.mdx
Normal file
323
website/src/pages/de/workshop/first-effects.mdx
Normal file
@ -0,0 +1,323 @@
|
|||||||
|
---
|
||||||
|
title: First Effects
|
||||||
|
layout: ../../../layouts/MainLayout.astro
|
||||||
|
---
|
||||||
|
|
||||||
|
import { MiniRepl } from '../../../docs/MiniRepl';
|
||||||
|
import QA from '@components/QA';
|
||||||
|
|
||||||
|
# First Effects
|
||||||
|
|
||||||
|
import Box from '@components/Box.astro';
|
||||||
|
|
||||||
|
We have sounds, we have notes, now let's look at effects!
|
||||||
|
|
||||||
|
## Some basic effects
|
||||||
|
|
||||||
|
**low-pass filter**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("<[c2 c3]*4 [bb1 bb2]*4 [f2 f3]*4 [eb2 eb3]*4>/2")
|
||||||
|
.sound("sawtooth").lpf(800)`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
lpf = **l**ow **p**ass **f**ilter
|
||||||
|
|
||||||
|
- Change lpf to 200. Notice how it gets muffled. Think of it as standing in front of the club with the door closed 🚪.
|
||||||
|
- Now let's open the door... change it to 5000. Notice how it gets brighter ✨🪩
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**pattern the filter**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("<[c2 c3]*4 [bb1 bb2]*4 [f2 f3]*4 [eb2 eb3]*4>/2")
|
||||||
|
.sound("sawtooth").lpf("200 1000")`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
- Try adding more values
|
||||||
|
- Notice how the pattern in lpf does not change the overall rhythm
|
||||||
|
|
||||||
|
We will learn how to automate with waves later...
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**vowel**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("<[c3,g3,e4] [bb2,f3,d4] [a2,f3,c4] [bb2,g3,eb4]>/2")
|
||||||
|
.sound("sawtooth").vowel("<a e i o>/2")`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
**gain**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`stack(
|
||||||
|
sound("hh*8").gain("[.25 1]*2"),
|
||||||
|
sound("bd*2,~ sd:1")
|
||||||
|
) `}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Rhythm is all about dynamics!
|
||||||
|
|
||||||
|
- Remove `.gain(...)` and notice how flat it sounds.
|
||||||
|
- Bring it back by undoing (ctrl+z)
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**stacks within stacks**
|
||||||
|
|
||||||
|
Let's combine all of the above into a little tune:
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`stack(
|
||||||
|
stack(
|
||||||
|
sound("hh*8").gain("[.25 1]*2"),
|
||||||
|
sound("bd*2,~ sd:1")
|
||||||
|
),
|
||||||
|
note("<[c2 c3]*4 [bb1 bb2]*4 [f2 f3]*4 [eb2 eb3]*4>/2")
|
||||||
|
.sound("sawtooth").lpf("200 1000"),
|
||||||
|
note("<[c3,g3,e4] [bb2,f3,d4] [a2,f3,c4] [bb2,g3,eb4]>/2")
|
||||||
|
.sound("sawtooth").vowel("<a e i o>/2")
|
||||||
|
) `}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Try to identify the individual parts of the stacks, pay attention to where the commas are.
|
||||||
|
The 3 parts (drums, bassline, chords) are exactly as earlier, just stacked together, separated by comma.
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**shape the sound with an adsr envelope**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("<c3 bb2 f3 eb3>")
|
||||||
|
.sound("sawtooth").lpf(600)
|
||||||
|
.attack(.1)
|
||||||
|
.decay(.1)
|
||||||
|
.sustain(.25)
|
||||||
|
.release(.2)`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Try to find out what the numbers do.. Compare the following
|
||||||
|
|
||||||
|
- attack: `.5` vs `0`
|
||||||
|
- decay: `.5` vs `0`
|
||||||
|
- sustain: `1` vs `.25` vs `0`
|
||||||
|
- release: `0` vs `.5` vs `1`
|
||||||
|
|
||||||
|
Can you guess what they do?
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
<QA q="Click to see solution" client:visible>
|
||||||
|
|
||||||
|
- attack: time it takes to fade in
|
||||||
|
- decay: time it takes to fade to sustain
|
||||||
|
- sustain: level after decay
|
||||||
|
- release: time it takes to fade out after note is finished
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</QA>
|
||||||
|
|
||||||
|
**adsr short notation**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("<c3 bb2 f3 eb3>")
|
||||||
|
.sound("sawtooth").lpf(600)
|
||||||
|
.adsr(".1:.1:.5:.2")
|
||||||
|
`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
**delay**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`stack(
|
||||||
|
note("~ [<[d3,a3,f4]!2 [d3,bb3,g4]!2> ~]")
|
||||||
|
.sound("gm_electric_guitar_muted"),
|
||||||
|
sound("<bd rim>").bank("RolandTR707")
|
||||||
|
).delay(".5")`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Try some `delay` values between 0 and 1. Btw, `.5` is short for `0.5`
|
||||||
|
|
||||||
|
What happens if you use `.delay(".8:.125")` ? Can you guess what the second number does?
|
||||||
|
|
||||||
|
What happens if you use `.delay(".8:.06:.8")` ? Can you guess what the third number does?
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**room aka reverb**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`n("<4 [3@3 4] [<2 0> ~@16] ~>/2")
|
||||||
|
.scale("D4:minor").sound("gm_accordion:2")
|
||||||
|
.room(2)`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Try different values!
|
||||||
|
|
||||||
|
Add a delay too!
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**little dub tune**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`stack(
|
||||||
|
note("~ [<[d3,a3,f4]!2 [d3,bb3,g4]!2> ~]")
|
||||||
|
.sound("gm_electric_guitar_muted").delay(.5),
|
||||||
|
sound("<bd rim>").bank("RolandTR707").delay(.5),
|
||||||
|
n("<4 [3@3 4] [<2 0> ~@16] ~>/2")
|
||||||
|
.scale("D4:minor").sound("gm_accordion:2")
|
||||||
|
.room(2).gain(.5)
|
||||||
|
)`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
Let's add a bass to make this complete:
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`stack(
|
||||||
|
note("~ [<[d3,a3,f4]!2 [d3,bb3,g4]!2> ~]")
|
||||||
|
.sound("gm_electric_guitar_muted").delay(.5),
|
||||||
|
sound("<bd rim>").bank("RolandTR707").delay(.5),
|
||||||
|
n("<4 [3@3 4] [<2 0> ~@16] ~>/2")
|
||||||
|
.scale("D4:minor").sound("gm_accordion:2")
|
||||||
|
.room(2).gain(.4),
|
||||||
|
n("<0 [~ 0] 4 [3 2] [0 ~] [0 ~] <0 2> ~>*2")
|
||||||
|
.scale("D2:minor")
|
||||||
|
.sound("sawtooth,triangle").lpf(800)
|
||||||
|
)`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Try adding `.hush()` at the end of one of the patterns in the stack...
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**pan**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`sound("numbers:1 numbers:2 numbers:3 numbers:4")
|
||||||
|
.pan("0 0.3 .6 1")
|
||||||
|
.slow(2)`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
**speed**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("bd rim").speed("<1 2 -1 -2>").room(.2)`} />
|
||||||
|
|
||||||
|
**fast and slow**
|
||||||
|
|
||||||
|
We can use `fast` and `slow` to change the tempo of a pattern outside of Mini-Notation:
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("bd*2,~ rim").slow(2)`} />
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Change the `slow` value. Try replacing it with `fast`.
|
||||||
|
|
||||||
|
What happens if you use a pattern like `.fast("<1 [2 4]>")`?
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
By the way, inside Mini-Notation, `fast` is `*` and slow is `/`.
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("[bd*2,~ rim]*<1 [2 4]>")`} />
|
||||||
|
|
||||||
|
## automation with signals
|
||||||
|
|
||||||
|
Instead of changing values stepwise, we can also control them with signals:
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("hh*16").gain(sine)`} punchcard />
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
The basic waveforms for signals are `sine`, `saw`, `square`, `tri` 🌊
|
||||||
|
|
||||||
|
Try also random signals `rand` and `perlin`!
|
||||||
|
|
||||||
|
The gain is visualized as transparency in the pianoroll.
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**setting a range**
|
||||||
|
|
||||||
|
By default, waves oscillate between 0 to 1. We can change that with `range`:
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("hh*8").lpf(saw.range(500, 2000))`} />
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
What happens if you flip the range values?
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
We can change the automation speed with slow / fast:
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("<[c2 c3]*4 [bb1 bb2]*4 [f2 f3]*4 [eb2 eb3]*4>/2")
|
||||||
|
.sound("sawtooth")
|
||||||
|
.lpf(sine.range(100, 2000).slow(8))`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
The whole automation will now take 8 cycles to repeat.
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
## Recap
|
||||||
|
|
||||||
|
| name | example |
|
||||||
|
| ----- | -------------------------------------------------------------------------------------------------- |
|
||||||
|
| lpf | <MiniRepl hideHeader client:visible tune={`note("c2 c3").s("sawtooth").lpf("<400 2000>")`} /> |
|
||||||
|
| vowel | <MiniRepl hideHeader client:visible tune={`note("c3 eb3 g3").s("sawtooth").vowel("<a e i o>")`} /> |
|
||||||
|
| gain | <MiniRepl hideHeader client:visible tune={`s("hh*8").gain("[.25 1]*2")`} /> |
|
||||||
|
| delay | <MiniRepl hideHeader client:visible tune={`s("bd rim").delay(.5)`} /> |
|
||||||
|
| room | <MiniRepl hideHeader client:visible tune={`s("bd rim").room(.5)`} /> |
|
||||||
|
| pan | <MiniRepl hideHeader client:visible tune={`s("bd rim").pan("0 1")`} /> |
|
||||||
|
| speed | <MiniRepl hideHeader client:visible tune={`s("bd rim").speed("<1 2 -1 -2>")`} /> |
|
||||||
|
| range | <MiniRepl hideHeader client:visible tune={`s("hh*16").lpf(saw.range(200,4000))`} /> |
|
||||||
388
website/src/pages/de/workshop/first-notes.mdx
Normal file
388
website/src/pages/de/workshop/first-notes.mdx
Normal file
@ -0,0 +1,388 @@
|
|||||||
|
---
|
||||||
|
title: First Notes
|
||||||
|
layout: ../../../layouts/MainLayout.astro
|
||||||
|
---
|
||||||
|
|
||||||
|
import { MiniRepl } from '@src/docs/MiniRepl';
|
||||||
|
import { midi2note } from '@strudel.cycles/core/';
|
||||||
|
import Box from '@components/Box.astro';
|
||||||
|
import QA from '@components/QA';
|
||||||
|
|
||||||
|
# Erste Töne
|
||||||
|
|
||||||
|
Jetzt schauen wir uns an wie man mit Tönen mit der `note` Funktion spielt.
|
||||||
|
|
||||||
|
## Zahlen und Noten
|
||||||
|
|
||||||
|
**Töne mit Zahlen**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("48 52 55 59").sound("piano")`}
|
||||||
|
claviature
|
||||||
|
claviatureLabels={Object.fromEntries(
|
||||||
|
Array(49)
|
||||||
|
.fill()
|
||||||
|
.map((_, i) => [midi2note(i + 36), i + 36]),
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Probiere verschiedene Zahlen aus!
|
||||||
|
|
||||||
|
Versuch auch mal Kommazahlen, z.B. 55.5 (beachte die englische Schreibweise von Kommazahlen mit "." anstatt ",")
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**Töne mit Buchstaben**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("c e g b").sound("piano")`}
|
||||||
|
claviature
|
||||||
|
claviatureLabels={Object.fromEntries(['c3', 'd3', 'e3', 'f3', 'g3', 'a3', 'b3'].map((n) => [n, n.split('')[0]]))}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Versuch verschiedene Buchstaben aus (a - g).
|
||||||
|
|
||||||
|
Findest du Melodien die auch gleichzeitig ein Wort sind? Tipp: ☕ 🙈 🧚
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**Vorzeichen**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("db eb gb ab bb").sound("piano")`}
|
||||||
|
claviature
|
||||||
|
claviatureLabels={Object.fromEntries(
|
||||||
|
['db3', 'eb3', 'gb3', 'ab3', 'bb3'].map((n) => [n, n.split('').slice(0, 2).join('')]),
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("c# d# f# g# a#").sound("piano")`}
|
||||||
|
claviature
|
||||||
|
claviatureLabels={Object.fromEntries(
|
||||||
|
['c#3', 'd#3', 'f#3', 'g#3', 'a#3'].map((n) => [n, n.split('').slice(0, 2).join('')]),
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
**Andere Oktaven**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("c2 e3 g4 b5").sound("piano")`}
|
||||||
|
claviature
|
||||||
|
claviatureLabels={Object.fromEntries(['c1', 'c2', 'c3', 'c4', 'c5'].map((n) => [n, n]))}
|
||||||
|
claviatureLabels={Object.fromEntries(
|
||||||
|
Array(49)
|
||||||
|
.fill()
|
||||||
|
.map((_, i) => [midi2note(i + 36), midi2note(i + 36)]),
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Probiere verschiedene Oktaven aus (1-8)
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
Normalerweise kommen Leute die keine Noten besser mit Zahlen anstatt mit Buchstaben zurecht.
|
||||||
|
Daher benutzen die folgenden Beispiele meistens Zahlen.
|
||||||
|
Später sehen wir auch noch ein paar Tricks die es uns erleichtern Töne zu spielen die zueinander passen.
|
||||||
|
|
||||||
|
## Den Sound verändern
|
||||||
|
|
||||||
|
Genau wie bei geräuschhaften Sounds können wir den Klang unserer Töne mit `sound` verändern:
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`note("36 43, 52 59 62 64").sound("piano")`} />
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Probier ein paar sounds aus:
|
||||||
|
|
||||||
|
- gm_electric_guitar_muted - E-Gitarre
|
||||||
|
- gm_acoustic_bass - Kontrabass
|
||||||
|
- gm_voice_oohs - Chords
|
||||||
|
- gm_blown_bottle - Flasche
|
||||||
|
- sawtooth - Sägezahn-Welle
|
||||||
|
- square - Rechteck-Welle
|
||||||
|
- triangle - Dreieck-Welle
|
||||||
|
- Was ist mit bd, sd oder hh?
|
||||||
|
- Entferne `.sound('...')` komplett
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**Zwischen Sounds hin und her wechseln**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("48 67 63 [62, 58]")
|
||||||
|
.sound("piano gm_electric_guitar_muted")`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
**Gleichzeitige Sounds**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("48 67 63 [62, 58]")
|
||||||
|
.sound("piano, gm_electric_guitar_muted")`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Die patterns in `note` und `sound` werden kombiniert!
|
||||||
|
|
||||||
|
Wir schauen uns später noch mehr Möglichkeiten an wie man patterns kombiniert.
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
## Längere Sequenzen
|
||||||
|
|
||||||
|
**Divide sequences with `/` to slow them down**
|
||||||
|
|
||||||
|
{/* [c2 bb1 f2 eb2] */}
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`note("[36 34 41 39]/4").sound("gm_acoustic_bass")`} punchcard />
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
The `/4` plays the sequence in brackets over 4 cycles (=4s).
|
||||||
|
|
||||||
|
So each of the 4 notes is 1s long.
|
||||||
|
|
||||||
|
Try adding more notes inside the brackets and notice how it gets faster.
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
Because it is so common to just play one thing per cycle, you can..
|
||||||
|
|
||||||
|
**Play one per cycle with \< \>**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`note("<36 34 41 39>").sound("gm_acoustic_bass")`} punchcard />
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Try adding more notes inside the brackets and notice how it does **not** get faster.
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**Play one sequence per cycle**
|
||||||
|
|
||||||
|
{/* <[c2 c3]*4 [bb1 bb2]*4 [f2 f3]*4 [eb2 eb3]*4>/2 */}
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("<[36 48]*4 [34 46]*4 [41 53]*4 [39 51]*4>/2")
|
||||||
|
.sound("gm_acoustic_bass")`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
**Alternate between multiple things**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("60 <63 62 65 63>")
|
||||||
|
.sound("gm_xylophone")`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
This is also useful for unpitched sounds:
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`sound("bd*2, ~ <sd cp>, [~ hh]*2")
|
||||||
|
.bank("RolandTR909")`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
## Scales
|
||||||
|
|
||||||
|
Finding the right notes can be difficult.. Scales are here to help:
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`n("0 2 4 <[6,8] [7,9]>")
|
||||||
|
.scale("C:minor").sound("piano")`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Try out different numbers. Any number should sound good!
|
||||||
|
|
||||||
|
Try out different scales:
|
||||||
|
|
||||||
|
- C:major
|
||||||
|
- A2:minor
|
||||||
|
- D:dorian
|
||||||
|
- G:mixolydian
|
||||||
|
- A2:minor:pentatonic
|
||||||
|
- F:major:pentatonic
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**automate scales**
|
||||||
|
|
||||||
|
Just like anything, we can automate the scale with a pattern:
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`n("<0 -3>, 2 4 <[6,8] [7,9]>")
|
||||||
|
.scale("<C:major D:mixolydian>/4")
|
||||||
|
.sound("piano")`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
If you have no idea what these scale mean, don't worry.
|
||||||
|
These are just labels for different sets of notes that go well together.
|
||||||
|
|
||||||
|
Take your time and you'll find scales you like!
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
## Repeat & Elongate
|
||||||
|
|
||||||
|
**Elongate with @**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`note("c@3 eb").sound("gm_acoustic_bass")`} punchcard />
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Not using `@` is like using `@1`. In the above example, c is 3 units long and eb is 1 unit long.
|
||||||
|
|
||||||
|
Try changing that number!
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**Elongate within sub-sequences**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`n("<[4@2 4] [5@2 5] [6@2 6] [5@2 5]>*2")
|
||||||
|
.scale("<C2:mixolydian F2:mixolydian>/4")
|
||||||
|
.sound("gm_acoustic_bass")`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
This groove is called a `shuffle`.
|
||||||
|
Each beat has two notes, where the first is twice as long as the second.
|
||||||
|
This is also sometimes called triplet swing. You'll often find it in blues and jazz.
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**Replicate**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`note("c!2 [eb,<g a bb a>]").sound("piano")`} punchcard />
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Try switching between `!`, `*` and `@`
|
||||||
|
|
||||||
|
What's the difference?
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
## Recap
|
||||||
|
|
||||||
|
Let's recap what we've learned in this chapter:
|
||||||
|
|
||||||
|
| Concept | Syntax | Example |
|
||||||
|
| --------- | ------ | ------------------------------------------------------------------- |
|
||||||
|
| Slow down | \/ | <MiniRepl hideHeader client:visible tune={`note("[c a f e]/2")`} /> |
|
||||||
|
| Alternate | \<\> | <MiniRepl hideHeader client:visible tune={`note("c <e g>")`} /> |
|
||||||
|
| Elongate | @ | <MiniRepl hideHeader client:visible tune={`note("c@3 e")`} /> |
|
||||||
|
| Replicate | ! | <MiniRepl hideHeader client:visible tune={`note("c!3 e")`} /> |
|
||||||
|
|
||||||
|
New functions:
|
||||||
|
|
||||||
|
| Name | Description | Example |
|
||||||
|
| ----- | ----------------------------------- | -------------------------------------------------------------------------------------------- |
|
||||||
|
| note | set pitch as number or letter | <MiniRepl hideHeader client:visible tune={`note("b g e c").sound("piano")`} /> |
|
||||||
|
| scale | interpret `n` as scale degree | <MiniRepl hideHeader client:visible tune={`n("6 4 2 0").scale("C:minor").sound("piano")`} /> |
|
||||||
|
| stack | play patterns in parallel (read on) | <MiniRepl hideHeader client:visible tune={`stack(s("bd sd"),note("c eb g"))`} /> |
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
**Classy Bassline**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("<[c2 c3]*4 [bb1 bb2]*4 [f2 f3]*4 [eb2 eb3]*4>/2")
|
||||||
|
.sound("gm_synth_bass_1")
|
||||||
|
.lpf(800) // <-- we'll learn about this soon`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
**Classy Melody**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`n(\`<
|
||||||
|
[~ 0] 2 [0 2] [~ 2]
|
||||||
|
[~ 0] 1 [0 1] [~ 1]
|
||||||
|
[~ 0] 3 [0 3] [~ 3]
|
||||||
|
[~ 0] 2 [0 2] [~ 2]
|
||||||
|
>*2\`).scale("C4:minor")
|
||||||
|
.sound("gm_synth_strings_1")`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
**Classy Drums**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`sound("bd*2, ~ <sd cp>, [~ hh]*2")
|
||||||
|
.bank("RolandTR909")`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
**If there just was a way to play all the above at the same time.......**
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
It's called `stack` 😙
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`stack(
|
||||||
|
note("<[c2 c3]*4 [bb1 bb2]*4 [f2 f3]*4 [eb2 eb3]*4>/2")
|
||||||
|
.sound("gm_synth_bass_1").lpf(800),
|
||||||
|
n(\`<
|
||||||
|
[~ 0] 2 [0 2] [~ 2]
|
||||||
|
[~ 0] 1 [0 1] [~ 1]
|
||||||
|
[~ 0] 3 [0 3] [~ 3]
|
||||||
|
[~ 0] 2 [0 2] [~ 2]
|
||||||
|
>*2\`).scale("C4:minor")
|
||||||
|
.sound("gm_synth_strings_1"),
|
||||||
|
sound("bd*2, ~ <sd cp>, [~ hh]*2")
|
||||||
|
.bank("RolandTR909")
|
||||||
|
)`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
This is starting to sound like actual music! We have sounds, we have notes, now the last piece of the puzzle is missing: [effects](/workshop/first-effects)
|
||||||
310
website/src/pages/de/workshop/first-sounds.mdx
Normal file
310
website/src/pages/de/workshop/first-sounds.mdx
Normal file
@ -0,0 +1,310 @@
|
|||||||
|
---
|
||||||
|
title: Erste Sounds
|
||||||
|
layout: ../../../layouts/MainLayout.astro
|
||||||
|
---
|
||||||
|
|
||||||
|
import { MiniRepl } from '@src/docs/MiniRepl';
|
||||||
|
import Box from '@components/Box.astro';
|
||||||
|
import QA from '@components/QA';
|
||||||
|
|
||||||
|
## Erste Sounds
|
||||||
|
|
||||||
|
{/* Let's start by making some noise: */}
|
||||||
|
|
||||||
|
Los geht's mit ein paar Sounds:
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("house")`} />
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
1. ⬆️ Klicke in das obige Textfeld ⬆️
|
||||||
|
2. Drücke `Strg`+`Enter` zum Abspielen
|
||||||
|
3. Ändere `house` in `casio`
|
||||||
|
4. Drücke `Strg`+`Enter` zum Aktualisieren
|
||||||
|
5. Drücke `Strg`+`.` zum Stoppen
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
Glückwunsch, du bist nun am live coden!
|
||||||
|
|
||||||
|
**Probiere mehr Sounds aus**
|
||||||
|
|
||||||
|
Mit ":" kannst du einen anderen Sound aus dem Set wählen:
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("east:1")`} hideHeader />
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Ändere `east:1` in `east:2` um einen anderen Sound aus dem Set `east` zu hören.
|
||||||
|
|
||||||
|
Du kannst auch andere Zahlen ausprobieren! Es kann sein dass du kurz nichts hörst während ein neuer Sound lädt.
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
Hier sind ein paar mehr Sounds zum ausprobieren:
|
||||||
|
|
||||||
|
```
|
||||||
|
casio control crow techno house jazz
|
||||||
|
metal east jvbass juno insect space wind
|
||||||
|
```
|
||||||
|
|
||||||
|
Jetzt weißt du wie man verschiedene Sounds benutzt.
|
||||||
|
Vorerst bleiben wir bei den voreingestellten Sounds, später erfahren wir noch wie man eigene benutzt.
|
||||||
|
|
||||||
|
## Drum Sounds
|
||||||
|
|
||||||
|
Strudel kommt von Haus aus mit einer breiten Auswahl an Drum Sounds:
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("bd hh sd oh")`} hideHeader />
|
||||||
|
|
||||||
|
Diese 2-Buchstaben Kombinationen stehen für verschiedene Teile eines Drumsets:
|
||||||
|
|
||||||
|
- `bd` = **b**ass **d**rum - Basstrommel
|
||||||
|
- `sd` = **s**nare **d**rum - Schnarrtrommel
|
||||||
|
- `sn` = **sn**are
|
||||||
|
- `rim` = **rim**shot - Rahmenschlag
|
||||||
|
- `hh` = **h**i**h**at
|
||||||
|
- `oh` = **o**pen **h**ihat - Offenes Hi-Hat
|
||||||
|
|
||||||
|
Wir können den Charakter des Drum Sounds verändern, indem wir mit `bank` die Drum Machine auswählen:
|
||||||
|
|
||||||
|
{/* To change the sound character of our drums, we can use `bank` to change the drum machine: */}
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("bd hh sd oh").bank("RolandTR909")`} hideHeader />
|
||||||
|
|
||||||
|
In diesem Beispiel ist `RolandTR909` der Name der Drum Machine, welche eine prägende Rolle für House und Techno Musik spielte.
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Ändere `RolandTR909` in
|
||||||
|
|
||||||
|
- `AkaiLinn`
|
||||||
|
- `RhythmAce`
|
||||||
|
- `RolandTR808`
|
||||||
|
- `RolandTR707`
|
||||||
|
- `ViscoSpaceDrum`
|
||||||
|
|
||||||
|
Es gibt noch viel mehr, aber das sollte fürs Erste reichen..
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
## Sequenzen / Sequences
|
||||||
|
|
||||||
|
Im letzten Beispiel haben wir schon gesehen dass man mehrere Sounds hintereinander abspielen kann wenn man sie durch Leerzeichen trennt:
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("bd hh sd hh")`} punchcard />
|
||||||
|
|
||||||
|
Beachte wie der aktuell gespielte Sound im Code markiert und auch darunter visualisiert wird.
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Versuch noch mehr Sounds hinzuzfügen!
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**Je länger die Sequence, desto schneller**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("bd bd hh bd sn bd hh bd")`} punchcard />
|
||||||
|
|
||||||
|
Der Inhalt einer Sequence wird in einen sogenannten Cycle (=Zyklus) zusammengequetscht.
|
||||||
|
|
||||||
|
**Tempo ändern mit `cpm`**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("bd bd hh bd sn bd hh bd").cpm(40)`} punchcard />
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
cpm = **c**ycles per **m**inute = Cycles pro Minute
|
||||||
|
|
||||||
|
Das Tempo ist standardmäßig auf 60cpm eingestellt, also 1 Cycle pro Sekunde.
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
Wir werden später noch mehr Möglichkeiten kennen lernen wie man das Tempo verändert.
|
||||||
|
|
||||||
|
**Pausen mit '~'**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("bd hh ~ rim")`} punchcard />
|
||||||
|
|
||||||
|
**Unter-Sequenzen mit [Klammern]**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("bd [hh hh] sn [hh bd]")`} punchcard />
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Füge noch mehr Sounds in die Klammern ein!
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
Genau wie bei der ganzen Sequence wird der eine Unter-Sequence schneller je mehr drin ist.
|
||||||
|
|
||||||
|
**Multiplikation: Dinge schneller machen**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("bd hh*2 sn hh*3")`} punchcard />
|
||||||
|
|
||||||
|
**Multiplikation: Unter-Sequences schneller machen**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("bd [hh sn]*2")`} punchcard />
|
||||||
|
|
||||||
|
**Multiplikation: Vieeeeeeel schneller**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("bd hh*16 sn hh*8")`} punchcard />
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Tonhöhe = sehr schneller Rhythmus
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**Unter-Unter-Sequenzen mit [[Klammern]]**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("bd [[sn sn] hh]")`} punchcard />
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Du kannst so tief verschachteln wie du willst!
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**Parallele Sequenzen mit Komma**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("hh hh hh, bd casio")`} punchcard />
|
||||||
|
|
||||||
|
Du kannst soviele Kommas benutzen wie du magst:
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("hh hh hh, bd bd, ~ casio")`} punchcard />
|
||||||
|
|
||||||
|
Kommas können auch in Unter-Sequenzen verwendet werden:
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("hh hh hh, bd [bd,casio]")`} punchcard />
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Ist dir aufgefallen dass sich die letzten beiden Beispiele gleich anhören?
|
||||||
|
|
||||||
|
Es kommt öfter vor dass man die gleiche Idee auf verschiedene Arten ausdrücken kann.
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**Mehrere Zeilen mit \`**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`sound(\`bd*2, ~ cp,
|
||||||
|
~ ~ ~ oh, hh*4,
|
||||||
|
[~ perc:1*2]*2,
|
||||||
|
[~ jvbass]*2\`)`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
**Sound Nummer separat auswählen**
|
||||||
|
|
||||||
|
Anstatt mit ":" kann man die Sound Nummer auch separat mir der `n` Funktion steuern:
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`n("0 1 [4 2] 3*2").sound("jazz")`} punchcard />
|
||||||
|
|
||||||
|
Das ist kürzer und lesbarer als:
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("jazz:0 jazz:1 [jazz:4 jazz:2] jazz:3*2")`} punchcard />
|
||||||
|
|
||||||
|
## Rückblick
|
||||||
|
|
||||||
|
Wir haben jetzt die Grundlagen der sogenannten Mini-Notation gelernt, der Rhythmus-Sprache von Tidal.
|
||||||
|
|
||||||
|
Das haben wir bisher gelernt:
|
||||||
|
|
||||||
|
| Concept | Syntax | Example |
|
||||||
|
| --------------------- | ----------- | -------------------------------------------------------------------------------- |
|
||||||
|
| Sequenz | Leerzeichen | <MiniRepl hideHeader client:visible tune={`sound("bd bd sn hh")`} /> |
|
||||||
|
| Sound Nummer | :x | <MiniRepl hideHeader client:visible tune={`sound("hh:0 hh:1 hh:2 hh:3")`} /> |
|
||||||
|
| Pausen | ~ | <MiniRepl hideHeader client:visible tune={`sound("metal ~ jazz jazz:1")`} /> |
|
||||||
|
| Unter-Sequenzen | \[\] | <MiniRepl hideHeader client:visible tune={`sound("bd wind [metal jazz] hh")`} /> |
|
||||||
|
| Unter-Unter-Sequenzen | \[\[\]\] | <MiniRepl hideHeader client:visible tune={`sound("bd [metal [jazz sn]]")`} /> |
|
||||||
|
| Schneller | \* | <MiniRepl hideHeader client:visible tune={`sound("bd sn*2 cp*3")`} /> |
|
||||||
|
| Parallel | , | <MiniRepl hideHeader client:visible tune={`sound("bd*2, hh*2 [hh oh]")`} /> |
|
||||||
|
|
||||||
|
Die mit Apostrophen umgebene Mini-Notation benutzt man normalerweise in eine sogenannten Funktion.
|
||||||
|
Die folgenden Funktionen haben wir bereits gesehen:
|
||||||
|
|
||||||
|
| Name | Description | Example |
|
||||||
|
| ----- | -------------------------------------- | ---------------------------------------------------------------------------------- |
|
||||||
|
| sound | Spielt den Sound mit dem Namen | <MiniRepl hideHeader client:visible tune={`sound("bd sd")`} /> |
|
||||||
|
| bank | Wählt die Soundbank / Drum Machine | <MiniRepl hideHeader client:visible tune={`sound("bd sd").bank("RolandTR909")`} /> |
|
||||||
|
| cpm | Tempo in **C**ycles **p**ro **M**inute | <MiniRepl hideHeader client:visible tune={`sound("bd sd").cpm(90)`} /> |
|
||||||
|
| n | Sample Nummer | <MiniRepl hideHeader client:visible tune={`n("0 1 4 2").sound("jazz")`} /> |
|
||||||
|
|
||||||
|
## Beispiele
|
||||||
|
|
||||||
|
**Einfacher Rock Beat**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("bd sd, hh*4").bank("RolandTR505").cpm(100/2)`} punchcard />
|
||||||
|
|
||||||
|
**Klassischer House**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("bd*2, ~ cp, [~ hh]*2").bank("RolandTR909")`} punchcard />
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Ist die aufgefallen dass die letzten 2 Patterns extrem ähnlich sind?
|
||||||
|
Bestimmte Drum Patterns werden oft genreübergreifend wiederverwendet.
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
We Will Rock you
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("bd*2 cp").bank("RolandTR707").cpm(81/2)`} punchcard />
|
||||||
|
|
||||||
|
**Yellow Magic Orchestra - Firecracker**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`sound("bd sd, ~ ~ ~ hh ~ hh ~ ~, ~ perc ~ perc:1*2")
|
||||||
|
.bank("RolandCompurhythm1000")`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
**Nachahmung eines 16 step sequencers**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`sound(\`
|
||||||
|
[~ ~ oh ~ ] [~ ~ ~ ~ ] [~ ~ ~ ~ ] [~ ~ ~ ~ ],
|
||||||
|
[hh hh ~ ~ ] [hh ~ hh ~ ] [hh ~ hh ~ ] [hh ~ hh ~ ],
|
||||||
|
[~ ~ ~ ~ ] [cp ~ ~ ~ ] [~ ~ ~ ~ ] [cp ~ ~ ~ ],
|
||||||
|
[bd ~ ~ ~ ] [~ ~ ~ bd] [~ ~ bd ~ ] [~ ~ ~ bd]
|
||||||
|
\`).cpm(90/4)`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
**Noch eins**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`sound(\`
|
||||||
|
[~ ~ ~ ~ ] [~ ~ ~ ~ ] [~ ~ ~ ~ ] [~ ~ oh:1 ~ ],
|
||||||
|
[hh hh hh hh] [hh hh hh hh] [hh hh hh hh] [hh hh ~ ~ ],
|
||||||
|
[~ ~ ~ ~ ] [cp ~ ~ ~ ] [~ ~ ~ ~ ] [~ cp ~ ~ ],
|
||||||
|
[bd bd ~ ~ ] [~ ~ bd ~ ] [bd bd ~ bd ] [~ ~ ~ ~ ]
|
||||||
|
\`).bank("RolandTR808").cpm(88/4)`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
**Nicht so typische Drums**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`s(\`jazz*2,
|
||||||
|
insect [crow metal] ~ ~,
|
||||||
|
~ space:4 ~ space:1,
|
||||||
|
~ wind\`)
|
||||||
|
.cpm(100/2)`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
Jetzt haben wir eine grundlegende Ahnung davon wie man mit Strudel Beats baut!
|
||||||
|
Im nächsten Kapitel werden wir ein paar [Töne spielen](/workshop/first-notes).
|
||||||
3
website/src/pages/de/workshop/index.astro
Normal file
3
website/src/pages/de/workshop/index.astro
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<script is:inline>
|
||||||
|
window.location.pathname = `/workshop/intro`;
|
||||||
|
</script>
|
||||||
22
website/src/pages/de/workshop/intro.mdx
Normal file
22
website/src/pages/de/workshop/intro.mdx
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
title: Introduction
|
||||||
|
layout: ../../../layouts/MainLayout.astro
|
||||||
|
---
|
||||||
|
|
||||||
|
# Introduction
|
||||||
|
|
||||||
|
## goals
|
||||||
|
|
||||||
|
- be beginner friendly
|
||||||
|
- teach a representative subset of strudel / tidal
|
||||||
|
- introduce one new thing at a time
|
||||||
|
- give practical / musical examples
|
||||||
|
- encourage self-experimentation
|
||||||
|
- hands on learning > walls of text
|
||||||
|
- maintain flow state
|
||||||
|
- no setup required
|
||||||
|
|
||||||
|
## inspired by
|
||||||
|
|
||||||
|
- https://github.com/tidalcycles/tidal-workshop/blob/master/workshop.tidal
|
||||||
|
- https://learningmusic.ableton.com
|
||||||
154
website/src/pages/de/workshop/langebank.mdx
Normal file
154
website/src/pages/de/workshop/langebank.mdx
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
<Box>
|
||||||
|
|
||||||
|
1. press play button to start
|
||||||
|
2. change `house` to `casio`
|
||||||
|
3. press refresh button to update
|
||||||
|
4. press stop button to stop
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**Change tempo**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
client:load
|
||||||
|
tune={`setcps(.5)
|
||||||
|
sound("bd bd hh bd sn bd hh bd")`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
adding your own samples
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
client:visible
|
||||||
|
tune={`sound(\`
|
||||||
|
[~ ~ oh ~ ] [~ ~ ~ ~ ] [~ ~ ~ ~ ] [~ ~ ~ ~ ],
|
||||||
|
[hh hh ~ ~ ] [hh ~ hh ~ ] [hh ~ hh ~ ] [hh ~ hh ~ ],
|
||||||
|
[~ ~ ~ ~ ] [cp ~ ~ ~ ] [~ ~ ~ ~ ] [cp ~ ~ ~ ],
|
||||||
|
[bd ~ ~ ~ ] [~ ~ ~ bd] [~ ~ bd ~ ] [~ ~ ~ bd ]
|
||||||
|
\`).slow(3)`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
client:visible
|
||||||
|
tune={`sound(\`
|
||||||
|
[~ ~ ~ ~ ] [~ ~ ~ ~ ] [~ ~ ~ ~ ] [~ ~ oh:1 ~ ],
|
||||||
|
[hh hh hh hh] [hh hh hh hh] [hh hh hh hh] [hh hh ~ ~ ],
|
||||||
|
[~ ~ ~ ~ ] [cp ~ ~ ~ ] [~ ~ ~ ~ ] [~ cp ~ ~ ],
|
||||||
|
[bd bd ~ ~ ] [~ ~ bd ~ ] [bd bd ~ bd ] [~ ~ ~ ~ ]
|
||||||
|
\`).bank("<RolandTR808 AkaiMPC60>").slow(3)`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
n(run(8)).sound("east")
|
||||||
|
|
||||||
|
Shorter variant:
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`sound(\`
|
||||||
|
[~ ~ oh ~ ] ~ ~ ~,
|
||||||
|
[hh*2 ~] hh*2 hh*2 hh*2,
|
||||||
|
[~ cp]*2,
|
||||||
|
bd [~ ~ ~ bd] [~ bd] [~ ~ ~ bd]
|
||||||
|
\`).cpm(90/4)`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
polyrythms & polymeters
|
||||||
|
|
||||||
|
-- This can make for flexible time signatures:
|
||||||
|
|
||||||
|
d1 $ sound "[bd bd sn:5] [bd sn:3]"
|
||||||
|
|
||||||
|
-- You can put subsequences inside subsequences:
|
||||||
|
d1 $ sound "[[bd bd] bd sn:5] [bd sn:3]"
|
||||||
|
|
||||||
|
-- Keep going..
|
||||||
|
d1 $ sound "[[bd [bd bd bd bd]] bd sn:5] [bd sn:3]"
|
||||||
|
|
||||||
|
-- \* Polymetric / polyrhythmic sequences
|
||||||
|
|
||||||
|
-- Play two subsequences at once by separating with a comma:
|
||||||
|
|
||||||
|
d1 $ sound "[voodoo voodoo:3, arpy arpy:4 arpy:2]"
|
||||||
|
|
||||||
|
-- compare how [,] and {,} work:
|
||||||
|
|
||||||
|
d1 $ sound "[voodoo voodoo:3, arpy arpy:4 arpy:2]"
|
||||||
|
|
||||||
|
d1 $ sound "{voodoo voodoo:3, arpy arpy:4 arpy:2}"
|
||||||
|
|
||||||
|
d1 $ sound "[drum bd hh bd, can can:2 can:3 can:4 can:2]"
|
||||||
|
|
||||||
|
d1 $ sound "{drum bd hh bd, can can:2 can:3 can:4 can:2}"
|
||||||
|
|
||||||
|
d1 $ sound "[bd sn, can:2 can:3 can:1, arpy arpy:1 arpy:2 arpy:3 arpy:5]"
|
||||||
|
|
||||||
|
d1 $ sound "{bd sn, can:2 can:3 can:1, arpy arpy:1 arpy:2 arpy:3 arpy:5}"
|
||||||
|
|
||||||
|
**Play X per cycle with \{ \}**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note(\`{
|
||||||
|
[~ 60] 63 [60 63] [~ 63]
|
||||||
|
[~ 60] 62 [60 62] [~ 62]
|
||||||
|
[~ 60] 65 [60 65] [~ 65]
|
||||||
|
[~ 60] 63 [60 63] [~ 63]
|
||||||
|
}%2\`).sound("gm_xylophone")`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Try different numbers after `%`
|
||||||
|
|
||||||
|
`{ ... }%1` is the same as `< ... >`
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
## Bracket Recap
|
||||||
|
|
||||||
|
- `[]` squeezes contents to 1 cycle
|
||||||
|
- `<>` plays one item per cycle
|
||||||
|
- `{}%x` plays x items per cycle
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("[0 12]*2".add("<36 34 41 39>/2"))
|
||||||
|
.sound("gm_synth_bass_1")`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
vertical
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`n(\`<
|
||||||
|
<[0,7] [-1,6] [-1,6] [-1,6]>
|
||||||
|
< 4 4 4 3>
|
||||||
|
<[2,7] [2,6] [1,6] [1,6]>
|
||||||
|
< 4 4 4 3>
|
||||||
|
>*2\`)
|
||||||
|
.scale("<E:minor>/4")
|
||||||
|
.sound("piano")`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
horizontal
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`
|
||||||
|
n(\`<
|
||||||
|
[0,7] 4 [2,7] 4
|
||||||
|
[-1,6] 4 [2,6] 4
|
||||||
|
[-1,6] 4 [1,6] 4
|
||||||
|
[-1,6] 3 [1,6] 3
|
||||||
|
>*2\`)
|
||||||
|
.scale("<E:minor>/4")
|
||||||
|
.sound("piano")`}
|
||||||
|
/>
|
||||||
69
website/src/pages/de/workshop/mini-notation.mdx
Normal file
69
website/src/pages/de/workshop/mini-notation.mdx
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
---
|
||||||
|
title: First Sounds
|
||||||
|
layout: ../../../layouts/MainLayout.astro
|
||||||
|
---
|
||||||
|
|
||||||
|
import { MiniRepl } from '../../docs/MiniRepl';
|
||||||
|
|
||||||
|
# Mini Notation
|
||||||
|
|
||||||
|
Mini Notation is everything between the quotes. It the short rhythm language of Tidal.
|
||||||
|
|
||||||
|
## Cycles
|
||||||
|
|
||||||
|
**The longer the sequence, the faster it runs**
|
||||||
|
|
||||||
|
<MiniRepl client:load tune={`sound("bd bd hh bd sn bd hh bd")`} punchcard />
|
||||||
|
|
||||||
|
**Play less sounds per cycle with \{curly braces\}**
|
||||||
|
|
||||||
|
<MiniRepl client:load tune={`sound("{bd bd hh bd sn bd hh bd}%4")`} punchcard />
|
||||||
|
|
||||||
|
**Use \`backticks\` for multiple lines**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
client:load
|
||||||
|
tune={`sound(\`{
|
||||||
|
bd bd hh bd
|
||||||
|
sn bd hh bd
|
||||||
|
sn bd hh bd
|
||||||
|
sn bd hh hh:4
|
||||||
|
}%4\`)`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
**Play one sounds per cycle with \<angle brackets\>**
|
||||||
|
|
||||||
|
<MiniRepl client:load tune={`sound("<bd bd hh bd sn bd hh bd>")`} punchcard />
|
||||||
|
|
||||||
|
This is the same as `{...}%1`
|
||||||
|
|
||||||
|
## Operators
|
||||||
|
|
||||||
|
**Multiplication: Speed things up**
|
||||||
|
|
||||||
|
<MiniRepl client:load tune={`sound("bd hh*2 sn hh*2")`} punchcard />
|
||||||
|
|
||||||
|
**Division: Slow things down**
|
||||||
|
|
||||||
|
<MiniRepl client:load tune={`sound("bd/2 sd, hh*4")`} punchcard />
|
||||||
|
|
||||||
|
`bd` will play only every second time
|
||||||
|
|
||||||
|
## Combining it all
|
||||||
|
|
||||||
|
**Speed up Sub-Sequences**
|
||||||
|
|
||||||
|
<MiniRepl client:load tune={`sound("bd [sn hh]*2 sd hh")`} punchcard />
|
||||||
|
|
||||||
|
**Slow down Sequences**
|
||||||
|
|
||||||
|
<MiniRepl client:load tune={`sound("[bd [sn hh] sd hh]/2")`} punchcard />
|
||||||
|
|
||||||
|
**Parallel Sub-Sequences**
|
||||||
|
|
||||||
|
<MiniRepl client:load tune={`sound("bd [sn,hh] sd [hh:2,sn]")`} punchcard />
|
||||||
|
|
||||||
|
**Sample Numbers on groups**
|
||||||
|
|
||||||
|
<MiniRepl client:load tune={`sound("bd [sn,hh] sd [hh,sn]:2")`} punchcard />
|
||||||
194
website/src/pages/de/workshop/pattern-effects.mdx
Normal file
194
website/src/pages/de/workshop/pattern-effects.mdx
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
---
|
||||||
|
title: Pattern Effects
|
||||||
|
layout: ../../../layouts/MainLayout.astro
|
||||||
|
---
|
||||||
|
|
||||||
|
import { MiniRepl } from '@src/docs/MiniRepl';
|
||||||
|
import Box from '@components/Box.astro';
|
||||||
|
import QA from '@components/QA';
|
||||||
|
|
||||||
|
# Pattern Effects
|
||||||
|
|
||||||
|
Up until now, most of the functions we've seen are what other music programs are typically capable of: sequencing sounds, playing notes, controlling effects.
|
||||||
|
|
||||||
|
In this chapter, we are going to look at functions that are more unique to tidal.
|
||||||
|
|
||||||
|
**reverse patterns with rev**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`n("0 1 [4 3] 2").sound("jazz").rev()`} />
|
||||||
|
|
||||||
|
**play pattern left and modify it right with jux**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`n("0 1 [4 3] 2").sound("jazz").jux(rev)`} />
|
||||||
|
|
||||||
|
This is the same as:
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`stack(
|
||||||
|
n("0 1 [4 3] 2").sound("jazz").pan(0),
|
||||||
|
n("0 1 [4 3] 2").sound("jazz").pan(1).rev()
|
||||||
|
)`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
Let's visualize what happens here:
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`stack(
|
||||||
|
n("0 1 [4 3] 2").sound("jazz").pan(0).color("cyan"),
|
||||||
|
n("0 1 [4 3] 2").sound("jazz").pan(1).color("magenta").rev()
|
||||||
|
)`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Try commenting out one of the two by adding `//` before a line
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**multiple tempos**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`note("c2, eb3 g3 [bb3 c4]").sound("piano").slow("1,2,3")`} />
|
||||||
|
|
||||||
|
This is like doing
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`stack(
|
||||||
|
note("c2, eb3 g3 [bb3 c4]").s("piano").slow(1).color('cyan'),
|
||||||
|
note("c2, eb3 g3 [bb3 c4]").s("piano").slow(2).color('magenta'),
|
||||||
|
note("c2, eb3 g3 [bb3 c4]").s("piano").slow(3).color('yellow')
|
||||||
|
)`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Try commenting out one or more by adding `//` before a line
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**add**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("c2 [eb3,g3]".add("<0 <1 -1>>"))
|
||||||
|
.color("<cyan <magenta yellow>>").adsr("[.1 0]:.2:[1 0]")
|
||||||
|
.sound("gm_acoustic_bass").room(.5)`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
If you add a number to a note, the note will be treated as if it was a number
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
We can add as often as we like:
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`note("c2 [eb3,g3]".add("<0 <1 -1>>").add("0,7"))
|
||||||
|
.color("<cyan <magenta yellow>>").adsr("[.1 0]:.2:[1 0]")
|
||||||
|
.sound("gm_acoustic_bass").room(.5)`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
**add with scale**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`n("<0 [2 4] <3 5> [~ <4 1>]>*2".add("<0 [0,2,4]>/4"))
|
||||||
|
.scale("C5:minor").release(.5)
|
||||||
|
.sound("gm_xylophone").room(.5)`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
**time to stack**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`stack(
|
||||||
|
n("<0 [2 4] <3 5> [~ <4 1>]>*2".add("<0 [0,2,4]>/4"))
|
||||||
|
.scale("C5:minor")
|
||||||
|
.sound("gm_xylophone")
|
||||||
|
.room(.4).delay(.125),
|
||||||
|
note("c2 [eb3,g3]".add("<0 <1 -1>>"))
|
||||||
|
.adsr("[.1 0]:.2:[1 0]")
|
||||||
|
.sound("gm_acoustic_bass")
|
||||||
|
.room(.5),
|
||||||
|
n("0 1 [2 3] 2").sound("jazz").jux(rev).slow(2)
|
||||||
|
)`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
**ply**
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("hh, bd rim").bank("RolandTR707").ply(2)`} punchcard />
|
||||||
|
|
||||||
|
this is like writing:
|
||||||
|
|
||||||
|
<MiniRepl hideHeader client:visible tune={`sound("hh*2, bd*2 rim*2").bank("RolandTR707")`} punchcard />
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
Try patterning the `ply` function, for example using `"<1 2 1 3>"`
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
**off**
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`n("<0 [4 <3 2>] <2 3> [~ 1]>"
|
||||||
|
.off(1/8, x=>x.add(4))
|
||||||
|
//.off(1/4, x=>x.add(7))
|
||||||
|
).scale("<C5:minor Db5:mixolydian>/4")
|
||||||
|
.s("triangle").room(.5).ds(".1:0").delay(.5)`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
|
||||||
|
In the notation `x=>x.`, the `x` is the shifted pattern, which where modifying.
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
The above is like writing:
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`stack(
|
||||||
|
n("<0 [4 <3 2>] <2 3> [~ 1]>*2").color("cyan"),
|
||||||
|
n("<0 [4 <3 2>] <2 3> [~ 1]>*2".add(7).late(1/8)).color("magenta")
|
||||||
|
).scale("<C4:minor Db4:mixolydian>/2")
|
||||||
|
.s("triangle").adsr(".01:.1:0").room(.5)`}
|
||||||
|
punchcard
|
||||||
|
/>
|
||||||
|
|
||||||
|
off is also useful for sounds:
|
||||||
|
|
||||||
|
<MiniRepl
|
||||||
|
hideHeader
|
||||||
|
client:visible
|
||||||
|
tune={`s("bd sd,[~ hh]*2").bank("CasioRZ1")
|
||||||
|
.off(1/8, x=>x.speed(1.5).gain(.25))`}
|
||||||
|
/>
|
||||||
|
|
||||||
|
| name | description | example |
|
||||||
|
| ---- | ------------------------------ | ---------------------------------------------------------------------------------------------- |
|
||||||
|
| rev | reverse | <MiniRepl hideHeader client:visible tune={`n("0 2 4 6").scale("C:minor").rev()`} /> |
|
||||||
|
| jux | split left/right, modify right | <MiniRepl hideHeader client:visible tune={`n("0 2 4 6").scale("C:minor").jux(rev)`} /> |
|
||||||
|
| add | add numbers / notes | <MiniRepl hideHeader client:visible tune={`n("0 2 4 6".add("<0 1 2 1>")).scale("C:minor")`} /> |
|
||||||
|
| ply | speed up each event n times | <MiniRepl hideHeader client:visible tune={`s("bd sd").ply("<1 2 3>")`} /> |
|
||||||
|
| off | copy, shift time & modify | <MiniRepl hideHeader client:visible tune={`s("bd sd, hh*4").off(1/8, x=>x.speed(2))`} /> |
|
||||||
98
website/src/pages/de/workshop/recap.mdx
Normal file
98
website/src/pages/de/workshop/recap.mdx
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
---
|
||||||
|
title: Recap
|
||||||
|
layout: ../../../layouts/MainLayout.astro
|
||||||
|
---
|
||||||
|
|
||||||
|
import { MiniRepl } from '../../../docs/MiniRepl';
|
||||||
|
|
||||||
|
# Workshop Recap
|
||||||
|
|
||||||
|
This page is just a listing of all functions covered in the workshop!
|
||||||
|
|
||||||
|
## Mini Notation
|
||||||
|
|
||||||
|
| Concept | Syntax | Example |
|
||||||
|
| ----------------- | -------- | -------------------------------------------------------------------------------- |
|
||||||
|
| Sequence | space | <MiniRepl hideHeader client:visible tune={`sound("bd bd sn hh")`} /> |
|
||||||
|
| Sample Number | :x | <MiniRepl hideHeader client:visible tune={`sound("hh:0 hh:1 hh:2 hh:3")`} /> |
|
||||||
|
| Rests | ~ | <MiniRepl hideHeader client:visible tune={`sound("metal ~ jazz jazz:1")`} /> |
|
||||||
|
| Sub-Sequences | \[\] | <MiniRepl hideHeader client:visible tune={`sound("bd wind [metal jazz] hh")`} /> |
|
||||||
|
| Sub-Sub-Sequences | \[\[\]\] | <MiniRepl hideHeader client:visible tune={`sound("bd [metal [jazz sn]]")`} /> |
|
||||||
|
| Speed up | \* | <MiniRepl hideHeader client:visible tune={`sound("bd sn*2 cp*3")`} /> |
|
||||||
|
| Parallel | , | <MiniRepl hideHeader client:visible tune={`sound("bd*2, hh*2 [hh oh]")`} /> |
|
||||||
|
| Slow down | \/ | <MiniRepl hideHeader client:visible tune={`note("[c a f e]/2")`} /> |
|
||||||
|
| Alternate | \<\> | <MiniRepl hideHeader client:visible tune={`note("c <e g>")`} /> |
|
||||||
|
| Elongate | @ | <MiniRepl hideHeader client:visible tune={`note("c@3 e")`} /> |
|
||||||
|
| Replicate | ! | <MiniRepl hideHeader client:visible tune={`note("c!3 e")`} /> |
|
||||||
|
|
||||||
|
## Sounds
|
||||||
|
|
||||||
|
| Name | Description | Example |
|
||||||
|
| ----- | --------------------------------- | ---------------------------------------------------------------------------------- |
|
||||||
|
| sound | plays the sound of the given name | <MiniRepl hideHeader client:visible tune={`sound("bd sd")`} /> |
|
||||||
|
| bank | selects the sound bank | <MiniRepl hideHeader client:visible tune={`sound("bd sd").bank("RolandTR909")`} /> |
|
||||||
|
| n | select sample number | <MiniRepl hideHeader client:visible tune={`n("0 1 4 2").sound("jazz")`} /> |
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
| Name | Description | Example |
|
||||||
|
| --------- | ----------------------------------- | -------------------------------------------------------------------------------------------- |
|
||||||
|
| note | set pitch as number or letter | <MiniRepl hideHeader client:visible tune={`note("b g e c").sound("piano")`} /> |
|
||||||
|
| n + scale | set note in scale | <MiniRepl hideHeader client:visible tune={`n("6 4 2 0").scale("C:minor").sound("piano")`} /> |
|
||||||
|
| stack | play patterns in parallel (read on) | <MiniRepl hideHeader client:visible tune={`stack(s("bd sd"),note("c eb g"))`} /> |
|
||||||
|
|
||||||
|
## Audio Effects
|
||||||
|
|
||||||
|
| name | example |
|
||||||
|
| ----- | -------------------------------------------------------------------------------------------------- |
|
||||||
|
| lpf | <MiniRepl hideHeader client:visible tune={`note("c2 c3").s("sawtooth").lpf("<400 2000>")`} /> |
|
||||||
|
| vowel | <MiniRepl hideHeader client:visible tune={`note("c3 eb3 g3").s("sawtooth").vowel("<a e i o>")`} /> |
|
||||||
|
| gain | <MiniRepl hideHeader client:visible tune={`s("hh*8").gain("[.25 1]*2")`} /> |
|
||||||
|
| delay | <MiniRepl hideHeader client:visible tune={`s("bd rim").delay(.5)`} /> |
|
||||||
|
| room | <MiniRepl hideHeader client:visible tune={`s("bd rim").room(.5)`} /> |
|
||||||
|
| pan | <MiniRepl hideHeader client:visible tune={`s("bd rim").pan("0 1")`} /> |
|
||||||
|
| speed | <MiniRepl hideHeader client:visible tune={`s("bd rim").speed("<1 2 -1 -2>")`} /> |
|
||||||
|
| range | <MiniRepl hideHeader client:visible tune={`s("hh*16").lpf(saw.range(200,4000))`} /> |
|
||||||
|
|
||||||
|
## Pattern Effects
|
||||||
|
|
||||||
|
| name | description | example |
|
||||||
|
| ---- | ----------------------------------- | ---------------------------------------------------------------------------------------------- |
|
||||||
|
| cpm | sets the tempo in cycles per minute | <MiniRepl hideHeader client:visible tune={`sound("bd sd").cpm(90)`} /> |
|
||||||
|
| fast | speed up | <MiniRepl hideHeader client:visible tune={`sound("bd sd").fast(2)`} /> |
|
||||||
|
| slow | slow down | <MiniRepl hideHeader client:visible tune={`sound("bd sd").slow(2)`} /> |
|
||||||
|
| rev | reverse | <MiniRepl hideHeader client:visible tune={`n("0 2 4 6").scale("C:minor").rev()`} /> |
|
||||||
|
| jux | split left/right, modify right | <MiniRepl hideHeader client:visible tune={`n("0 2 4 6").scale("C:minor").jux(rev)`} /> |
|
||||||
|
| add | add numbers / notes | <MiniRepl hideHeader client:visible tune={`n("0 2 4 6".add("<0 1 2 1>")).scale("C:minor")`} /> |
|
||||||
|
| ply | speed up each event n times | <MiniRepl hideHeader client:visible tune={`s("bd sd").ply("<1 2 3>")`} /> |
|
||||||
|
| off | copy, shift time & modify | <MiniRepl hideHeader client:visible tune={`s("bd sd, hh*4").off(1/8, x=>x.speed(2))`} /> |
|
||||||
|
|
||||||
|
## Samples
|
||||||
|
|
||||||
|
```
|
||||||
|
casio control crow techno house jazz
|
||||||
|
metal east jvbass juno insect space wind
|
||||||
|
bd sd sn cp hh
|
||||||
|
piano
|
||||||
|
```
|
||||||
|
|
||||||
|
## Synths
|
||||||
|
|
||||||
|
```
|
||||||
|
gm_electric_guitar_muted gm_acoustic_bass
|
||||||
|
gm_voice_oohs gm_blown_bottle sawtooth square triangle
|
||||||
|
gm_xylophone gm_synth_bass_1 gm_synth_strings_1
|
||||||
|
```
|
||||||
|
|
||||||
|
## Banks
|
||||||
|
|
||||||
|
```
|
||||||
|
RolandTR909
|
||||||
|
```
|
||||||
|
|
||||||
|
## Scales
|
||||||
|
|
||||||
|
```
|
||||||
|
major minor dorian mixolydian
|
||||||
|
minor:pentatonic major:pentatonic
|
||||||
|
```
|
||||||
Loading…
x
Reference in New Issue
Block a user