FAQ is now prettier
This commit is contained in:
parent
a21f0d629e
commit
69c5df67f5
1 changed files with 78 additions and 56 deletions
|
|
@ -14,14 +14,18 @@ This page contains frequently asked questions. Usually, the topic is explained i
|
||||||
|
|
||||||
Yes - there is no charge, this is a collective open source project, and the music you make with it is your own.
|
Yes - there is no charge, this is a collective open source project, and the music you make with it is your own.
|
||||||
|
|
||||||
However there are some caveats - the source code must stay free, i.e. you cannot distribute strudel or tidal as part of projects with incompatible licenses - see the [license](<https://www.gnu.org/licenses/agpl-3.0.en.html>) for details. The contributed examples and tracks are also separately licensed, and must not e.g. be used to train AI models without permission.
|
However there are some caveats - the source code must stay free, i.e. you cannot distribute strudel or tidal as part of projects with incompatible licenses - see the [license](https://www.gnu.org/licenses/agpl-3.0.en.html) for details. The contributed examples and tracks are also separately licensed, and must not e.g. be used to train AI models without permission.
|
||||||
|
|
||||||
## How to record or export audio?
|
## How to record or export audio?
|
||||||
|
|
||||||
There are multiple ways to record the audio -- and video -- output of Strudel:
|
There are multiple ways to record the audio -- and video -- output of Strudel:
|
||||||
|
|
||||||
- capture the raw stereo signal coming out of your web browser.
|
- capture the raw stereo signal coming out of your web browser.
|
||||||
|
|
||||||
- use the alternative SuperDirt audio engine. Read [this page](/learn/input-output/#oscsuperdirtstrudeldirt) to know more about it.
|
- use the alternative SuperDirt audio engine. Read [this page](/learn/input-output/#oscsuperdirtstrudeldirt) to know more about it.
|
||||||
|
|
||||||
- capture the audio/video stream using a capture tool such as [OBS](<https://obsproject.com/fr>).
|
- capture the audio/video stream using a capture tool such as [OBS](<https://obsproject.com/fr>).
|
||||||
|
|
||||||
- don't record anything and code it again in front of your friends.
|
- don't record anything and code it again in front of your friends.
|
||||||
|
|
||||||
You will need an external audio editor/DAW such as Reaper/Audacity/Ardour, etc. Strudel itself does not have functionality for exporting stems / individual tracks to an audio or midi file. Strudel is not a digital audio workstation and does not operate following the same principles shared by most traditional audio softwares.
|
You will need an external audio editor/DAW such as Reaper/Audacity/Ardour, etc. Strudel itself does not have functionality for exporting stems / individual tracks to an audio or midi file. Strudel is not a digital audio workstation and does not operate following the same principles shared by most traditional audio softwares.
|
||||||
|
|
@ -29,8 +33,9 @@ You will need an external audio editor/DAW such as Reaper/Audacity/Ardour, etc.
|
||||||
## Can I use strudel with my IDE?
|
## Can I use strudel with my IDE?
|
||||||
|
|
||||||
Yes you can. There are experimental modes, made by community members, for several IDEs such as:
|
Yes you can. There are experimental modes, made by community members, for several IDEs such as:
|
||||||
- VS Code: [Strudel VS](<https://marketplace.visualstudio.com/items?itemName=cmillsdev.strudelvs>): an experimental mode for Microsoft VSCode. A revived version of [TidalStrudel](<https://marketplace.visualstudio.com/items?itemName=roipoussiere.tidal-strudel>), which is defunct.
|
|
||||||
- nvim: [strudel.nvim](https://github.com/gruvw/strudel.nvim)
|
- VS Code: [Strudel VS](https://marketplace.visualstudio.com/items?itemName=cmillsdev.strudelvs): an experimental mode for Microsoft VSCode. A revived version of [TidalStrudel](https://marketplace.visualstudio.com/items?itemName=roipoussiere.tidal-strudel), which is defunct.
|
||||||
|
- nvim: [strudel.nvim](https://github.com/gruvw/strudel.nvim)
|
||||||
|
|
||||||
## How can I record samples?
|
## How can I record samples?
|
||||||
|
|
||||||
|
|
@ -41,7 +46,7 @@ You can use your own samples with Strudel. There are multiple ways to load your
|
||||||
|
|
||||||
## Can I use Strudel with AI/LLM tools?
|
## Can I use Strudel with AI/LLM tools?
|
||||||
|
|
||||||
You are free to do what you like with Strudel, within the terms of the free/open source AGPLv3 license. However as a community we are interested in exploring human creativity. AI is *way* over-hyped right now, including by people with very shady motives. Many in the community are very wary of people training models on their tunes that they've poured their love into. So please keep discussion and questions around AI and LLMs to channels dedicated to the topic and be fully respectful of other people's work.
|
You are free to do what you like with Strudel, within the terms of the free/open source AGPLv3 license. However as a community we are interested in exploring human creativity. AI is _way_ over-hyped right now, including by people with very shady motives. Many in the community are very wary of people training models on their tunes that they've poured their love into. So please keep discussion and questions around AI and LLMs to channels dedicated to the topic and be fully respectful of other people's work.
|
||||||
|
|
||||||
Furthermore, tools like ChatGPT generally give wrong answers. Please don't ask the community to fix those answers for you, as generally they will be timewasting nonsense.
|
Furthermore, tools like ChatGPT generally give wrong answers. Please don't ask the community to fix those answers for you, as generally they will be timewasting nonsense.
|
||||||
|
|
||||||
|
|
@ -76,13 +81,16 @@ If you want to emulate the functionality of a DAW in a live coding language, you
|
||||||
## Why doesn't everyone just use a DAW?
|
## Why doesn't everyone just use a DAW?
|
||||||
|
|
||||||
There is no easy answer to this question. Here are some thoughts:
|
There is no easy answer to this question. Here are some thoughts:
|
||||||
- Live coding tools such as Strudel are excellent for improvising music and visuals using a computer. DAWs are valuable and robust companions for other activities such as producing, mastering and mixing audio, among other usages. Using a tool does not exclude from using any another tool, just build a toolbox.
|
|
||||||
- Live coding has been practiced for quite some time as a performative activity. Artists like to show their screens while playing in front of an audience. It is an essential part of what they do, of the way they share their activity with everybody.
|
- Live coding tools such as Strudel are excellent for improvising music and visuals using a computer. DAWs are valuable and robust companions for other activities such as producing, mastering and mixing audio, among other usages. Using a tool does not exclude from using any another tool, just build a toolbox.
|
||||||
- Code is a human language, it is made for other humans to read it. You can read the code and enjoy the music too. It has meaning, value, and there might even be something poetic/important about it!
|
|
||||||
- Strudel is free and open source, you can inspect the code, reshape it, contribute to it if you can/want. It is not opaque and this matters for many people. There is no black box, no obscure abstractions, no business model or hidden features. We need open tools in the arts!
|
- Live coding has been practiced for quite some time as a performative activity. Artists like to show their screens while playing in front of an audience. It is an essential part of what they do, of the way they share their activity with everybody.
|
||||||
- Live coders don't shy away from using DAWs. They use them all of the time, especially when it makes their life easier for... live coding!
|
|
||||||
- Code is an artistic material like any other. There is something valuable in the process of making music through code. More generally speaking, it is nice to tackle creative problems through the use of a programming language: creative thinking, building up your own solutions, DIY approach to music-making, unexpected outcome of algorithms, funny human errors, etc.
|
- Code is a human language, it is made for other humans to read it. You can read the code and enjoy the music too. It has meaning, value, and there might even be something poetic/important about it! - Strudel is free and open source, you can inspect the code, reshape it, contribute to it if you can/want. It is not opaque and this matters for many people. There is no black box, no obscure abstractions, no business model or hidden features. We need open tools in the arts! - Live coders don't shy away from using DAWs. They use them all of the time, especially when it makes their life easier for... live coding!
|
||||||
- There are pianos and trumpets in your DAW: why do people continue playing the piano or the trumpet? Think of live coding tools as instruments that you activate through the act of programming.
|
|
||||||
|
- Code is an artistic material like any other. There is something valuable in the process of making music through code. More generally speaking, it is nice to tackle creative problems through the use of a programming language: creative thinking, building up your own solutions, DIY approach to music-making, unexpected outcome of algorithms, funny human errors, etc.
|
||||||
|
|
||||||
|
- There are pianos and trumpets in your DAW: why do people continue playing the piano or the trumpet? Think of live coding tools as instruments that you activate through the act of programming.
|
||||||
|
|
||||||
## Is it more efficient to use Strudel than a DAW?
|
## Is it more efficient to use Strudel than a DAW?
|
||||||
|
|
||||||
|
|
@ -113,8 +121,12 @@ You cannot, as there is no such place. For details regarding our stance towards
|
||||||
## How to play different patterns simultaneously?
|
## How to play different patterns simultaneously?
|
||||||
|
|
||||||
Using the $ operator, several patterns can be played at once:
|
Using the $ operator, several patterns can be played at once:
|
||||||
<MiniRepl client:idle tune={`$: s("bd*4").bank("tr707")
|
|
||||||
$: s("- sd").bank("tr909")`} />
|
<MiniRepl
|
||||||
|
client:idle
|
||||||
|
tune={`$: s("bd*4").bank("tr707")
|
||||||
|
$: s("- sd").bank("tr909")`}
|
||||||
|
/>
|
||||||
|
|
||||||
See also [stack](intro/#combining-patterns)
|
See also [stack](intro/#combining-patterns)
|
||||||
|
|
||||||
|
|
@ -122,23 +134,30 @@ See also [stack](intro/#combining-patterns)
|
||||||
|
|
||||||
With an additional underscore, a pattern can be muted.
|
With an additional underscore, a pattern can be muted.
|
||||||
|
|
||||||
<MiniRepl client:idle tune={`$: s("bd*4").bank("tr707")
|
<MiniRepl
|
||||||
_$: s("- sd").bank("tr909")`} />
|
client:idle
|
||||||
|
tune={`$: s("bd*4").bank("tr707")
|
||||||
|
_$: s("- sd").bank("tr909")`}
|
||||||
|
/>
|
||||||
|
|
||||||
See also [hush](/learn/conditional-modifiers/#hush)
|
See also [hush](/learn/conditional-modifiers/#hush)
|
||||||
|
|
||||||
## How can I arrange in Strudel using `mask`?
|
## How can I arrange in Strudel using `mask`?
|
||||||
|
|
||||||
With mini-notation, using the `<>` and `!` operators, you can try something like
|
With mini-notation, using the `<>` and `!` operators, you can try something like
|
||||||
|
|
||||||
```
|
```
|
||||||
.mask("<0!24 1!40>")
|
.mask("<0!24 1!40>")
|
||||||
```
|
```
|
||||||
|
|
||||||
It mutes a pattern for 24 cycles and plays it for 40. You would gain 64 cycles total, a multiple of 2/4/8 commonly used in western music.
|
It mutes a pattern for 24 cycles and plays it for 40. You would gain 64 cycles total, a multiple of 2/4/8 commonly used in western music.
|
||||||
|
|
||||||
If each cycle is a bar, as a starting point, you could write a mask like that for any pattern:
|
If each cycle is a bar, as a starting point, you could write a mask like that for any pattern:
|
||||||
|
|
||||||
```
|
```
|
||||||
.mask("<0!16 0!16 0!16 0!16 0!16 0!10>")
|
.mask("<0!16 0!16 0!16 0!16 0!16 0!10>")
|
||||||
```
|
```
|
||||||
|
|
||||||
It mutes it throughout.
|
It mutes it throughout.
|
||||||
|
|
||||||
For arranging, you could add the same mask to each part and replace some zeroes with ones in your different masks to make parts play.
|
For arranging, you could add the same mask to each part and replace some zeroes with ones in your different masks to make parts play.
|
||||||
|
|
@ -161,6 +180,7 @@ This would lowpass filter sweep everything every 8 cycles.
|
||||||
Take [Pachelbel's Canon in D](https://en.wikipedia.org/wiki/Pachelbel%27s_Canon#Analysis) as an example which has 4 voices (one cello and 3 violins) which have repeating patterns, as seen in the link above.
|
Take [Pachelbel's Canon in D](https://en.wikipedia.org/wiki/Pachelbel%27s_Canon#Analysis) as an example which has 4 voices (one cello and 3 violins) which have repeating patterns, as seen in the link above.
|
||||||
|
|
||||||
The following snipped defines the patterns as constants which can then be used for the different voices. `arrange` takes multiple arguments, which are each a number of cycles and a pattern which is played for the number of cycles, wrapped in `[]` If the pattern is shorter than the number, it is repeated.
|
The following snipped defines the patterns as constants which can then be used for the different voices. `arrange` takes multiple arguments, which are each a number of cycles and a pattern which is played for the number of cycles, wrapped in `[]` If the pattern is shorter than the number, it is repeated.
|
||||||
|
|
||||||
<MiniRepl client:idle tune={`const cello = note(
|
<MiniRepl client:idle tune={`const cello = note(
|
||||||
"<[d3 a2 b2 f#2] [g2 d3 g2 a2]>")
|
"<[d3 a2 b2 f#2] [g2 d3 g2 a2]>")
|
||||||
.color("grey").sound("gm_tremolo_strings:3")
|
.color("grey").sound("gm_tremolo_strings:3")
|
||||||
|
|
@ -177,31 +197,31 @@ The following snipped defines the patterns as constants which can then be used f
|
||||||
"<[f#4 d4 e4 c#5 d5 f#5 a5 a4] [b4 g4 a4 f#4 d4 d5 [d5@3 c#5]@2]>")
|
"<[f#4 d4 e4 c#5 d5 f#5 a5 a4] [b4 g4 a4 f#4 d4 d5 [d5@3 c#5]@2]>")
|
||||||
.color("red")
|
.color("red")
|
||||||
|
|
||||||
|
cello$: arrange(
|
||||||
cello$: arrange(
|
|
||||||
[2, silence],
|
[2, silence],
|
||||||
[18,cello])
|
[18,cello])
|
||||||
violin1$: arrange(
|
violin1$: arrange(
|
||||||
[4,silence],
|
[4,silence],
|
||||||
[2,violin_p1], [2,violin_p2],
|
[2,violin_p1], [2,violin_p2],
|
||||||
[2,violin_p3], [2,violin_p4],
|
[2,violin_p3], [2,violin_p4],
|
||||||
[2,violin_p1], [2,violin_p2],
|
[2,violin_p1], [2,violin_p2],
|
||||||
[2,violin_p3], [2,violin_p4]
|
[2,violin_p3], [2,violin_p4]
|
||||||
).sound("gm_tremolo_strings:0")
|
).sound("gm_tremolo_strings:0")
|
||||||
violin2$: arrange(
|
violin2$: arrange(
|
||||||
[6,silence], [2,violin_p1],
|
[6,silence], [2,violin_p1],
|
||||||
[2,violin_p2], [2,violin_p3],
|
[2,violin_p2], [2,violin_p3],
|
||||||
[2,violin_p4], [2,violin_p1],
|
[2,violin_p4], [2,violin_p1],
|
||||||
[2,violin_p2], [2,violin_p3]
|
[2,violin_p2], [2,violin_p3]
|
||||||
).sound("gm_tremolo_strings:1")
|
).sound("gm_tremolo_strings:1")
|
||||||
violin3$: arrange(
|
violin3$: arrange(
|
||||||
[8,silence],
|
[8,silence],
|
||||||
[2,violin_p1], [2,violin_p2],
|
[2,violin_p1], [2,violin_p2],
|
||||||
[2,violin_p3], [2,violin_p4],
|
[2,violin_p3], [2,violin_p4],
|
||||||
[2,violin_p1], [2,violin_p2]
|
[2,violin_p1], [2,violin_p2]
|
||||||
).sound("gm_tremolo_strings:2")
|
).sound("gm_tremolo_strings:2")
|
||||||
|
|
||||||
all(x => x.release(.2))
|
all(x => x.release(.2))
|
||||||
|
|
||||||
`} />
|
`} />
|
||||||
|
|
||||||
Alternatively, you can also put the different patterns for the violins into one single array (`const violins = [violin_p1, violin_p2, violin_p3, violin_p4]`) and use a pattern as an index to `pick` the nth element of that array. This replaces the voices defined above. Here you use `0@2` to specifiy that the first item (i.e. with index `0`) is played for `2` cycles.
|
Alternatively, you can also put the different patterns for the violins into one single array (`const violins = [violin_p1, violin_p2, violin_p3, violin_p4]`) and use a pattern as an index to `pick` the nth element of that array. This replaces the voices defined above. Here you use `0@2` to specifiy that the first item (i.e. with index `0`) is played for `2` cycles.
|
||||||
|
|
@ -231,7 +251,7 @@ violin1$: "<~@4 0@2 1@2 2@2 3@2 0@2 1@2 2@2 3@2>".pick(violins)
|
||||||
.sound("gm_tremolo_strings:0")
|
.sound("gm_tremolo_strings:0")
|
||||||
violin2$: "<~@6 0@2 1@2 2@2 3@2 0@2 1@2 2@2>".pick(violins)
|
violin2$: "<~@6 0@2 1@2 2@2 3@2 0@2 1@2 2@2>".pick(violins)
|
||||||
.sound("gm_tremolo_strings:1")
|
.sound("gm_tremolo_strings:1")
|
||||||
violin3$: "<~@8 0@2 1@2 2@2 3@2 0@2 1@2 >".pick(violins)
|
violin3$: "<~@8 0@2 1@2 2@2 3@2 0@2 1@2 >".pick(violins)
|
||||||
.sound("gm_tremolo_strings:2")
|
.sound("gm_tremolo_strings:2")
|
||||||
all(x => x.release(.2))
|
all(x => x.release(.2))
|
||||||
`} />
|
`} />
|
||||||
|
|
@ -242,7 +262,7 @@ Try adding `.punchcard()` after the `release(.2)` for a visualization.
|
||||||
|
|
||||||
## I saw Switch Angel using functions which I cannot find in the reference (e.g. `trancegate`). How do I make it work?
|
## I saw Switch Angel using functions which I cannot find in the reference (e.g. `trancegate`). How do I make it work?
|
||||||
|
|
||||||
Methods like `trancegate()`, `rlpf()` and `acidenv()` are currently not pattern methods which come natively with strudel.
|
Methods like `trancegate()`, `rlpf()` and `acidenv()` are currently not pattern methods which come natively with strudel.
|
||||||
|
|
||||||
It's part of a script for strudel which was written by Switch Angel and published [here](https://github.com/switchangel/strudel-scripts/blob/main/allscripts.js)
|
It's part of a script for strudel which was written by Switch Angel and published [here](https://github.com/switchangel/strudel-scripts/blob/main/allscripts.js)
|
||||||
|
|
||||||
|
|
@ -258,17 +278,19 @@ They are not aliases of each other, in contrast to `s` and `sound`.
|
||||||
|
|
||||||
The method `note` is used to reference a certain note (either as its name, such as `c` or `b2` or the midi number `69`, for example `note("c3 e3 g3")`).
|
The method `note` is used to reference a certain note (either as its name, such as `c` or `b2` or the midi number `69`, for example `note("c3 e3 g3")`).
|
||||||
|
|
||||||
On the other hand, `n` is a way to reference the nth index of something. This something can be a scale (eg `n("0 2 4").scale("C:major")`) , but it can also be a particular note in a chord (see https://strudel.cc/recipes/recipes/#arpeggios for an example) .
|
On the other hand, `n` is a way to reference the nth index of something. This something can be a scale (eg `n("0 2 4").scale("C:major")`) , but it can also be a particular note in a chord (see https://strudel.cc/recipes/recipes/#arpeggios for an example) .
|
||||||
|
|
||||||
The method `n` can also be used for something completely unrelated to notes like the nth sample from a sample map `s("hh*8").bank("RolandTR909").n("0 1 2 3")`. Note that `pick` does *not* use `n`.
|
The method `n` can also be used for something completely unrelated to notes like the nth sample from a sample map `s("hh*8").bank("RolandTR909").n("0 1 2 3")`. Note that `pick` does _not_ use `n`.
|
||||||
|
|
||||||
<MiniRepl client:idle tune={`"<0@2 1@2 2@2 3@2>".pickRestart([
|
<MiniRepl
|
||||||
|
client:idle
|
||||||
|
tune={`"<0@2 1@2 2@2 3@2>".pickRestart([
|
||||||
n("0 1 2 0"),
|
n("0 1 2 0"),
|
||||||
n("2 3 4 ~"),
|
n("2 3 4 ~"),
|
||||||
n("[4 5] [4 3] 2 0"),
|
n("[4 5] [4 3] 2 0"),
|
||||||
n("0 -3 0 ~")
|
n("0 -3 0 ~")
|
||||||
]).scale("C:major").s("piano")`} />
|
]).scale("C:major").s("piano")`}
|
||||||
|
/>{' '}
|
||||||
|
|
||||||
## Is there a cheat sheet for all symbols?
|
## Is there a cheat sheet for all symbols?
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue