-
+
-
@@ -429,7 +432,7 @@
-
-[Hydra](https://hydra.ojack.xyz/?sketch_id=mahalia_1) is a popular live-codable video synthesizer developed by [Olivia Jack](https://ojack.xyz/) and other contributors. It follows the metaphor of analog synthesizer patching to allow its user to create complex live visuals from a web browser window. Being very easy to use, extremely powerful and also very rewarding to use, Hydra has become a popular choice for adding visuals into a live code performance. Topos provides a simple way to integrate Hydra into a live coding session and to blend it with regular Topos code.
+[Hydra](https://hydra.ojack.xyz/?sketch_id=mahalia_1) is a popular live-codable video synthesizer developed by [Olivia Jack](https://ojack.xyz/) and other contributors. It follows an analog synthesizer patching metaphor to encourage live coding complex shaders. Being very easy to use, extremely powerful and also very rewarding to use, Hydra has become a popular choice for adding visuals into a live code performance.
${makeExample(
- "Hydra integration",
- `beat(4) :: app.hydra.osc(3, 0.5, 2).out()`,
- true
- )}
+ "Hydra integration",
+ `beat(4) :: hydra.osc(3, 0.5, 2).out()`,
+ true,
+)}
-You may feel like it's doing nothing! Press ${key_shortcut(
- "Ctrl+D"
- )} to close the documentation. **Boom, all shiny!**
+Close the documentation to see the effect: ${key_shortcut(
+ "Ctrl+D",
+ )}! **Boom, all shiny!**
-Be careful not to call
app.hydra too often as it can impact performances. You can use any rhythmical function like
mod() function to limit the number of function calls. You can write any Topos code like
[1,2,3].beat() to bring some life and movement in your Hydra sketches.
+Be careful not to call
hydra too often as it can impact performances. You can use any rhythmical function like
beat() function to limit the number of function calls. You can write any Topos code like
[1,2,3].beat() to bring some life and movement in your Hydra sketches.
Stopping **Hydra** is simple:
${makeExample(
- "Stopping Hydra",
- `
+ "Stopping Hydra",
+ `
beat(4) :: stop_hydra() // this one
-beat(4) :: app.hydra.hush() // or this one
+beat(4) :: hydra.hush() // or this one
`,
- true
- )}
+ true,
+)}
-I won't teach you how to play with Hydra. You can find some great resources on the [Hydra website](https://hydra.ojack.xyz/):
+
+### Changing the resolution
+
+You can change Hydra resolution using this simple method:
+
+${makeExample(
+ "Changing Hydra resolution",
+ `hydra.setResolution(1024, 768)`,
+ true,
+)}
+
+### Documentation
+
+I won't teach Hydra. You can find some great resources directly on the [Hydra website](https://hydra.ojack.xyz/):
- [Hydra interactive documentation](https://hydra.ojack.xyz/docs/)
- [List of Hydra Functions](https://hydra.ojack.xyz/api/)
- [Source code on GitHub](https://github.com/hydra-synth/hydra)
+### The Hydra namespace
+
+In comparison with the basic Hydra editor, please note that you have to prefix all Hydra functions with
hydra. to avoid conflicts with Topos functions. For example,
osc() becomes
hydra.osc().
+
+${makeExample("Hydra namespace", `hydra.voronoi(20).out()`, true)}
+
## GIF player
Topos embeds a small
.gif picture player with a small API. GIFs are automatically fading out after the given duration. Look at the following example:
${makeExample(
- "Playing many gifs",
- `
+ "Playing many gifs",
+ `
beat(0.25)::gif({
url:v('gif')[$(1)%6], // Any URL will do!
opacity: r(0.5, 1), // Opacity (0-1)
@@ -62,8 +81,8 @@ beat(0.25)::gif({
rotation: ir(1, 360), // Rotation (in degrees)
posX: ir(1,1200), // CSS Horizontal Position
posY: ir(1, 800), // CSS Vertical Position
-`, true
- )}
+`,
+ true,
+)}
`;
};
-
diff --git a/src/documentation/more/oscilloscope.ts b/src/documentation/more/oscilloscope.ts
index b75cf3d..7e43a23 100644
--- a/src/documentation/more/oscilloscope.ts
+++ b/src/documentation/more/oscilloscope.ts
@@ -5,11 +5,23 @@ export const oscilloscope = (application: Editor): string => {
const makeExample = makeExampleFactory(application);
return `# Oscilloscope
-You can turn on the oscilloscope to generate interesting visuals or to inspect audio. Use the
scope() function to turn it on and off. The oscilloscope is off by default.
+You can turn on the oscilloscope to generate interesting visuals or to inspect audio. Use the
scope() function to turn on/off the oscilloscope and to configure it. The oscilloscope is off by default.
+
+You need to manually feed the scope with the sounds you want to inspect:
${makeExample(
- "Oscilloscope configuration",
- `
+ "Feeding a sine to the oscilloscope",
+ `
+beat(1)::sound('sine').freq(200).ad(0, .2).scope().out()
+`,
+ true,
+)}
+
+Here is a layout of the scope configuration options:
+
+${makeExample(
+ "Oscilloscope configuration",
+ `
scope({
enabled: true, // off by default
color: "#fdba74", // any valid CSS color or "random"
@@ -23,12 +35,12 @@ scope({
refresh: 1 // refresh rate (in pulses)
})
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Demo with multiple scope mode",
- `
+ "Demo with multiple scope mode",
+ `
rhythm(.5, [4,5].dur(4*3, 4*1), 8)::sound('fhardkick').out()
beat(0.25)::sound('square').freq([
[250, 250/2, 250/4].pick(),
@@ -44,8 +56,8 @@ scope({enabled: true, thickness: 8,
color: ['purple', 'green', 'random'].beat(),
size: 0.5, fftSize: 2048})
`,
- true
- )}
+ true,
+)}
Note that these values can be patterned as well! You can transform the oscilloscope into its own light show if you want. The picture is not stable anyway so you won't have much use of it for precision work :)
diff --git a/src/documentation/patterns.ts b/src/documentation/patterns.ts
index 34262cd..9e5e437 100644
--- a/src/documentation/patterns.ts
+++ b/src/documentation/patterns.ts
@@ -10,24 +10,24 @@ export const patterns = (application: Editor): string => {
It means that the following:
${makeExample(
- "Boring kick",
- `
+ "Boring kick",
+ `
beat(1)::sound('kick').out()
`,
- true
- )}
+ true,
+)}
can be turned into something more interesting like this easily:
${makeExample(
- "Less boring kick",
- `
+ "Less boring kick",
+ `
let c = [1,2].dur(3, 1)
beat([1, 0.5, 0.25].dur(0.75, 0.25, 1) / c)::sound(['kick', 'fsoftsnare'].beat(0.75))
.ad(0, .25).shape(usine(1/2)*0.5).speed([1, 2, 4].beat(0.5)).out()
`,
- true
- )}
+ true,
+)}
**Topos** comes with a lot of array methods to deal with musical patterns of increasing complexity. Some knowledge of patterns and how to use them will help you to break out of simple loops and repeating structures. The most basic JavaScript data structure is the [Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array). Topos is extending it with custom methods to describe patterns that evolve over time. These methods can often be chained to compose more complex expressions:
[1, 2, 3].repeatOdd(5).palindrome().beat().
@@ -37,18 +37,18 @@ beat([1, 0.5, 0.25].dur(0.75, 0.25, 1) / c)::sound(['kick', 'fsoftsnare'].beat(0
-
beat(division: number): this method will return the next value in the list every _n_ pulses. By default,
1 equals to one beat but integer and floating point number values are supported as well. This method is extremely powerful and can be used for many different purposes. Check out the examples.
${makeExample(
- "Light drumming",
- `
+ "Light drumming",
+ `
// Every bar, use a different rhythm
beat([1, 0.75].beat(4)) :: sound('cp').out()
beat([0.5, 1].beat(4)) :: sound('kick').out()
beat(2)::snd('snare').shape(.5).out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Using beat to create arpeggios",
- `
+ "Using beat to create arpeggios",
+ `
// Arpeggio using pulse divisions
beat([.5, .25].beat(0.5)) :: sound('sine')
.lpf(100+usine(1/4)*400).lpad(2, 0, .25)
@@ -62,25 +62,25 @@ beat([.5, .25].beat(0.5)) :: sound('sine')
.delayfb(0.5)
.out()
`,
- false
- )}
+ false,
+)}
${makeExample(
- "Cool ambiance",
- `
+ "Cool ambiance",
+ `
beat(.5) :: snd(['kick', 'hat'].beat(0.5)).out()
beat([2,4].beat(2)) :: snd('shaker').delay(.5).delayfb(.75).delayt(0.125).out()
flip(2)::beat(1)::snd('froomy').out()
flip(4)::beat(2)::snd('pad').n(2).shape(.5)
.orbit(2).room(0.9).size(0.9).release(0.5).out()
`,
- false
- )}
+ false,
+)}
-
bar(value: number = 1): returns the next value every bar (if
value = 1). Using a larger value will return the next value every
n bars.
${makeExample(
- "A simple drumbeat in no time!",
- `
+ "A simple drumbeat in no time!",
+ `
beat(1)::sound(['kick', 'hat', 'snare', 'hat'].beat()).out()
beat([1/4, 1/2].dur(1.5, 0.5))::sound(['jvbass', 'fikea'].bar())
.ad(0, .25).room(0.5).size(2).resonance(0.15).lpf(
@@ -88,12 +88,12 @@ beat([1/4, 1/2].dur(1.5, 0.5))::sound(['jvbass', 'fikea'].bar())
* [1, 2].bar())
.out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Using beat and bar in the same example",
- `
+ "Using beat and bar in the same example",
+ `
beat(2)::snd('snare').out()
beat([1, 0.5].beat()) :: sound(['bass3'].bar())
.freq(100).n([12, 14].bar())
@@ -101,14 +101,14 @@ beat([1, 0.5].beat()) :: sound(['bass3'].bar())
.pan(r(0, 1))
.speed([1,2,3].beat())
.out()
-`
- )}
+`,
+)}
-
dur(...list: numbers[]) : keeps the same value for a duration of
n beats corresponding to the
nth number of the list you provide.
${makeExample(
- "Holding a value for n beats",
- `
+ "Holding a value for n beats",
+ `
// The second note is kept for twice as long
beat(0.5)::sound('notes').n([1,2].dur(1, 2))
.room(0.5).size(8).delay(0.125).delayt(1/8)
@@ -117,8 +117,8 @@ beat(0.5)::sound('notes').n([1,2].dur(1, 2))
beat(1)::sound(['kick', 'fsnare'].dur(3, 1))
.n([0,3].dur(3, 1)).out()
`,
- true
- )}
+ true,
+)}
## Manipulating notes and scales
@@ -126,63 +126,63 @@ beat(1)::sound(['kick', 'fsnare'].dur(3, 1))
-
pitch(): convert a list of integers to pitch classes
${makeExample(
- "Converting a list of integers to pitch classes using key and scale",
- `
+ "Converting a list of integers to pitch classes using key and scale",
+ `
beat(0.25) :: snd('sine')
.pitch([0,1,2,3,4,6,7,8].beat(0.125))
.key(["F4","F3"].beat(2.0))
.scale("minor").ad(0, .25).out()
`,
- true
- )}
+ true,
+)}
-
scale(scale: string, base note: number): Map each element of the list to the closest note of the slected scale. [0, 2, 3, 5 ].scale("major", 50) returns [50, 52,
54, 55]. You can use western scale names like (Major, Minor, Minor pentatonic ...) or [zeitler](https://ianring.com/musictheory/scales/traditions/zeitler) scale names. Alternatively you can also use the integers as used by Ian Ring in his [study of scales](https://ianring.com/musictheory/scales/).
${makeExample(
- "Mapping the note array to the E3 major scale",
- `
+ "Mapping the note array to the E3 major scale",
+ `
beat(1) :: snd('gtr')
.note([0, 5, 2, 1, 7].scale("Major", 52).beat())
.out()
`,
- true
- )}
+ true,
+)}
-
scaleArp(scale: string, mask: number): extrapolate a custom-masked scale from each list elements. [0].scale("major", 3) returns [0,2,4].
scaleArp supports the same scales as
scale.
${makeExample(
- "Extrapolate a 3-elements Mixolydian scale from 2 notes",
- `
+ "Extrapolate a 3-elements Mixolydian scale from 2 notes",
+ `
beat(1) :: snd('gtr')
.note([0, 5].scaleArp("mixolydian", 3).beat() + 50)
.out()
`,
- true
- )}
+ true,
+)}
## Iteration using the mouse
-
mouseX() /
mouseY(): divides the screen in
n zones and returns the value corresponding to the mouse position on screen.
${makeExample(
- "Controlling an arpeggio (octave and note) with mouse",
- `
+ "Controlling an arpeggio (octave and note) with mouse",
+ `
beat(0.25)::sound('wt_piano')
.note([0,2,3,4,5,7,8,9,11,12].scale(
'minor', 30 + [0,12,24].mouseY()).mouseX())
.room(0.5).size(4).lpad(-2, .2).lpf(500, 0.3)
.ad(0, .2).out()
`,
- true
- )}
+ true,
+)}
## Simple data operations
-
palindrome(): Concatenates a list with the same list in reverse.
${makeExample(
- "Palindrome filter sweep",
- `
+ "Palindrome filter sweep",
+ `
beat([1,.5,.25].beat()) :: snd('wt_stereo')
.speed([1, 0.5, 0.25])
.pan(r(0, 1)).freq([100,200,300].beat(0.25))
@@ -191,15 +191,15 @@ beat([1,.5,.25].beat()) :: snd('wt_stereo')
.lpf([500,1000,2000,4000].palindrome().beat())
.lpad(4, 0, .25).sustain(0.125).out()
`,
- true
- )}
+ true,
+)}
-
random(index: number): pick a random element in the given list.
-
rand(index: number): shorter alias for the same method.
${makeExample(
- "Sipping some gasoline at the robot bar",
- `
+ "Sipping some gasoline at the robot bar",
+ `
// rand, random and pick are doing the same thing!
beat(1)::snd('fhardkick').shape(0.5)
.ad(0, .1).lpf(500).db(-12).out()
@@ -210,69 +210,69 @@ beat([.5, 1].rand() / 2) :: snd(
.lpf([5000,3000,2000].pick())
.end(0.5).out()
`,
- true
- )}
+ true,
+)}
-
pick(): pick a random element in the list.
${makeExample(
- "Picking values in lists",
- `
+ "Picking values in lists",
+ `
beat(0.25)::sound(['ftabla', 'fwood'].pick())
.speed([1,2,3,4].pick()).ad(0, .125).n(ir(1,10))
.room(0.5).size(1).out()
`,
- true
- )}
+ true,
+)}
-
degrade(amount: number): removes _n_% of the list elements. Lists can be degraded as long as one element remains. The amount of degradation is given as a percentage.
${makeExample(
- "Amen break suffering from data loss",
- `
+ "Amen break suffering from data loss",
+ `
// Tweak the value to degrade this amen break even more!
beat(.25)::snd('amencutup').n([1,2,3,4,5,6,7,8,9].degrade(20).loop($(1))).out()
`,
- true
- )}
+ true,
+)}
-
repeat(amount: number): repeat every list elements _n_ times.
-
repeatEven(amount: number): repeat every pair element of the list _n_ times.
-
repeatOdd(amount: number): repeat every odd element of the list _n_ times.
${makeExample(
- "Repeating samples a given number of times",
- `
+ "Repeating samples a given number of times",
+ `
beat(.25)::sound('amencutup').n([1,2,3,4,5,6,7,8].repeat(4).beat(.25)).out()
`,
- true
- )}
+ true,
+)}
-
loop(index: number): loop takes one argument, the _index_. It allows you to iterate over a list using an iterator such as a counter. This is super useful to control how you are accessing values in a list without relying on a temporal method such as
.beat() or .bar().
${makeExample(
- "Don't you know how to count up to 5?",
- `
+ "Don't you know how to count up to 5?",
+ `
beat(1) :: sound('numbers').n([1,2,3,4,5].loop($(3, 10, 2))).out()
`,
- true
- )}
+ true,
+)}
-
shuffle(): this: shuffles a list! Simple enough!
${makeExample(
- "Shuffling a list for extra randomness",
- `
+ "Shuffling a list for extra randomness",
+ `
beat(1) :: sound('numbers').n([1,2,3,4,5].shuffle().loop($(1)).out()
`,
- true
- )}
+ true,
+)}
-
rotate(steps: number): rotate a list to the right _n_ times. The last value become the first, rinse and repeat.
${makeExample(
- "To make things more complex... here you go",
- `
+ "To make things more complex... here you go",
+ `
beat(.25) :: snd('sine').fmi([1.99, 2])
.ad(0, .125).lpf(500+r(1,400))
.lpad(usine()*8, 0, .125)
@@ -283,21 +283,21 @@ beat(.25) :: snd('sine').fmi([1.99, 2])
.beat(.25)) // while the index changes
.out()
`,
- true
- )}
+ true,
+)}
## Filtering
-
unique(): filter a list to remove repeated values.
${makeExample(
- "Demonstrative filtering. Final list is [100, 200]",
- `
+ "Demonstrative filtering. Final list is [100, 200]",
+ `
// Remove unique and 100 will repeat four times!
beat(1)::snd('sine').sustain(0.1).freq([100,100,100,100,200].unique().beat()).out()
`,
- true
- )}
+ true,
+)}
## Simple math operations
diff --git a/src/documentation/probabilities.ts b/src/documentation/probabilities.ts
index f48b4f2..b719c58 100644
--- a/src/documentation/probabilities.ts
+++ b/src/documentation/probabilities.ts
@@ -13,12 +13,12 @@ There are some simple functions to play with probabilities.
-
irand(min: number, max:number): returns a random integer between
min and
max. Shorthands
ir() or
rI().
${makeExample(
- "Bleep bloop, what were you expecting?",
- `
+ "Bleep bloop, what were you expecting?",
+ `
rhythm(0.125, 10, 16) :: sound('sid').n(4).note(50 + irand(50, 62) % 8).out()
`,
- true
- )}
+ true,
+)}
-
prob(p: number): return
true _p_% of time,
false in other cases.
@@ -26,14 +26,14 @@ rhythm(0.125, 10, 16) :: sound('sid').n(4).note(50 + irand(50, 62) % 8).out()
${makeExample(
- "The Teletype experience!",
- `
+ "The Teletype experience!",
+ `
prob(50) :: script(1);
prob(60) :: script(2);
prob(80) :: script(toss() ? script(3) : script(4))
`,
- true
- )}
+ true,
+)}
-
seed(val: number|string): sets the seed of the random number generator. You can use a number or a string. The same seed will always return the same sequence of random numbers.
@@ -58,28 +58,28 @@ By default chance operators will be evaluated 48 times within a beat. You can ch
Examples:
${makeExample(
- "Using chance operators",
- `
+ "Using chance operators",
+ `
rarely() :: sound('hh').out(); // Rarely 48 times is still a lot
rarely(4) :: sound('bd').out(); // Rarely in 4 beats is bit less
rarely(8) :: sound('east').out(); // Rarely in 8 beats is even less
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Using chance with other operators",
- `
+ "Using chance with other operators",
+ `
frequently() :: beat(1) :: sound('kick').out();
often() :: beat(0.5) :: sound('hh').out();
sometimes() :: onbeat(1,3) :: sound('snare').out();
`,
- false
- )}
+ false,
+)}
${makeExample(
- "Using chance with chaining",
- `
+ "Using chance with chaining",
+ `
beat(0.5) && sound("bd")
.freq(100)
.sometimes(s=>s.crush(2.5))
@@ -91,8 +91,7 @@ ${makeExample(
.almostNever(n=>n.freq(400))
.out()
`,
- false
- )}
-`
-}
-
+ false,
+)}
+`;
+};
diff --git a/src/documentation/samples/loading_samples.ts b/src/documentation/samples/loading_samples.ts
index eefaf7b..e6c54f5 100644
--- a/src/documentation/samples/loading_samples.ts
+++ b/src/documentation/samples/loading_samples.ts
@@ -12,36 +12,36 @@ Topos is exposing the
samples function that you can use to load your ow
Samples are loaded on-the-fly from the web. Topos is a web application living in the browser. It is running in a sandboxed environment. Thus, it cannot have access to the files stored on your local system. Loading samples requires building a _map_ of the audio files, where a name is associated to a specific file:
${makeExample(
- "Loading samples from a map",
- `samples({
+ "Loading samples from a map",
+ `samples({
bd: ['bd/BT0AADA.wav','bd/BT0AAD0.wav'],
sd: ['sd/rytm-01-classic.wav','sd/rytm-00-hard.wav'],
hh: ['hh27/000_hh27closedhh.wav','hh/000_hh3closedhh.wav'],
}, 'github:tidalcycles/Dirt-Samples/master/');`,
- true
- )}
+ true,
+)}
This example is loading two samples from each folder declared in the original repository (in the
strudel.json file). You can then play with them using the syntax you are already used to:
${makeExample(
- "Playing with the loaded samples",
- `rhythm(.5, 5, 8)::sound('bd').n(ir(1,2)).end(1).out()
+ "Playing with the loaded samples",
+ `rhythm(.5, 5, 8)::sound('bd').n(ir(1,2)).end(1).out()
`,
- true
- )}
+ true,
+)}
Internally, Topos is loading samples using a different technique where sample maps are directly taken from the previously mentioned
strudel.json file that lives in each repository:
${makeExample(
- "This is how Topos is loading its own samples",
- `
+ "This is how Topos is loading its own samples",
+ `
// Visit the concerned repos and search for 'strudel.json'
samples("github:tidalcycles/Dirt-Samples/master");
samples("github:Bubobubobubobubo/Dough-Samples/main");
samples("github:Bubobubobubobubo/Dough-Amiga/main");
`,
- true
- )}
+ true,
+)}
To learn more about the audio sample loading mechanism, please refer to [this page](https://strudel.tidalcycles.org/learn/samples) written by Felix Roos who has implemented the sample loading mechanism. The API is absolutely identic in Topos!
@@ -50,16 +50,17 @@ To learn more about the audio sample loading mechanism, please refer to [this pa
You can load samples coming from [Freesound](https://freesound.org/) using the [Shabda](https://shabda.ndre.gr/) API. To do so, study the following example:
${makeExample(
- "Loading samples from shabda",
- `
+ "Loading samples from shabda",
+ `
// Prepend the sample you want with 'shabda:'
samples("shabda:ocean")
// Use the sound without 'shabda:'
beat(1)::sound('ocean').clip(1).out()
-`, true
- )}
+`,
+ true,
+)}
You can also use the
.n attribute like usual to load a different sample.
-`
-}
+`;
+};
diff --git a/src/documentation/samples/sample_banks.ts b/src/documentation/samples/sample_banks.ts
index 78bd02d..d5b8199 100644
--- a/src/documentation/samples/sample_banks.ts
+++ b/src/documentation/samples/sample_banks.ts
@@ -9,5 +9,5 @@ export const sample_banks = (application: Editor): string => {
There is a
bank attribute that can help you to sort audio samples from large collections.
**AJKPercusyn**, **AkaiLinn**, **AkaiMPC60**, **AkaiXR10**, **AlesisHR16**, **AlesisSR16**, **BossDR110**, **BossDR220**, **BossDR55**, **BossDR550**, **BossDR660**, **CasioRZ1**, **CasioSK1**, **CasioVL1**, **DoepferMS404**, **EmuDrumulator**, **EmuModular**, **EmuSP12**, **KorgDDM110**, **KorgKPR77**, **KorgKR55**, **KorgKRZ**, **KorgM1**, **KorgMinipops**, **KorgPoly800**, **KorgT3**, **Linn9000**, **LinnDrum**, **LinnLM1**, **LinnLM2**, **MFB512**, **MPC1000**, **MoogConcertMateMG1**, **OberheimDMX**, **RhodesPolaris**, **RhythmAce**, **RolandCompurhythm1000**, **RolandCompurhythm78**, **RolandCompurhythm8000**, **RolandD110**, **RolandD70**, **RolandDDR30**, **RolandJD990**, **RolandMC202**, **RolandMC303**, **RolandMT32**, **RolandR8**, **RolandS50**, **RolandSH09**, **RolandSystem100**, **RolandTR505**, **RolandTR606**, **RolandTR626**, **RolandTR707**, **RolandTR727**, **RolandTR808**, **RolandTR909**, **SakataDPM48**, **SequentialCircuitsDrumtracks**, **SequentialCircuitsTom**, **SergeModular**, **SimmonsSDS400**, **SimmonsSDS5**, **SoundmastersR88**, **UnivoxMicroRhythmer12**, **ViscoSpaceDrum**, **XdrumLM8953**, **YamahaRM50**, **YamahaRX21**, **YamahaRX5**, **YamahaRY30**, **YamahaTG33**.
-`
-}
+`;
+};
diff --git a/src/documentation/samples/sample_list.ts b/src/documentation/samples/sample_list.ts
index 932cf66..b8ba417 100644
--- a/src/documentation/samples/sample_list.ts
+++ b/src/documentation/samples/sample_list.ts
@@ -1,7 +1,10 @@
import { type Editor } from "../../main";
import { makeExampleFactory } from "../../Documentation";
-export const samples_to_markdown = (application: Editor, tag_filter?: string) => {
+export const samples_to_markdown = (
+ application: Editor,
+ tag_filter?: string,
+) => {
let samples = application.api._all_samples();
let markdownList = "";
let keys = Object.keys(samples);
@@ -44,13 +47,11 @@ export const injectAllSamples = (application: Editor): string => {
return generatedPage;
};
-
export const injectDrumMachineSamples = (application: Editor): string => {
let generatedPage = samples_to_markdown(application, "Machines");
return generatedPage;
};
-
export const sample_list = (application: Editor): string => {
// @ts-ignore
const makeExample = makeExampleFactory(application);
@@ -63,9 +64,13 @@ On this page, you will find an exhaustive list of all the samples currently load
A very large collection of wavetables for wavetable synthesis. This collection has been released by Kristoffer Ekstrand: [AKWF Waveforms](https://www.adventurekid.se/akrt/waveforms/adventure-kid-waveforms/). Every sound sample that starts with
wt_ will be looped. Look at this demo:
-${makeExample("Wavetable synthesis made easy :)", `
+${makeExample(
+ "Wavetable synthesis made easy :)",
+ `
beat(0.5)::sound('wt_stereo').n([0, 1].pick()).ad(0, .25).out()
-`, true)}
+`,
+ true,
+)}
Pick one folder and spend some time exploring it. There is a lot of different waveforms.
@@ -79,9 +84,12 @@ ${samples_to_markdown(application, "Waveforms")}
A set of 72 classic drum machines created by **Geikha**: [Geikha Drum Machines](https://github.com/geikha/tidal-drum-machines). To use them efficiently, it is best to use the
.bank() parameter like so:
${makeExample(
- "Using a classic drum machine", `
+ "Using a classic drum machine",
+ `
beat(0.5)::sound(['bd', 'cp'].pick()).bank("AkaiLinn").out()
-`, true)}
+`,
+ true,
+)}
Here is the complete list of available machines:
@@ -111,10 +119,12 @@ ${samples_to_markdown(application, "Amiga")}
A collection of many different amen breaks. Use
.stretch() to play with these:
${makeExample(
- "Stretching an amen break", `
+ "Stretching an amen break",
+ `
beat(4)::sound('amen1').stretch(4).out()
-`, true,
- )}
+`,
+ true,
+)}
The stretch should be adapted based on the length of each amen break.
@@ -130,5 +140,13 @@ Many live coders are expecting to find the Tidal sample library wherever they go
${samples_to_markdown(application, "Tidal")}
-`
-}
+
+## Juliette's voice
+
+This sample pack is only one folder full of french phonems! It sounds super nice.
+
+
+${samples_to_markdown(application, "Juliette")}
+
+`;
+};
diff --git a/src/documentation/synths.ts b/src/documentation/synths.ts
index d15325f..fec806b 100644
--- a/src/documentation/synths.ts
+++ b/src/documentation/synths.ts
@@ -13,42 +13,42 @@ Topos comes by default with a forever-increasing number of synthesis capabilitie
The
sound function can take the name of a synthesizer or waveform as first argument. This has for effect to turn the sampler we all know and love into a synthesizer.
sine,
sawtooth,
triangle,
square are the names used to select classic oscillator waveforms. Note that you can also make use of filters and envelopes to shape the sound to your liking.
${makeExample(
- "Listening to the different waveforms from the sweetest to the harshest",
- `
+ "Listening to the different waveforms from the sweetest to the harshest",
+ `
beat(.5) && snd(['sine', 'triangle', 'sawtooth', 'square'].beat()).freq(100).out()
`,
- true
- )}
+ true,
+)}
Note that you can also use noise if you do not want to use a periodic oscillator:
${makeExample(
- "Listening to the different types of noise",
- `
+ "Listening to the different types of noise",
+ `
beat(.5) && snd(['brown', 'pink', 'white'].beat()).adsr(0,.1,0,0).out()
`,
- true
- )}
+ true,
+)}
Two functions are primarily used to control the frequency of the synthesizer:
-
freq(hz: number): sets the frequency of the oscillator.
-
note(note: number|string): sets the MIDI note of the oscillator (MIDI note converted to hertz).
${makeExample(
- "Selecting a pitch",
- `
+ "Selecting a pitch",
+ `
beat(.5) && snd('triangle').freq([100,200,400].beat(2)).out()
`,
- true
- )}
+ true,
+)}
${makeExample(
"Selecting a note",
`
beat(.5) && snd('triangle').note([60,"F4"].pick()).out()
`,
- true
+ true,
)}
Chords can also played using different parameters:
@@ -56,44 +56,44 @@ Chords can also played using different parameters:
-
chord(string||number[]|...number): parses and sets notes for the chord
${makeExample(
- "Playing a named chord",
- `
+ "Playing a named chord",
+ `
beat(1) && snd('triangle').chord(["C","Em7","Fmaj7","Emin"].beat(2)).adsr(0,.2).out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Playing a chord from a list of notes and doing inversions",
- `
+ "Playing a chord from a list of notes and doing inversions",
+ `
beat(.5) && snd('triangle').chord(60,64,67,72).invert([1,-3,4,-5].pick()).adsr(0,.2).out()
`,
- true
- )}
+ true,
+)}
## Vibrato
You can also add some amount of vibrato to the sound using the
vib and
vibmod methods. These can turn any oscillator into something more lively and/or into a sound effect when used with a high amount of modulation.
${makeExample(
- "Different vibrato settings",
- `
+ "Different vibrato settings",
+ `
tempo(140);
beat(1) :: sound('triangle')
.freq(400).release(0.2)
.vib([1/2, 1, 2, 4].beat())
.vibmod([1,2,4,8].beat(2))
.out()`,
- true
- )}
+ true,
+)}
## Noise
A certain amount of brown noise can be added by using the
.noise key:
${makeExample(
- "Different vibrato settings",
- `
+ "Different vibrato settings",
+ `
tempo(140);
beat(1) :: sound('triangle')
.freq(400).release(0.2)
@@ -101,8 +101,8 @@ beat(1) :: sound('triangle')
.vib([1/2, 1, 2, 4].beat())
.vibmod([1,2,4,8].beat(2))
.out()`,
- true
- )}
+ true,
+)}
## Controlling the amplitude
@@ -112,16 +112,16 @@ Controlling the amplitude and duration of the sound can be done using various te
-
velocity(velocity: number): sets the velocity of the oscillator (velocity is a multiple of gain).
${makeExample(
- "Setting the gain",
- `beat(0.25) :: sound('sawtooth').gain([0.0, 1/8, 1/4, 1/2, 1].beat(0.5)).out()`,
- true
- )}
+ "Setting the gain",
+ `beat(0.25) :: sound('sawtooth').gain([0.0, 1/8, 1/4, 1/2, 1].beat(0.5)).out()`,
+ true,
+)}
${makeExample(
- "Setting the velocity",
- `beat(0.25) :: sound('sawtooth').velocity([0.0, 1/8, 1/4, 1/2, 1].beat(0.5)).out()`,
- true
- )}
+ "Setting the velocity",
+ `beat(0.25) :: sound('sawtooth').velocity([0.0, 1/8, 1/4, 1/2, 1].beat(0.5)).out()`,
+ true,
+)}

@@ -134,45 +134,45 @@ ${makeExample(
-
release(release: number) /
rel(rel: number): sets the release time of the envelope.
${makeExample(
- "Using decay and sustain to set the ADSR envelope",
- `
+ "Using decay and sustain to set the ADSR envelope",
+ `
beat(0.5) :: sound('wt_piano')
.cutoff(1000 + usine() * 4000)
.freq(100).decay(.2)
.sustain([0.1,0.5].beat(4))
.out()`,
- true
- )}
+ true,
+)}
This ADSR envelope design is important to know because it is used for other aspects of the synthesis engine such as the filters that we are now going to talk about. But wait, I've kept the best for the end. The
adsr() combines all the parameters together. It is a shortcut for setting the ADSR envelope:
-
adsr(attack: number, decay: number, sustain: number, release: number): sets the ADSR envelope.
${makeExample(
- "Replacing the previous example with the adsr() method",
- `
+ "Replacing the previous example with the adsr() method",
+ `
beat(0.5) :: sound('wt_piano')
.cutoff(1000 + usine() * 4000)
.freq(100)
.adsr(0, .2, [0.1,0.5].beat(4), 0)
.out()
`,
- true
- )}
+ true,
+)}
-
ad(attack: number, decay: number): sets the attack and decay phases, setting sustain and release to
0.
${makeExample(
- "Two segment envelope",
- `
+ "Two segment envelope",
+ `
beat(0.5) :: sound('wt_piano')
.cutoff(1000 + usine() * 4000)
.freq(100)
.ad(0, .2)
.out()
`,
- true
- )}
+ true,
+)}
## Substractive synthesis using filters
@@ -183,10 +183,10 @@ The most basic synthesis technique used since the 1970s is called substractive s
- **bandpass filter**: filters the low and high frequencies around a frequency band, keeping what's in the middle.
${makeExample(
- "Filtering the high frequencies of an oscillator",
- `beat(.5) :: sound('sawtooth').cutoff(50 + usine(1/8) * 2000).out()`,
- true
- )}
+ "Filtering the high frequencies of an oscillator",
+ `beat(.5) :: sound('sawtooth').cutoff(50 + usine(1/8) * 2000).out()`,
+ true,
+)}
These filters all come with their own set of parameters. Note that we are describing the parameters of the three different filter types here. Choose the right parameters depending on the filter type you are using:
@@ -199,10 +199,10 @@ These filters all come with their own set of parameters. Note that we are descri
|
resonance |
lpq | resonance of the lowpass filter (0-1) |
${makeExample(
- "Filtering a bass",
- `beat(.5) :: sound('jvbass').lpf([250,1000,8000].beat()).out()`,
- true
- )}
+ "Filtering a bass",
+ `beat(.5) :: sound('jvbass').lpf([250,1000,8000].beat()).out()`,
+ true,
+)}
### Highpass filter
@@ -212,10 +212,10 @@ ${makeExample(
|
hresonance |
hpq | resonance of the highpass filter (0-1) |
${makeExample(
- "Filtering a noise source",
- `beat(.5) :: sound('gtr').hpf([250,1000, 2000, 3000, 4000].beat()).end(0.5).out()`,
- true
- )}
+ "Filtering a noise source",
+ `beat(.5) :: sound('gtr').hpf([250,1000, 2000, 3000, 4000].beat()).end(0.5).out()`,
+ true,
+)}
### Bandpass filter
@@ -225,10 +225,10 @@ ${makeExample(
|
bandq |
bpq | resonance of the bandpass filter (0-1) |
${makeExample(
- "Sweeping the filter on the same guitar sample",
- `beat(.5) :: sound('gtr').bandf(100 + usine(1/8) * 4000).end(0.5).out()`,
- true
- )}
+ "Sweeping the filter on the same guitar sample",
+ `beat(.5) :: sound('gtr').bandf(100 + usine(1/8) * 4000).end(0.5).out()`,
+ true,
+)}
Alternatively,
lpf,
hpf and
bpf can take a second argument, the **resonance**.
@@ -239,38 +239,38 @@ You can also use the
ftype method to change the filter type (order). Th
-
ftype(type: string): sets the filter type (order), either
12db or
24db.
${makeExample(
- "Filtering a bass",
- `beat(.5) :: sound('jvbass').ftype(['12db', '24db'].beat(4)).lpf([250,1000,8000].beat()).out()`,
- true
- )}
+ "Filtering a bass",
+ `beat(.5) :: sound('jvbass').ftype(['12db', '24db'].beat(4)).lpf([250,1000,8000].beat()).out()`,
+ true,
+)}
I also encourage you to study these simple examples to get more familiar with the construction of basic substractive synthesizers:
${makeExample(
- "Simple synthesizer voice with filter",
- `
+ "Simple synthesizer voice with filter",
+ `
beat(.5) && snd('sawtooth')
.cutoff([2000,500].pick() + usine(.5) * 4000)
.resonance(0.2).freq([100,150].pick())
.out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Blessed by the square wave",
- `
+ "Blessed by the square wave",
+ `
beat(4) :: [100,101].forEach((freq) => sound('square').freq(freq).sustain(0.1).out())
beat(.5) :: [100,101].forEach((freq) => sound('square').freq(freq*2).sustain(0.01).out())
beat([.5, .75, 2].beat()) :: [100,101].forEach((freq) => sound('square')
.freq(freq*4 + usquare(2) * 200).sustain(0.125).out())
beat(.25) :: sound('square').freq(100*[1,2,4,8].beat()).sustain(0.1).out()`,
- false
- )}
+ false,
+)}
${makeExample(
- "Ghost carillon (move your mouse!)",
- `
+ "Ghost carillon (move your mouse!)",
+ `
beat(1/8)::sound('sine')
.velocity(rand(0.0, 1.0))
.delay(0.75).delayt(.5)
@@ -279,8 +279,8 @@ beat(1/8)::sound('sine')
.freq(mouseX())
.gain(0.25)
.out()`,
- false
- )}
+ false,
+)}
## Filter envelopes
@@ -299,12 +299,12 @@ The examples we have studied so far are static. They filter the sound around a f
${makeExample(
- "Filtering a sawtooth wave dynamically",
- `beat(.5) :: sound('sawtooth').note([48,60].beat())
+ "Filtering a sawtooth wave dynamically",
+ `beat(.5) :: sound('sawtooth').note([48,60].beat())
.cutoff(5000).lpa([0.05, 0.25, 0.5].beat(2))
.lpenv(-8).lpq(10).out()`,
- true
- )}
+ true,
+)}
### Highpass envelope
@@ -319,12 +319,12 @@ ${makeExample(
${makeExample(
- "Let's use another filter using the same example",
- `beat(.5) :: sound('sawtooth').note([48,60].beat())
+ "Let's use another filter using the same example",
+ `beat(.5) :: sound('sawtooth').note([48,60].beat())
.hcutoff(1000).hpa([0.05, 0.25, 0.5].beat(2))
.hpenv(8).hpq(10).out()`,
- true
- )}
+ true,
+)}
### Bandpass envelope
@@ -339,14 +339,14 @@ ${makeExample(
${makeExample(
- "And the bandpass filter, just for fun",
- `beat(.5) :: sound('sawtooth').note([48,60].beat())
+ "And the bandpass filter, just for fun",
+ `beat(.5) :: sound('sawtooth').note([48,60].beat())
.bandf([500,1000,2000].beat(2))
.bpa([0.25, 0.125, 0.5].beat(2) * 4)
.bpenv(-4).release(2).out()
`,
- true
- )}
+ true,
+)}
## Wavetable synthesis
@@ -354,8 +354,8 @@ ${makeExample(
Topos can also do wavetable synthesis. Wavetable synthesis allows you to use any sound file as a source to build an oscillator. By default, Topos comes with more than 1000 waveforms thanks to the awesome [AKWF](https://www.adventurekid.se/akrt/waveforms/adventure-kid-waveforms/) pack made by Kristoffer Ekstrand. Any sample name that contains
wt_ as a prefix will be interpreted by the sampler as a wavetable and thus as an oscillator. See for yourself:
${makeExample(
- "Acidity test",
- `
+ "Acidity test",
+ `
beat(.25) :: sound('wt_symetric:8').note([50,55,57,60].beat(.25) - [12,0]
.pick()).ftype('12db').adsr(0.05/4, 1/16, 0.25/4, 0)
.cutoff(1500 + usine(1/8) * 5000).lpadsr(16, 0.2, 0.2, 0.125/2, 0)
@@ -363,15 +363,15 @@ beat(.25) :: sound('wt_symetric:8').note([50,55,57,60].beat(.25) - [12,0]
beat(1) :: sound('kick').n(4).out()
beat(2) :: sound('snare').out()
beat(.5) :: sound('hh').out()`,
- true
- )}
+ true,
+)}
Let's explore the galaxy of possible waveforms. It can be hard to explore them all, there is a **lot** of them:
${makeExample(
- "Let's explore some wavetables",
- `
+ "Let's explore some wavetables",
+ `
// Exploring a vast galaxy of waveforms
let collection = [
'wt_sinharm', 'wt_linear', 'wt_bw_sawrounded',
@@ -381,8 +381,8 @@ beat(2) :: v('selec', irand(1, 100))
beat(2) :: v('swave', collection.pick())
beat(0.5) :: sound(v('swave')).n(v('selec')).out()
`,
- true
- )}
+ true,
+)}
You can work with them just like with any other waveform. Having so many of them makes them also very useful for generating sound effects, percussive, sounds, etc...
@@ -397,8 +397,8 @@ Another really useful technique to know about is FM synthesis, FM standing for _
There is also an additional parameter,
fm that combines
fmi and
fmh using strings:
fm('2:4'). Think of it as a static shortcut for getting some timbres more quickly.
${makeExample(
- "80s nostalgia",
- `
+ "80s nostalgia",
+ `
beat([.5, 1].beat(8)) && snd('triangle').adsr(0.02, 0.5, 0.5, 0.25)
.fmi(2).fmh(1.5).note([60,55, 60, 63].beat() - 12)
.pan(noise()).out()
@@ -407,23 +407,23 @@ beat(.25) && snd('triangle').adsr(0.02, 0.1, 0.1, 0.1)
.pan(noise()).note([60,55, 60, 63].beat() + [0, 7].pick()).out()
beat(2) :: sound('cp').room(1).sz(1).out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Giving some love to ugly inharmonic sounds",
- `
+ "Giving some love to ugly inharmonic sounds",
+ `
beat([.5, .25].bar()) :: sound('sine').fm('2.2183:3.18293').sustain(0.05).out()
beat([4].bar()) :: sound('sine').fm('5.2183:4.5').sustain(0.05).out()
beat(.5) :: sound('sine')
.fmh([1, 1.75].beat())
.fmi($(1) % 30).orbit(2).room(0.5).out()`,
- true
- )}
+ true,
+)}
${makeExample(
- "Peace and serenity through FM synthesis",
- `
+ "Peace and serenity through FM synthesis",
+ `
beat(0.25) :: sound('sine')
.note([60, 67, 70, 72, 77].beat() - [0,12].bar())
.attack(0.2).release(0.5).gain(0.25)
@@ -432,8 +432,8 @@ beat(0.25) :: sound('sine')
.cutoff(1500).delay(0.5).delayt(0.125)
.delayfb(0.8).fmh(Math.floor(usine(.5) * 4))
.out()`,
- true
- )}
+ true,
+)}
**Note:** you can also set the _modulation index_ and the _harmonic ratio_ with the
fm argument. You will have to feed both as a string:
fm('2:4'). If you only feed one number, only the _modulation index_ will be updated.
@@ -444,8 +444,8 @@ There is also a more advanced set of parameters you can use to control the envel
-
fmrelease /
fmrel: release time of the modulator envelope.
${makeExample(
- "FM Synthesis with envelope control",
- `
+ "FM Synthesis with envelope control",
+ `
beat(.5) :: sound('sine')
.note([50,53,55,57].beat(.5) - 12)
.fmi(0.5 + usine(.25) * 1.5)
@@ -453,8 +453,8 @@ beat(.5) :: sound('sine')
.fmwave('triangle')
.fmsus(0).fmdec(0.2).out()
`,
- true
- )}
+ true,
+)}
## ZzFX
@@ -463,15 +463,15 @@ beat(.5) :: sound('sine')
ZZfX can be triggered by picking a default ZZfX waveform in the following list:
z_sine,
z_triangle,
z_sawtooth,
z_tan,
z_noise.
${makeExample(
- "Picking a waveform",
- `
+ "Picking a waveform",
+ `
beat(.5) :: sound(['z_sine', 'z_triangle', 'z_sawtooth', 'z_tan', 'z_noise'].beat()).out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Minimalist chiptune",
- `
+ "Minimalist chiptune",
+ `
beat(.5) :: sound('z_triangle')
.note([60, 67, 72, 63, 65, 70].beat(.5))
.zrand(0).curve([1,2,3,4].beat(1))
@@ -481,8 +481,8 @@ beat(.5) :: sound('z_triangle')
.room(0.5).size(0.9)
.pitchJumpTime(0.01).out()
`,
- true
- )}
+ true,
+)}
It comes with a set of parameters that can be used to tweak the sound. Don't underestimate this synth! It is very powerful for generating anything ranging from chaotic noise sources to lush pads:
@@ -508,8 +508,8 @@ It comes with a set of parameters that can be used to tweak the sound. Don't und
|
duration|| Total sound duration (overrides envelope) |
${makeExample(
- "Chaotic Noise source",
- `
+ "Chaotic Noise source",
+ `
beat(.25) :: sound('z_tan')
.note(40).noise(rand(0.0, 1.0))
.pitchJump(84).pitchJumpTime(rand(0.0, 1.0))
@@ -519,21 +519,21 @@ beat(.25) :: sound('z_tan')
.sustain(0).decay([0.2, 0.1].pick())
.out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "What is happening to me?",
- `
+ "What is happening to me?",
+ `
beat(1) :: snd('zzfx').zzfx([
[4.77,,25,,.15,.2,3,.21,,2.4,,,,,,,.23,.35],
[1.12,,97,.11,.16,.01,4,.77,,,30,.17,,,-1.9,,.01,.67,.2]
].beat()).out()
`,
- false
- )}
+ false,
+)}
${makeExample(
- "Les voitures dans le futur",
- `
+ "Les voitures dans le futur",
+ `
beat(1) :: sound(['z_triangle', 'z_sine'].pick())
.note([60,63,72,75].pick()).tremolo(16)
.zmod([0, 1/2, 1/8].div(2).pick())
@@ -541,18 +541,18 @@ beat(1) :: sound(['z_triangle', 'z_sine'].pick())
.room(0.9).size(0.9)
.delayt(0.75).delayfb(0.5).out()
`,
- false
- )}
+ false,
+)}
Note that you can also design sounds [on this website](https://killedbyapixel.github.io/ZzFX/) and copy the generated code in Topos. To do so, please use the
zzfx method with the generated array:
${makeExample(
- "Designing a sound on the ZzFX website",
- `
+ "Designing a sound on the ZzFX website",
+ `
beat(2) :: sound('zzfx').zzfx([3.62,,452,.16,.1,.21,,2.5,,,403,.05,.29,,,,.17,.34,.22,.68]).out()
`,
- true
- )}
+ true,
+)}
# Speech synthesis
@@ -567,35 +567,35 @@ Topos can also speak using the [Web Speech API](https://developer.mozilla.org/en
-
volume(number): speaking volume, from
0.0 to
1.0.
${makeExample(
- "Hello world!",
- `
+ "Hello world!",
+ `
beat(4) :: speak("Hello world!")
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Let's hear people talking about Topos",
- `
+ "Let's hear people talking about Topos",
+ `
beat(2) :: speak("Topos!","fr",irand(0,5))
`,
- true
- )}
+ true,
+)}
You can also use speech by chaining methods to a string:
${makeExample(
- "Foobaba is the real deal",
- `
+ "Foobaba is the real deal",
+ `
onbeat(4) :: "Foobaba".voice(irand(0,10)).speak()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Building string and chaining",
- `
+ "Building string and chaining",
+ `
const subject = ["coder","user","loser"].pick()
const verb = ["is", "was", "isnt"].pick()
const object = ["happy","sad","tired"].pick()
@@ -603,12 +603,12 @@ ${makeExample(
beat(6) :: sentence.pitch(0).rate(0).voice([0,2].pick()).speak()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Live coded poetry with array and string chaining",
- `
+ "Live coded poetry with array and string chaining",
+ `
tempo(70)
const croissant = [
@@ -623,7 +623,7 @@ ${makeExample(
.rate(rand(.4,.6))
.speak();
`,
- true
- )}
+ true,
+)}
`;
};
diff --git a/src/documentation/time/cyclical_time.ts b/src/documentation/time/cyclical_time.ts
index 14f7c6f..0a8d240 100644
--- a/src/documentation/time/cyclical_time.ts
+++ b/src/documentation/time/cyclical_time.ts
@@ -16,17 +16,17 @@ Time as a cycle. A cycle can be quite long (a few bars) or very short (a few pul
-
offset: offset (in beats) to apply. An offset of
0.5 will return true against the beat.
${makeExample(
- "Using different mod values",
- `
+ "Using different mod values",
+ `
// This code is alternating between different mod values
beat([1,1/2,1/4,1/8].beat(2)) :: sound('hat').n(0).out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Some sort of ringtone",
- `
+ "Some sort of ringtone",
+ `
// Blip generator :)
let blip = (freq) => {
return sound('wt_piano')
@@ -41,16 +41,16 @@ beat(1/3) :: blip(400).pan(r(0,1)).out();
flip(3) :: beat(1/6) :: blip(800).pan(r(0,1)).out();
beat([1,0.75].beat(2)) :: blip([50, 100].beat(2)).pan(r(0,1)).out();
`,
- false
- )}
+ false,
+)}
${makeExample(
- "Beat can match multiple values",
- `
+ "Beat can match multiple values",
+ `
beat([.5, 1.25])::sound('hat').out()
`,
- false
- )}
+ false,
+)}
-
pulse(n: number | number[] = 1, offset: number = 1): return true every _n_ pulses. A pulse is the tiniest possible rhythmic value.
-
number: if
number = 1, the function will return
true every pulse. Lists can be used too.
@@ -58,21 +58,21 @@ beat([.5, 1.25])::sound('hat').out()
${makeExample(
- "Intriguing rhythms",
- `
+ "Intriguing rhythms",
+ `
pulse([24, 16])::sound('hat').ad(0, .02).out()
pulse([48, [36,24].dur(4, 1)])::sound('fhardkick').ad(0, .1).out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "pulse is the OG rhythmic function in Topos",
- `
+ "pulse is the OG rhythmic function in Topos",
+ `
pulse([48, 24, 16].beat(4)) :: sound('linnhats').out()
beat(1)::snd(['bd', '808oh'].beat(1)).out()
`,
- false
- )}
+ false,
+)}
-
bar(n: number | number[] = 1, offset: number = 1): return true every _n_ bars.
@@ -80,37 +80,37 @@ beat(1)::snd(['bd', '808oh'].beat(1)).out()
-
offset: offset (in bars) to apply.
${makeExample(
- "Four beats per bar: proof",
- `
+ "Four beats per bar: proof",
+ `
bar(1)::sound('kick').out()
beat(1)::sound('hat').speed(2).out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Offsetting beat and bar",
- `
+ "Offsetting beat and bar",
+ `
bar(1)::sound('kick').out()
beat(1)::sound('hat').speed(2).out()
beat(1, 0.5)::sound('hat').speed(4).out()
bar(1, 0.5)::sound('sn').out()
`,
- false
- )}
+ false,
+)}
-
onbeat(...n: number[]): The
onbeat function allows you to lock on to a specific beat from the clock to execute code. It can accept multiple arguments. It's usage is very straightforward and not hard to understand. You can pass either integers or floating point numbers. By default, topos is using a
4/4 bar meaning that you can target any of these beats (or in-between) with this function.
${makeExample(
- "Some simple yet detailed rhythms",
- `
+ "Some simple yet detailed rhythms",
+ `
onbeat(1,2,3,4)::snd('kick').out() // Bassdrum on each beat
onbeat(2,4)::snd('snare').n([8,4].beat(4)).out() // Snare on acccentuated beats
onbeat(1.5,2.5,3.5, 3.75)::snd('hat').gain(r(0.9,1.1)).out() // Cool high-hats
`,
- true
- )}
+ true,
+)}
## XOX Style sequencers
@@ -119,32 +119,32 @@ onbeat(1.5,2.5,3.5, 3.75)::snd('hat').gain(r(0.9,1.1)).out() // Cool high-hats
-
duration: number: an optional duration (in beats) like
1 or 4. It can be patterned.
${makeExample(
- "Sequence built using a classic XOX sequencer style",
- `
+ "Sequence built using a classic XOX sequencer style",
+ `
seq('xoxo')::sound('fhardkick').out()
seq('ooxo')::sound('fsoftsnare').out()
seq('xoxo', 0.25)::sound('fhh').out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Another sequence using more complex parameters",
- `
+ "Another sequence using more complex parameters",
+ `
seq('xoxooxxoo', [0.5, 0.25].dur(2, 1))::sound('fhardkick').out()
seq('ooxo', [1, 2].bar())::sound('fsoftsnare').speed(0.5).out()
seq(['xoxoxoxx', 'xxoo'].bar())::sound('fhh').out()
`,
- true
- )}
+ true,
+)}
-
fullseq(expr: string, duration: number = 0.5): boolean : a variant. Will return
true or
false for a whole period, depending on the symbol. Useful for long structure patterns.
-
expr: string: any string composed of
x or
o like so:
"xooxoxxoxoo".
-
duration: number: an optional duration (in beats) like
1 or 4. It can be patterned.
${makeExample(
- "Long structured patterns",
- `
+ "Long structured patterns",
+ `
function simplePat() {
log('Simple pattern playing!')
seq('xoxooxxoo', [0.5, 0.25].dur(2, 1))::sound('fhardkick').out()
@@ -159,8 +159,8 @@ function complexPat() {
}
fullseq('xooxooxx', 4) ? simplePat() : complexPat()
`,
- true
- )}
+ true,
+)}
@@ -171,8 +171,8 @@ We included a bunch of popular rhythm generators in Topos such as the euclidian
-
rhythm(divisor: number, pulses: number, length: number, rotate: number): boolean: generates
true or
false values from an euclidian rhythm sequence. This is another version of
euclid that does not take an iterator.
${makeExample(
- "rhythm is a beginner friendly rhythmic function!",
- `
+ "rhythm is a beginner friendly rhythmic function!",
+ `
rhythm(.5, 4, 8)::sound('sine')
.fmi(2)
.room(0.5).size(8)
@@ -181,38 +181,38 @@ rhythm(.5, 7, 8)::sound('sine')
.freq(125).ad(0, .2).out()
rhythm(.5, 3, 8)::sound('sine').freq(500).ad(0, .5).out()
`,
- true
- )}
+ true,
+)}
-
oneuclid(pulses: number, length: number, rotate: number): boolean: generates
true or
false values from an euclidian rhythm sequence. This is another version of
euclid that does not take an iterator.
${makeExample(
- "Using oneuclid to create a rhythm without iterators",
- `
+ "Using oneuclid to create a rhythm without iterators",
+ `
// Change speed using bpm
bpm(250)
oneuclid(5, 9) :: snd('kick').out()
oneuclid(7,16) :: snd('east').end(0.5).n(irand(3,5)).out()
`,
- true
- )}
+ true,
+)}
-
bin(iterator: number, n: number): boolean: a binary rhythm generator. It transforms the given number into its binary representation (_e.g_
34 becomes
100010). It then returns a boolean value based on the iterator in order to generate a rhythm.
-
binrhythm(divisor: number, n: number): boolean: boolean: iterator-less version of the binary rhythm generator.
${makeExample(
- "Change the integers for a surprise rhythm!",
- `
+ "Change the integers for a surprise rhythm!",
+ `
bpm(135);
beat(.5) && bin($(1), 12) && snd('kick').n([4,9].beat(1.5)).out()
beat(.5) && bin($(2), 34) && snd('snare').n([3,5].beat(1)).out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "binrhythm for fast cool binary rhythms!",
- `
+ "binrhythm for fast cool binary rhythms!",
+ `
let a = 0;
a = beat(4) ? irand(1,20) : a;
binrhythm(.5, 6) && snd(['kick', 'snare'].beat(0.5)).n(11).out()
@@ -221,34 +221,34 @@ binrhythm([.5, .25].beat(1), 30) && snd('wt_granular').n(a)
.adsr(0, r(.1, .4), 0, 0).freq([50, 60, 72].beat(4))
.room(1).size(1).out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Submarine jungle music",
- `
+ "Submarine jungle music",
+ `
bpm(145);
beat(.5) && bin($(1), 911) && snd('ST69').n([2,3,4].beat())
.delay(0.125).delayt(0.25).end(0.25).speed(1/3)
.room(1).size(1).out()
beat(.5) && sound('amencutup').n(irand(2,7)).shape(0.3).out()
`,
- false
- )}
+ false,
+)}
If you don't find it spicy enough, you can add some more probabilities to your rhythms by taking advantage of the probability functions. See the functions documentation page to learn more about them.
${makeExample(
- "Probablistic drums in one line!",
- `
+ "Probablistic drums in one line!",
+ `
prob(60)::beat(.5) && euclid($(1), 5, 8) && snd('kick').out()
prob(60)::beat(.5) && euclid($(2), 3, 8) && snd('mash')
.n([1,2,3].beat(1))
.pan(usine(1/4)).out()
prob(80)::beat(.5) && sound(['hh', 'hat'].pick()).out()
`,
- true
- )}
+ true,
+)}
diff --git a/src/documentation/time/linear_time.ts b/src/documentation/time/linear_time.ts
index 81470bb..2a76255 100644
--- a/src/documentation/time/linear_time.ts
+++ b/src/documentation/time/linear_time.ts
@@ -22,12 +22,12 @@ export const linear_time = (app: Editor): string => {
There is a tiny widget at the bottom right of the screen showing you the current BPM and the status of the transport. You can turn it on or off in the settings menu.
${makeExample(
- "Printing the transport",
- `
+ "Printing the transport",
+ `
log(\`\$\{cbar()}\, \$\{cbeat()\}, \$\{cpulse()\}\`)
`,
- true
- )}
+ true,
+)}
### BPM and PPQN
@@ -64,8 +64,8 @@ These values are **extremely useful** to craft more complex syntax or to write m
You can use time primitives as conditionals. The following example will play a pattern A for 2 bars and a pattern B for 2 bars:
${makeExample(
- "Manual mode: using time primitives!",
- `
+ "Manual mode: using time primitives!",
+ `
// Manual time condition
if((cbar() % 4) > 1) {
beat(2) && sound('kick').out()
@@ -83,8 +83,8 @@ if((cbar() % 4) > 1) {
// This is always playing no matter what happens
beat([.5, .5, 1, .25].beat(0.5)) :: sound('shaker').out()
`,
- true
- )}
+ true,
+)}
## Time Warping
@@ -94,8 +94,8 @@ Time generally flows from the past to the future. However, you can manipulate it
${makeExample(
- "Time is now super elastic!",
- `
+ "Time is now super elastic!",
+ `
// Obscure Shenanigans - Bubobubobubo
beat([1/4,1/8,1/16].beat(8)):: sound('sine')
.freq([100,50].beat(16) + 50 * ($(1)%10))
@@ -108,14 +108,14 @@ flip(3) :: beat([.25,.5].beat(.5)) :: sound('dr')
// Jumping back and forth in time
beat(.25) :: warp([12, 48, 24, 1, 120, 30].pick())
`,
- true
- )}
+ true,
+)}
-
beat_warp(beat: number): this function jumps to the _n_ beat of the clock. The first beat is
1.
${makeExample(
- "Jumping back and forth with beats",
- `
+ "Jumping back and forth with beats",
+ `
// Resonance bliss - Bubobubobubo
beat(.25)::snd('arpy')
.note(30 + [0,3,7,10].beat())
@@ -130,40 +130,40 @@ beat(.5) :: snd('arpy').note(
// Comment me to stop warping!
beat(1) :: beat_warp([2,4,5,10,11].pick())
`,
- true
- )}
+ true,
+)}
## Transport-based rhythm generators
-
onbeat(...n: number[]): The
onbeat function allows you to lock on to a specific beat from the clock to execute code. It can accept multiple arguments. It's usage is very straightforward and not hard to understand. You can pass either integers or floating point numbers. By default, topos is using a
4/4 bar meaning that you can target any of these beats (or in-between) with this function.
${makeExample(
- "Some simple yet detailed rhythms",
- `
+ "Some simple yet detailed rhythms",
+ `
onbeat(1,2,3,4)::snd('kick').out() // Bassdrum on each beat
onbeat(2,4)::snd('snare').n([8,4].beat(4)).out() // Snare on acccentuated beats
onbeat(1.5,2.5,3.5, 3.75)::snd('hat').gain(r(0.9,1.1)).out() // Cool high-hats
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Let's do something more complex",
- `
+ "Let's do something more complex",
+ `
onbeat(0.5, 2, 3, 3.75)::snd('kick').n(2).out()
onbeat(2, [1.5, 3, 4].pick(), 4)::snd('snare').n(8).out()
beat([.25, 1/8].beat(1.5))::snd('hat').n(2)
.gain(rand(0.4, 0.7)).end(0.05)
.pan(usine()).out()
`,
- false
- )}
+ false,
+)}
-
oncount(beats: number[], meter: number): This function is similar to
onbeat but it allows you to specify a custom number of beats as the last argument.
${makeExample(
- "Using oncount to create more variation in the rhythm",
- `
+ "Using oncount to create more variation in the rhythm",
+ `
z1('1/16 (0 2 3 4)+(0 2 4 6)').scale('pentatonic').sound('sawtooth')
.cutoff([400,500,1000,2000].beat(1))
.lpadsr(2, 0, .2, 0, 0)
@@ -171,20 +171,20 @@ z1('1/16 (0 2 3 4)+(0 2 4 6)').scale('pentatonic').sound('sawtooth')
onbeat(1,1.5,2,3,4) :: sound('bd').gain(2.0).out()
oncount([1,3,5.5,7,7.5,8],8) :: sound('hh').gain(irand(1.0,4.0)).out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Using oncount to create rhythms with a custom meter",
- `
+ "Using oncount to create rhythms with a custom meter",
+ `
bpm(200)
oncount([1, 5, 9, 13],16) :: sound('808bd').n(4).shape(0.5).gain(1.0).out()
oncount([5, 6, 13],16) :: sound('shaker').room(0.25).gain(0.9).out()
oncount([2, 3, 3.5, 6, 7, 10, 15],16) :: sound('hh').n(8).gain(0.8).out()
oncount([1, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16],16) :: sound('hh').out()
`,
- true
- )}
+ true,
+)}
diff --git a/src/documentation/variables.ts b/src/documentation/variables.ts
index 616762b..6ad4e25 100644
--- a/src/documentation/variables.ts
+++ b/src/documentation/variables.ts
@@ -18,21 +18,21 @@ By default, each script is independant from each other. Scripts live in their ow
**Note:** since this example is running in the documentation, we cannot take advantage of the multiple scripts paradigm. Try to send a variable from the global file to the local file n°6.
${makeExample(
- "Setting a global variable",
- `
+ "Setting a global variable",
+ `
v('my_cool_variable', 2)
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Getting that variable back and printing!",
- `
+ "Getting that variable back and printing!",
+ `
// Note that we just use one argument
log(v('my_cool_variable'))
`,
- false
- )}
+ false,
+)}
## Counter and iterators
@@ -51,32 +51,32 @@ You will often need to use iterators and/or counters to index over data structur
**Note:** Counters also come with a secret syntax. They can be called with the **$** symbol!
${makeExample(
- "Iterating over a list of samples using a counter",
- `
+ "Iterating over a list of samples using a counter",
+ `
rhythm(.25, 6, 8) :: sound('dr').n($(1)).end(.25).out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Using a more complex counter",
- `
+ "Using a more complex counter",
+ `
// Limit is 20, step is 5
rhythm(.25, 6, 8) :: sound('dr').n($(1, 20, 5)).end(.25).out()
`,
- false
- )}
+ false,
+)}
${makeExample(
- "Calling the drunk mechanism",
- `
+ "Calling the drunk mechanism",
+ `
// Limit is 20, step is 5
rhythm(.25, 6, 8) :: sound('dr').n(drunk()).end(.25).out()
`,
- false
- )}
+ false,
+)}
-`
-}
+`;
+};
diff --git a/src/documentation/ziffers.ts b/src/documentation/ziffers.ts
index 923013e..ee66a04 100644
--- a/src/documentation/ziffers.ts
+++ b/src/documentation/ziffers.ts
@@ -12,7 +12,9 @@ Ziffers is a **musical number based notation** tuned for _live coding_. It is a
- exploring **generative / aleatoric / stochastic** melodies and applying them to sounds and synths.
- embracing a different mindset and approach to time and **patterning**.
-${makeExample("Super Fancy Ziffers example", `
+${makeExample(
+ "Super Fancy Ziffers example",
+ `
z1('1/8 024!3 035 024 0124').sound('wt_stereo')
.adsr(0, .4, 0.5, .4).gain(0.1)
.lpadsr(4, 0, .2, 0, 0)
@@ -26,7 +28,9 @@ z2('<1/8 1/16> __ 0 <(^) (^ ^)> (0,8)').sound('wt_stereo')
let osci = 1500 + usine(1/2) * 2000;
z3('can can:2').sound().gain(1).cutoff(osci).out()
z4('1/4 kick kick snare kick').sound().gain(1).cutoff(osci).out()
-`, true)}
+`,
+ true,
+)}
## Notation
@@ -49,57 +53,57 @@ The basic Ziffer notation is entirely written in JavaScript strings (_e.g_
"
**Note:** Some features are experimental and some are still unsupported. For full / prior syntax see article about Ziffers.
${makeExample(
- "Pitches from 0 to 9",
- `
+ "Pitches from 0 to 9",
+ `
z1('0.25 0 1 2 3 4 5 6 7 8 9').sound('wt_stereo')
.adsr(0, .1, 0, 0).out()`,
- true
- )}
+ true,
+)}
${makeExample(
- "Escaped pitches using curly brackets",
- `z1('_ _ 0 {9 10 11} 4 {12 13 14}')
+ "Escaped pitches using curly brackets",
+ `z1('_ _ 0 {9 10 11} 4 {12 13 14}')
.sound('wt_05').pan(r(0,1))
.cutoff(usaw(1/2) * 4000)
.room(0.9).size(0.9).out()`,
- false
- )}
+ false,
+)}
${makeExample(
- "Durations using fractions and floating point numbers",
- `
+ "Durations using fractions and floating point numbers",
+ `
z1('1/8 0 2 4 0 2 4 1/4 0 3 5 0.25 _ 0 7 0 7')
.sound('square').delay(0.5).delayt(1/8)
.adsr(0, .1, 0, 0).delayfb(0.45).out()
`,
- false
- )}
+ false,
+)}
${makeExample(
- "Disco was invented thanks to Ziffers",
- `
+ "Disco was invented thanks to Ziffers",
+ `
z1('e _ _ 0 ^ 0 _ 0 ^ 0').sound('jvbass').out()
beat(1)::snd('bd').out(); beat(2)::snd('sd').out()
beat(3) :: snd('cp').room(0.5).size(0.5).orbit(2).out()
`,
- false
- )}
+ false,
+)}
${makeExample(
- "Accidentals and rests for nice melodies",
- `
+ "Accidentals and rests for nice melodies",
+ `
z1('^ 1/8 0 1 b2 3 4 _ 4 b5 4 3 b2 1 0')
.scale('major').sound('triangle')
.cutoff(500).lpadsr(5, 0, 1/12, 0, 0)
.fmi(0.5).fmh(2).delay(0.5).delayt(1/3)
.adsr(0, .1, 0, 0).out()
`,
- false
- )}
+ false,
+)}
${makeExample(
- "Repeat items n-times",
- `
+ "Repeat items n-times",
+ `
z1('1/8 _ _ 0!4 3!4 4!4 3!4')
.scale('major').sound('wt_oboe')
.shape(0.2).sustain(0.1).out()
@@ -107,88 +111,88 @@ z2('1/8 _ 0!4 5!4 4!2 7!2')
.scale('major').sound('wt_oboe')
.shape(0.2).sustain(0.1).out()
`,
- false
- )}
+ false,
+)}
${makeExample(
- "Subdivided durations",
- `
+ "Subdivided durations",
+ `
z1('w [0 [5 [3 7]]] h [0 4]')
.scale('major').sound('sine')
.fmi(usine(.5)).fmh(2).out()
`,
- false
- )}
+ false,
+)}
## Chords
Chords can be build by grouping pitches or using roman numeral notation, or by using named chords.
${makeExample(
- "Chords from pitches",
- `
+ "Chords from pitches",
+ `
z1('1.0 024 045 058 046 014')
.sound('sine').adsr(0.5, 1, 0, 0)
.room(0.5).size(0.9)
.scale("minor").out()
-`
- )}
+`,
+)}
${makeExample(
- "Chords from roman numerals",
- `
+ "Chords from roman numerals",
+ `
z1('2/4 i vi ii v')
.sound('triangle').adsr(0.2, 0.3, 0, 0)
.room(0.5).size(0.9).scale("major").out()
-`
- )}
+`,
+)}
${makeExample(
- "Named chords with repeats",
- `
+ "Named chords with repeats",
+ `
z1('0.25 Bmaj7!2 D7!2 _ Gmaj7!2 Bb7!2 ^ Ebmaj7!2')
.sound('square').room(0.5).cutoff(500)
.lpadsr(4, 0, .4, 0, 0).size(0.9)
.scale("major").out()
-`
- )}
+`,
+)}
${makeExample(
- "Transposing chords",
- `
+ "Transposing chords",
+ `
z1('q Amin!2').key(["A2", "E2"].beat(4))
.sound('sawtooth').cutoff(500)
- .lpadsr(2, 0, .5, 0, 0, 0).out()`
- )}
+ .lpadsr(2, 0, .5, 0, 0, 0).out()`,
+)}
${makeExample(
- "Chord transposition with roman numerals",
- `
+ "Chord transposition with roman numerals",
+ `
z1('i i v%-4 v%-2 vi%-5 vi%-3 iv%-2 iv%-1')
.sound('triangle').adsr(1/16, 1/5, 0.1, 0)
.delay(0.5).delayt([1/8, 1/4].beat(4))
.delayfb(0.5).out()
beat(4) :: sound('breaks165').stretch(4).out()
-`
- )}
+`,
+)}
${makeExample(
- "Chord transposition with named chords",
- `
+ "Chord transposition with named chords",
+ `
z1('1/4 Cmin!3 Fmin!3 Fmin%-1 Fmin%-2 Fmin%-1')
.sound("sine").bpf(500 + usine(1/4) * 2000)
.out()
-`
- )}
+`,
+)}
${makeExample(
- "Programmatic inversions",
- `
+ "Programmatic inversions",
+ `
z1('1/6 i v 1/3 vi iv').invert([1,-1,-2,0].beat(4))
.sound("sawtooth").cutoff(1000)
.lpadsr(2, 0, .2, 0, 0).out()
- `
- )}
+ `,
+)}
## Algorithmic operations
@@ -197,21 +201,21 @@ Ziffers provides shorthands for **many** numeric and algorithimic operations suc
* **List operations:** Cartesian operation (_e.g._ (3 2 1)+(2 5)) using the + operator. All the arithmetic operators are supported.
${makeExample(
- "Element-wise operations for melodic generation",
- `
+ "Element-wise operations for melodic generation",
+ `
z1("1/8 _ 0 (0 1 3)+(1 2) 0 (2 3 5)-(1 2)").sound('sine')
.scale('pentatonic').fmi([0.25,0.5].beat(2)).fmh([2,4].beat(2))
.room(0.9).size(0.9).sustain(0.1).delay(0.5).delay(0.125)
.delayfb(0.25).out();
`,
- true
- )}
+ true,
+)}
* **Random numbers:** (4,6) Random number between 4 and 6
${makeExample(
- "Random numbers, true computer music at last!",
- `
+ "Random numbers, true computer music at last!",
+ `
z1("s _ (0,8) 0 0 (0,5) 0 0").sound('sine')
.adsr(0, .1, 0, 0).scale('minor')
.fmdec(0.25).fmi(2).fmh([0.5, 0.25].beat(2))
@@ -219,8 +223,8 @@ z1("s _ (0,8) 0 0 (0,5) 0 0").sound('sine')
.delay(0.125).delayfb(0.25).out();
beat(.5) :: snd(['kick', 'hat'].beat(.5)).out()
`,
- true
- )}
+ true,
+)}
## Keys and scales
@@ -241,16 +245,16 @@ Ziffers supports all the keys and scales. Keys can be defined by using [scientif
| ... | And it goes on for **1490** scales |
${makeExample(
- "What the hell is the Modimic scale?",
- `
+ "What the hell is the Modimic scale?",
+ `
z1("s (0,8) 0 0 (0,5) 0 0").sound('sine')
.scale('modimic').fmi(2).fmh(2).room(0.5)
.size(0.5).sustain(0.1) .delay(0.5)
.delay(0.125).delayfb(0.25).out();
beat(.5) :: snd(['kick', 'hat'].beat(.5)).out()
`,
- true
- )}
+ true,
+)}
@@ -274,16 +278,16 @@ You can also use more traditional Scala format or by extended notation defined by Sevish Scale workshop, for example:
@@ -292,16 +296,16 @@ Microtonal scales can be defined using wait method, which will always wait for the current pattern to finish before starting the next cycle, or the
sync method will only wait for the synced pattern to finish on the first time.
${makeExample(
- "Automatic sync to z0",
- `
+ "Automatic sync to z0",
+ `
z0('w 0 8').sound('peri').out()
z1('e 0 4 5 9').sound('bell').out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Sync with wait",
- `
+ "Sync with wait",
+ `
z1('w 0 5').sound('pluck').release(0.1).sustain(0.25).out()
z2('q 6 3').wait(z1).sound('sine').release(0.16).sustain(0.55).out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Sync on first run",
- `
+ "Sync on first run",
+ `
z1('w __ 0 5 9 3').sound('bin').out()
z2('q __ 4 2 e 6 3 q 6').sync(z1).sound('east').out()
`,
- true
- )}
+ true,
+)}
## Examples
- Basic notation
${makeExample(
- "Simple method chaining",
- `
+ "Simple method chaining",
+ `
z1('0 1 2 3').key('G3')
.scale('minor').sound('sine').out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "More complex chaining",
- `
+ "More complex chaining",
+ `
z1('0 1 2 3 4').key('G3').scale('minor').sound('sine').often(n => n.pitch+=3).rarely(s => s.delay(0.5)).out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Simple options",
- `
+ "Simple options",
+ `
z1('0 3 2 4',{key: 'D3', scale: 'minor pentatonic'}).sound('sine').out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Duration chars",
- `
+ "Duration chars",
+ `
z1('q 0 0 4 4 5 5 h4 q 3 3 2 2 1 1 h0').sound('sine').out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Fraction durations",
- `
+ "Fraction durations",
+ `
z1('1/4 0 0 4 4 5 5 2/4 4 1/4 3 3 2 2 1 1 2/4 0')
.sound('sine').out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Decimal durations",
- `
+ "Decimal durations",
+ `
z1('0.25 5 1 2 6 0.125 3 8 0.5 4 1.0 0')
.sound('sine').scale("galian").out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Rest and octaves",
- `
+ "Rest and octaves",
+ `
z1('q 0 ^ e0 r _ 0 _ r 4 ^4 4')
.sound('sine').scale("godian").out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Rests with durations",
- `
+ "Rests with durations",
+ `
z1('q 0 4 e^r 3 e3 0.5^r h4 1/4^r e 5 r 0.125^r 0')
.sound('sine').scale("aeryptian").out()
`,
- true
+ true,
)}
- Scales
${makeExample(
- "Microtonal scales",
- `
+ "Microtonal scales",
+ `
z1('q 0 3 {10 14} e 8 4 {5 10 12 14 7 0}').sound('sine')
.fmi([1,2,4,8].pick())
.scale("17/16 9/8 6/5 5/4 4/3 11/8 3/2 13/8 5/3 7/4 15/8 2/1")
.out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Scala scale from variable",
- `
+ "Scala scale from variable",
+ `
const werckmeister = "107.82 203.91 311.72 401.955 503.91 605.865 701.955 809.775 900. 1007.82 1103.91 1200."
z0('s (0,3) ^ 0 3 ^ 0 (3,6) 0 _ (3,5) 0 _ 3 ^ 0 (3,5) ^ 0 6 0 _ 3 0')
@@ -437,98 +441,98 @@ ${makeExample(
onbeat(1,1.5,3) :: sound('bd').cutoff(100 + usine(.25) * 1000).out()
`,
- true
- )}
+ true,
+)}
- Algorithmic operations
${makeExample(
- "Random numbers",
- `
+ "Random numbers",
+ `
z1('q 0 (2,4) 4 (5,9)').sound('sine')
.scale("Bebop minor")
.out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "List operations",
- `
+ "List operations",
+ `
z1('q (0 3 1 5)+(2 5) e (0 5 2)*(2 3) (0 5 2)>>(2 3) (0 5 2)%(2 3)').sound('sine')
.scale("Bebop major")
.out()
`,
- true
- )}
+ true,
+)}
## Samples
Samples can be patterned using the sample names or using
@-operator for assigning sample to a pitch. Sample index can be changed using the
: operator.
${makeExample(
- "Sampled drums",
- `
+ "Sampled drums",
+ `
z1('bd [hh hh]').octave(-2).sound('sine').out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "More complex pattern",
- `
+ "More complex pattern",
+ `
z1('bd [hh
>]').octave(-2).sound('sine').out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Pitched samples",
- `
+ "Pitched samples",
+ `
z1('0@sax 3@sax 2@sax 6@sax')
.octave(-1).sound()
.adsr(0.25,0.125,0.125,0.25).out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Pitched samples from list operation",
- `
+ "Pitched samples from list operation",
+ `
z1('e (0 3 -1 4)+(-1 0 2 1)@sine')
.key('G4')
.scale('110 220 320 450')
.sound().out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Pitched samples with list notation",
- `
+ "Pitched samples with list notation",
+ `
z1('e (0 2 6 3 5 -2)@sax (0 2 6 3 5 -2)@arp')
.octave(-1).sound()
.adsr(0.25,0.125,0.125,0.25).out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Sample indices",
- `
+ "Sample indices",
+ `
z1('e 1:2 4:3 6:2')
.octave(-1).sound("east").out()
`,
- true
- )}
+ true,
+)}
${makeExample(
- "Pitched samples with sample indices",
- `
+ "Pitched samples with sample indices",
+ `
z1('_e 1@east:2 4@bd:3 6@arp:2 9@baa').sound().out()
`,
- true
- )}
+ true,
+)}
@@ -537,14 +541,14 @@ z1('_e 1@east:2 4@bd:3 6@arp:2 9@baa').sound().out()
You can also use string prototypes as an alternative syntax for creating Ziffers patterns
${makeExample(
- "String prototypes",
- `
+ "String prototypes",
+ `
"q 0 e 5 2 6 2 q 3".z0().sound('sine').out()
"q 2 7 8 6".z1().octave(-1).sound('sine').out()
"q 2 7 8 6".z2({key: "C2", scale: "aeolian"}).sound('sine').scale("minor").out()
`,
- true
- )}
+ true,
+)}
`;
};
diff --git a/src/extensions/ArrayExtensions.ts b/src/extensions/ArrayExtensions.ts
index 90b110e..13cb751 100644
--- a/src/extensions/ArrayExtensions.ts
+++ b/src/extensions/ArrayExtensions.ts
@@ -141,7 +141,7 @@ export const makeArrayExtensions = (api: UserAPI) => {
}
return Array.from(
{ length: times },
- () => Math.floor(api.randomGen() * (max - min + 1)) + min
+ () => Math.floor(api.randomGen() * (max - min + 1)) + min,
);
};
@@ -164,7 +164,7 @@ export const makeArrayExtensions = (api: UserAPI) => {
const chunk_size = divisor; // Get the first argument (chunk size)
const timepos = api.app.clock.pulses_since_origin;
const slice_count = Math.floor(
- timepos / Math.floor(chunk_size * api.ppqn())
+ timepos / Math.floor(chunk_size * api.ppqn()),
);
return this[slice_count % this.length];
};
@@ -174,12 +174,12 @@ export const makeArrayExtensions = (api: UserAPI) => {
const timepos = api.app.clock.pulses_since_origin;
const ppqn = api.ppqn();
const adjustedDurations: number[] = this.map(
- (_, index) => durations[index % durations.length]
+ (_, index) => durations[index % durations.length],
);
const totalDurationInPulses = adjustedDurations.reduce(
// @ts-ignore
(acc, duration) => acc + duration * ppqn,
- 0
+ 0,
);
const loopPosition = timepos % totalDurationInPulses;
let cumulativeDuration = 0;
@@ -402,7 +402,7 @@ export const makeArrayExtensions = (api: UserAPI) => {
Array.prototype.scale = function (
scale: string = "major",
- base_note: number = 0
+ base_note: number = 0,
) {
/**
* @param scale - the scale name
@@ -426,7 +426,7 @@ Array.prototype.scale = function (
Array.prototype.scaleArp = function (
scaleName: string = "major",
- boundary: number = 0
+ boundary: number = 0,
) {
/*
* @param scaleName - the scale name
diff --git a/src/extensions/NumberExtensions.ts b/src/extensions/NumberExtensions.ts
index a942054..6c592cd 100644
--- a/src/extensions/NumberExtensions.ts
+++ b/src/extensions/NumberExtensions.ts
@@ -2,112 +2,111 @@ import { type UserAPI } from "../API";
import { MidiEvent } from "../classes/MidiEvent";
import { Player } from "../classes/ZPlayer";
import { SoundEvent } from "../classes/SoundEvent";
+import { SkipEvent } from "../classes/SkipEvent";
declare global {
- interface Number {
- z(): Player;
- z0(): Player;
- z1(): Player;
- z2(): Player;
- z3(): Player;
- z4(): Player;
- z5(): Player;
- z6(): Player;
- z7(): Player;
- z8(): Player;
- z9(): Player;
- z10(): Player;
- z11(): Player;
- z12(): Player;
- z13(): Player;
- z14(): Player;
- z15(): Player;
- z16(): Player;
- midi(): MidiEvent;
- sound(name: string): SoundEvent;
- }
+ interface Number {
+ z(): Player;
+ z0(): Player;
+ z1(): Player;
+ z2(): Player;
+ z3(): Player;
+ z4(): Player;
+ z5(): Player;
+ z6(): Player;
+ z7(): Player;
+ z8(): Player;
+ z9(): Player;
+ z10(): Player;
+ z11(): Player;
+ z12(): Player;
+ z13(): Player;
+ z14(): Player;
+ z15(): Player;
+ z16(): Player;
+ midi(): MidiEvent;
+ sound(name: string): SoundEvent | SkipEvent;
+ }
}
export const makeNumberExtensions = (api: UserAPI) => {
+ Number.prototype.z0 = function (options: { [key: string]: any } = {}) {
+ return api.z0(this.valueOf().toString().split("").join(" "), options);
+ };
- Number.prototype.z0 = function (options: {[key: string]: any} = {}) {
- return api.z0(this.valueOf().toString().split("").join(" "), options);
- };
+ Number.prototype.z1 = function (options: { [key: string]: any } = {}) {
+ return api.z1(this.valueOf().toString().split("").join(" "), options);
+ };
- Number.prototype.z1 = function (options: {[key: string]: any} = {}) {
- return api.z1(this.valueOf().toString().split("").join(" "), options);
- };
+ Number.prototype.z2 = function (options: { [key: string]: any } = {}) {
+ return api.z2(this.valueOf().toString().split("").join(" "), options);
+ };
- Number.prototype.z2 = function (options: {[key: string]: any} = {}) {
- return api.z2(this.valueOf().toString().split("").join(" "), options);
- };
+ Number.prototype.z3 = function (options: { [key: string]: any } = {}) {
+ return api.z3(this.valueOf().toString().split("").join(" "), options);
+ };
- Number.prototype.z3 = function (options: {[key: string]: any} = {}) {
- return api.z3(this.valueOf().toString().split("").join(" "), options);
- };
+ Number.prototype.z4 = function (options: { [key: string]: any } = {}) {
+ return api.z4(this.valueOf().toString().split("").join(" "), options);
+ };
- Number.prototype.z4 = function (options: {[key: string]: any} = {}) {
- return api.z4(this.valueOf().toString().split("").join(" "), options);
- };
+ Number.prototype.z5 = function (options: { [key: string]: any } = {}) {
+ return api.z5(this.valueOf().toString().split("").join(" "), options);
+ };
- Number.prototype.z5 = function (options: {[key: string]: any} = {}) {
- return api.z5(this.valueOf().toString().split("").join(" "), options);
- };
+ Number.prototype.z6 = function (options: { [key: string]: any } = {}) {
+ return api.z6(this.valueOf().toString().split("").join(" "), options);
+ };
- Number.prototype.z6 = function (options: {[key: string]: any} = {}) {
- return api.z6(this.valueOf().toString().split("").join(" "), options);
- };
+ Number.prototype.z7 = function (options: { [key: string]: any } = {}) {
+ return api.z7(this.valueOf().toString().split("").join(" "), options);
+ };
- Number.prototype.z7 = function (options: {[key: string]: any} = {}) {
- return api.z7(this.valueOf().toString().split("").join(" "), options);
- };
+ Number.prototype.z8 = function (options: { [key: string]: any } = {}) {
+ return api.z8(this.valueOf().toString().split("").join(" "), options);
+ };
- Number.prototype.z8 = function (options: {[key: string]: any} = {}) {
- return api.z8(this.valueOf().toString().split("").join(" "), options);
- };
+ Number.prototype.z9 = function (options: { [key: string]: any } = {}) {
+ return api.z9(this.valueOf().toString().split("").join(" "), options);
+ };
- Number.prototype.z9 = function (options: {[key: string]: any} = {}) {
- return api.z9(this.valueOf().toString().split("").join(" "), options);
- };
+ Number.prototype.z10 = function (options: { [key: string]: any } = {}) {
+ return api.z10(this.valueOf().toString().split("").join(" "), options);
+ };
- Number.prototype.z10 = function (options: {[key: string]: any} = {}) {
- return api.z10(this.valueOf().toString().split("").join(" "), options);
- };
+ Number.prototype.z11 = function (options: { [key: string]: any } = {}) {
+ return api.z11(this.valueOf().toString().split("").join(" "), options);
+ };
- Number.prototype.z11 = function (options: {[key: string]: any} = {}) {
- return api.z11(this.valueOf().toString().split("").join(" "), options);
- };
+ Number.prototype.z12 = function (options: { [key: string]: any } = {}) {
+ return api.z12(this.valueOf().toString().split("").join(" "), options);
+ };
- Number.prototype.z12 = function (options: {[key: string]: any} = {}) {
- return api.z12(this.valueOf().toString().split("").join(" "), options);
- };
+ Number.prototype.z13 = function (options: { [key: string]: any } = {}) {
+ return api.z13(this.valueOf().toString().split("").join(" "), options);
+ };
- Number.prototype.z13 = function (options: {[key: string]: any} = {}) {
- return api.z13(this.valueOf().toString().split("").join(" "), options);
- };
+ Number.prototype.z14 = function (options: { [key: string]: any } = {}) {
+ return api.z14(this.valueOf().toString().split("").join(" "), options);
+ };
- Number.prototype.z14 = function (options: {[key: string]: any} = {}) {
- return api.z14(this.valueOf().toString().split("").join(" "), options);
- };
+ Number.prototype.z15 = function (options: { [key: string]: any } = {}) {
+ return api.z15(this.valueOf().toString().split("").join(" "), options);
+ };
- Number.prototype.z15 = function (options: {[key: string]: any} = {}) {
- return api.z15(this.valueOf().toString().split("").join(" "), options);
- };
+ Number.prototype.z16 = function (options: { [key: string]: any } = {}) {
+ return api.z16(this.valueOf().toString().split("").join(" "), options);
+ };
- Number.prototype.z16 = function (options: {[key: string]: any} = {}) {
- return api.z16(this.valueOf().toString().split("").join(" "), options);
- };
+ Number.prototype.midi = function (...kwargs: any[]) {
+ return api.midi(this.valueOf(), ...kwargs);
+ };
- Number.prototype.midi = function (...kwargs: any[]) {
- return api.midi(this.valueOf(), ...kwargs);
+ Number.prototype.sound = function (name: string): SoundEvent | SkipEvent {
+ if (Number.isInteger(this.valueOf())) {
+ return (api.sound(name) as SoundEvent).note(this.valueOf());
+ } else {
+ return (api.sound(name) as SoundEvent).freq(this.valueOf());
}
-
- Number.prototype.sound = function (name: string) {
- if(Number.isInteger(this.valueOf())) {
- return (api.sound(name) as SoundEvent).note(this.valueOf());
- } else {
- return (api.sound(name) as SoundEvent).freq(this.valueOf());
- }
- }
-
-}
\ No newline at end of file
+ };
+};
diff --git a/src/extensions/StringExtensions.ts b/src/extensions/StringExtensions.ts
index f184e70..081c85c 100644
--- a/src/extensions/StringExtensions.ts
+++ b/src/extensions/StringExtensions.ts
@@ -5,226 +5,227 @@ export {};
// Extend String prototype
declare global {
- interface String {
- speak(): void;
- rate(speed: number): string;
- pitch(pitch: number): string;
- volume(volume: number): string;
- voice(voice: number): string;
- lang(language: string): string;
- options(): SpeechOptions;
- z(): Player;
- z0(): Player;
- z1(): Player;
- z2(): Player;
- z3(): Player;
- z4(): Player;
- z5(): Player;
- z6(): Player;
- z7(): Player;
- z8(): Player;
- z9(): Player;
- z10(): Player;
- z11(): Player;
- z12(): Player;
- z13(): Player;
- z14(): Player;
- z15(): Player;
- z16(): Player;
- note(): number;
- }
+ interface String {
+ speak(): void;
+ rate(speed: number): string;
+ pitch(pitch: number): string;
+ volume(volume: number): string;
+ voice(voice: number): string;
+ lang(language: string): string;
+ options(): SpeechOptions;
+ z(): Player;
+ z0(): Player;
+ z1(): Player;
+ z2(): Player;
+ z3(): Player;
+ z4(): Player;
+ z5(): Player;
+ z6(): Player;
+ z7(): Player;
+ z8(): Player;
+ z9(): Player;
+ z10(): Player;
+ z11(): Player;
+ z12(): Player;
+ z13(): Player;
+ z14(): Player;
+ z15(): Player;
+ z16(): Player;
+ note(): number;
+ }
}
-const isJsonString = (str: string):boolean => {
- return str[0] === '{' && str[str.length - 1] === '}'
-}
+const isJsonString = (str: string): boolean => {
+ return str[0] === "{" && str[str.length - 1] === "}";
+};
const stringObject = (str: string, params: object) => {
- if(isJsonString(str)) {
- const obj = JSON.parse(str);
- return JSON.stringify({...obj, ...params});
- } else {
- return JSON.stringify({...params, text: str});
- }
-}
+ if (isJsonString(str)) {
+ const obj = JSON.parse(str);
+ return JSON.stringify({ ...obj, ...params });
+ } else {
+ return JSON.stringify({ ...params, text: str });
+ }
+};
export const makeStringExtensions = (api: UserAPI) => {
- String.prototype.speak = function () {
- const options = JSON.parse(this.valueOf());
- new Speaker({ ...options, text: options.text }).speak().then(() => {
- // Done
- }).catch((e) => {
- console.log("Error speaking:", e);
- });
- };
+ String.prototype.speak = function () {
+ const options = JSON.parse(this.valueOf());
+ new Speaker({ ...options, text: options.text })
+ .speak()
+ .then(() => {
+ // Done
+ })
+ .catch((e) => {
+ console.log("Error speaking:", e);
+ });
+ };
- String.prototype.rate = function (speed: number) {
- return stringObject(this.valueOf(), {rate: speed});
- };
+ String.prototype.rate = function (speed: number) {
+ return stringObject(this.valueOf(), { rate: speed });
+ };
- String.prototype.pitch = function (pitch: number) {
- return stringObject(this.valueOf(), {pitch: pitch});
- };
+ String.prototype.pitch = function (pitch: number) {
+ return stringObject(this.valueOf(), { pitch: pitch });
+ };
- String.prototype.lang = function (language: string) {
- return stringObject(this.valueOf(),{lang: language});
- };
+ String.prototype.lang = function (language: string) {
+ return stringObject(this.valueOf(), { lang: language });
+ };
- String.prototype.volume = function (volume: number) {
- return stringObject(this.valueOf(), {volume: volume});
- };
+ String.prototype.volume = function (volume: number) {
+ return stringObject(this.valueOf(), { volume: volume });
+ };
- String.prototype.voice = function (voice: number) {
- return stringObject(this.valueOf(), {voice: voice});
- };
+ String.prototype.voice = function (voice: number) {
+ return stringObject(this.valueOf(), { voice: voice });
+ };
- String.prototype.z = function (options: {[key: string]: any} = {}) {
- return api.z(this.valueOf(), options);
- };
-
- String.prototype.z0 = function (options: {[key: string]: any} = {}) {
- return api.z0(this.valueOf(), options);
- };
+ String.prototype.z = function (options: { [key: string]: any } = {}) {
+ return api.z(this.valueOf(), options);
+ };
- String.prototype.z1 = function (options: {[key: string]: any} = {}) {
- return api.z1(this.valueOf(), options);
- };
+ String.prototype.z0 = function (options: { [key: string]: any } = {}) {
+ return api.z0(this.valueOf(), options);
+ };
- String.prototype.z2 = function (options: {[key: string]: any} = {}) {
- return api.z2(this.valueOf(), options);
- };
+ String.prototype.z1 = function (options: { [key: string]: any } = {}) {
+ return api.z1(this.valueOf(), options);
+ };
- String.prototype.z3 = function (options: {[key: string]: any} = {}) {
- return api.z3(this.valueOf(), options);
- };
+ String.prototype.z2 = function (options: { [key: string]: any } = {}) {
+ return api.z2(this.valueOf(), options);
+ };
- String.prototype.z4 = function (options: {[key: string]: any} = {}) {
- return api.z4(this.valueOf(), options);
- };
+ String.prototype.z3 = function (options: { [key: string]: any } = {}) {
+ return api.z3(this.valueOf(), options);
+ };
- String.prototype.z5 = function (options: {[key: string]: any} = {}) {
- return api.z5(this.valueOf(), options);
- };
+ String.prototype.z4 = function (options: { [key: string]: any } = {}) {
+ return api.z4(this.valueOf(), options);
+ };
- String.prototype.z6 = function (options: {[key: string]: any} = {}) {
- return api.z6(this.valueOf(), options);
- };
+ String.prototype.z5 = function (options: { [key: string]: any } = {}) {
+ return api.z5(this.valueOf(), options);
+ };
- String.prototype.z7 = function (options: {[key: string]: any} = {}) {
- return api.z7(this.valueOf(), options);
- };
+ String.prototype.z6 = function (options: { [key: string]: any } = {}) {
+ return api.z6(this.valueOf(), options);
+ };
- String.prototype.z8 = function (options: {[key: string]: any} = {}) {
- return api.z8(this.valueOf(), options);
- };
+ String.prototype.z7 = function (options: { [key: string]: any } = {}) {
+ return api.z7(this.valueOf(), options);
+ };
- String.prototype.z9 = function (options: {[key: string]: any} = {}) {
- return api.z9(this.valueOf(), options);
- };
+ String.prototype.z8 = function (options: { [key: string]: any } = {}) {
+ return api.z8(this.valueOf(), options);
+ };
- String.prototype.z10 = function (options: {[key: string]: any} = {}) {
- return api.z10(this.valueOf(), options);
- };
+ String.prototype.z9 = function (options: { [key: string]: any } = {}) {
+ return api.z9(this.valueOf(), options);
+ };
- String.prototype.z11 = function (options: {[key: string]: any} = {}) {
- return api.z11(this.valueOf(), options);
- };
+ String.prototype.z10 = function (options: { [key: string]: any } = {}) {
+ return api.z10(this.valueOf(), options);
+ };
- String.prototype.z12 = function (options: {[key: string]: any} = {}) {
- return api.z12(this.valueOf(), options);
- };
+ String.prototype.z11 = function (options: { [key: string]: any } = {}) {
+ return api.z11(this.valueOf(), options);
+ };
- String.prototype.z13 = function (options: {[key: string]: any} = {}) {
- return api.z13(this.valueOf(), options);
- };
+ String.prototype.z12 = function (options: { [key: string]: any } = {}) {
+ return api.z12(this.valueOf(), options);
+ };
- String.prototype.z14 = function (options: {[key: string]: any} = {}) {
- return api.z14(this.valueOf(), options);
- };
+ String.prototype.z13 = function (options: { [key: string]: any } = {}) {
+ return api.z13(this.valueOf(), options);
+ };
- String.prototype.z15 = function (options: {[key: string]: any} = {}) {
- return api.z15(this.valueOf(), options);
- };
+ String.prototype.z14 = function (options: { [key: string]: any } = {}) {
+ return api.z14(this.valueOf(), options);
+ };
- String.prototype.z16 = function (options: {[key: string]: any} = {}) {
- return api.z16(this.valueOf(), options);
- };
+ String.prototype.z15 = function (options: { [key: string]: any } = {}) {
+ return api.z15(this.valueOf(), options);
+ };
- String.prototype.note = function () {
- try {
- return parseInt(this.valueOf());
- } catch (e) {
- return noteNameToMidi(this.valueOf());
- }
- };
-}
+ String.prototype.z16 = function (options: { [key: string]: any } = {}) {
+ return api.z16(this.valueOf(), options);
+ };
+
+ String.prototype.note = function () {
+ try {
+ return parseInt(this.valueOf());
+ } catch (e) {
+ return noteNameToMidi(this.valueOf());
+ }
+ };
+};
type SpeechOptions = {
- text?: string;
- rate?: number;
- pitch?: number;
- volume?: number;
- voice?: number;
- lang?: string;
-}
+ text?: string;
+ rate?: number;
+ pitch?: number;
+ volume?: number;
+ voice?: number;
+ lang?: string;
+};
let speakerTimeout: number;
export class Speaker {
- constructor(
- public options: SpeechOptions
- ) {}
-
- speak = () => {
- return new Promise((resolve, reject) => {
- if (this.options.text) {
- const synth = window.speechSynthesis;
- if(synth.speaking) synth.cancel();
+ constructor(public options: SpeechOptions) {}
- const utterance = new SpeechSynthesisUtterance(this.options.text);
- utterance.rate = this.options.rate || 1;
- utterance.pitch = this.options.pitch || 1;
- utterance.volume = this.options.volume || 1;
- if (this.options.voice) {
- utterance.voice = synth.getVoices()[this.options.voice];
- }
- if(this.options.lang) {
- // Check if language has country code
- if (this.options.lang.length === 2) {
- utterance.lang = `${this.options.lang}-${this.options.lang.toUpperCase()}`
- } else if (this.options.lang.length === 5) {
- utterance.lang = this.options.lang;
- } else {
- // Fallback to en us
- utterance.lang = 'en-US';
- }
- }
+ speak = () => {
+ return new Promise((resolve, reject) => {
+ if (this.options.text) {
+ const synth = window.speechSynthesis;
+ if (synth.speaking) synth.cancel();
- utterance.onend = () => {
- resolve();
- };
-
- utterance.onerror = (error) => {
- reject(error);
- };
-
- if(synth.speaking) {
- // Cancel again?
- synth.cancel();
- // Set timeout
- if(speakerTimeout) clearTimeout(speakerTimeout);
- // @ts-ignore
- speakerTimeout = setTimeout(() => {
- synth.speak(utterance);
- }, 200);
- } else {
- synth.speak(utterance);
- }
-
- } else {
- reject("No text provided");
+ const utterance = new SpeechSynthesisUtterance(this.options.text);
+ utterance.rate = this.options.rate || 1;
+ utterance.pitch = this.options.pitch || 1;
+ utterance.volume = this.options.volume || 1;
+ if (this.options.voice) {
+ utterance.voice = synth.getVoices()[this.options.voice];
+ }
+ if (this.options.lang) {
+ // Check if language has country code
+ if (this.options.lang.length === 2) {
+ utterance.lang = `${
+ this.options.lang
+ }-${this.options.lang.toUpperCase()}`;
+ } else if (this.options.lang.length === 5) {
+ utterance.lang = this.options.lang;
+ } else {
+ // Fallback to en us
+ utterance.lang = "en-US";
+ }
}
- });
- }
+ utterance.onend = () => {
+ resolve();
+ };
+
+ utterance.onerror = (error) => {
+ reject(error);
+ };
+
+ if (synth.speaking) {
+ // Cancel again?
+ synth.cancel();
+ // Set timeout
+ if (speakerTimeout) clearTimeout(speakerTimeout);
+ // @ts-ignore
+ speakerTimeout = setTimeout(() => {
+ synth.speak(utterance);
+ }, 200);
+ } else {
+ synth.speak(utterance);
+ }
+ } else {
+ reject("No text provided");
+ }
+ });
+ };
}
diff --git a/src/main.ts b/src/main.ts
index 91666eb..73afa50 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -1,5 +1,6 @@
-import { OscilloscopeConfig, runOscilloscope, scriptBlinkers } from "./AudioVisualisation";
+import { OscilloscopeConfig, runOscilloscope } from "./Visuals/Oscilloscope";
import { EditorState, Compartment } from "@codemirror/state";
+import { scriptBlinkers } from "./Visuals/Blinkers";
import { javascript } from "@codemirror/lang-javascript";
import { markdown } from "@codemirror/lang-markdown";
import { Extension } from "@codemirror/state";
@@ -47,6 +48,7 @@ export class Editor {
// Editor logic
editor_mode: "global" | "local" | "init" | "notes" = "global";
+ hidden_interface: boolean = false;
fontSize!: Compartment;
withLineNumbers!: Compartment;
vimModeCompartment!: Compartment;
@@ -100,6 +102,19 @@ export class Editor {
public hydra: any;
constructor() {
+ /**
+ * This is the entry point of the application. The Editor instance is created when the page is loaded.
+ * It is responsible for:
+ * - Initializing the user interface
+ * - Loading the universe from local storage
+ * - Initializing the audio context and the clock
+ * - Building the user API
+ * - Building the documentation
+ * - Installing event listeners
+ * - Building the CodeMirror editor
+ * - Evaluating the init file
+ */
+
// ================================================================================
// Build user interface
// ================================================================================
@@ -194,6 +209,11 @@ export class Editor {
}
private getBuffer(type: string): any {
+ /**
+ * Retrieves the buffer based on the specified type.
+ * @param type - The type of buffer to retrieve.
+ * @returns The buffer object.
+ */
const universe = this.universes[this.selected_universe.toString()];
return type === "locals"
? universe[type][this.local_index]
@@ -221,24 +241,27 @@ export class Editor {
}
updateKnownUniversesView = () => {
+ /**
+ * Updates the known universes view.
+ * This function generates and populates a list of known universes based on the data stored in the 'universes' property.
+ * It retrieves the necessary HTML elements and template, creates the list, and attaches event listeners to the generated items.
+ * If any required elements or templates are missing, warning messages are logged and the function returns early.
+ */
let itemTemplate = document.getElementById(
- "ui-known-universe-item-template"
+ "ui-known-universe-item-template",
) as HTMLTemplateElement;
if (!itemTemplate) {
- console.warn("Missing template #ui-known-universe-item-template");
return;
}
let existing_universes = document.getElementById("existing-universes");
if (!existing_universes) {
- console.warn("Missing element #existing-universes");
return;
}
let list = document.createElement("ul");
list.className =
"lg:h-80 lg:text-normal text-sm h-auto lg:w-80 w-auto lg:pb-2 lg:pt-2 overflow-y-scroll text-white lg:mb-4 border rounded-lg bg-neutral-800";
-
list.append(
...Object.keys(this.universes).map((it) => {
let item = itemTemplate.content.cloneNode(true) as DocumentFragment;
@@ -250,10 +273,10 @@ export class Editor {
item
.querySelector(".delete-universe")
?.addEventListener("click", () =>
- api._deleteUniverseFromInterface(it)
+ api._deleteUniverseFromInterface(it),
);
return item;
- })
+ }),
);
existing_universes.innerHTML = "";
@@ -261,7 +284,13 @@ export class Editor {
};
changeToLocalBuffer(i: number) {
- // Updating the CSS accordingly
+ /**
+ * Changes the local buffer based on the provided index.
+ * Updates the CSS accordingly by adding a specific class to the selected tab and removing it from other tabs.
+ * Updates the local index and updates the editor view.
+ *
+ * @param i The index of the tab to change the local buffer to.
+ */
const tabs = document.querySelectorAll('[id^="tab-"]');
const tab = tabs[i] as HTMLElement;
tab.classList.add("bg-orange-300");
@@ -274,6 +303,11 @@ export class Editor {
}
changeModeFromInterface(mode: "global" | "local" | "init" | "notes") {
+ /**
+ * Changes the mode of the interface.
+ *
+ * @param mode - The mode to change to. Can be one of "global", "local", "init", or "notes".
+ */
const interface_buttons: HTMLElement[] = [
this.interface.local_button,
this.interface.global_button,
@@ -334,7 +368,7 @@ export class Editor {
this.view.dispatch({
effects: this.chosenLanguage.reconfigure(
- this.editor_mode == "notes" ? [markdown()] : [javascript()]
+ this.editor_mode == "notes" ? [markdown()] : [javascript()],
),
});
@@ -343,8 +377,14 @@ export class Editor {
setButtonHighlighting(
button: "play" | "pause" | "stop" | "clear",
- highlight: boolean
+ highlight: boolean,
) {
+ /**
+ * Sets the highlighting for a specific button.
+ *
+ * @param button - The button to highlight ("play", "pause", "stop", or "clear").
+ * @param highlight - A boolean indicating whether to highlight the button or not.
+ */
document.getElementById("play-label")!.textContent =
button !== "pause" ? "Pause" : "Play";
if (button !== "pause") {
@@ -391,7 +431,7 @@ export class Editor {
// All other buttons must lose the highlighting
document
.querySelectorAll(
- possible_selectors.filter((_, index) => index != selector).join(",")
+ possible_selectors.filter((_, index) => index != selector).join(","),
)
.forEach((button) => {
button.children[0].classList.remove("animate-pulse");
@@ -429,36 +469,36 @@ export class Editor {
}
}
- /**
- * Flashes the background of the view and its gutters.
- * @param {string} color - The color to set.
- * @param {number} duration - Duration in milliseconds to maintain the color.
- */
flashBackground(color: string, duration: number): void {
+ /**
+ * Flashes the background of the view and its gutters.
+ * @param {string} color - The color to set.
+ * @param {number} duration - Duration in milliseconds to maintain the color.
+ */
const domElement = this.view.dom;
const gutters = domElement.getElementsByClassName(
- "cm-gutter"
+ "cm-gutter",
) as HTMLCollectionOf;
domElement.classList.add("fluid-bg-transition");
Array.from(gutters).forEach((gutter) =>
- gutter.classList.add("fluid-bg-transition")
+ gutter.classList.add("fluid-bg-transition"),
);
domElement.style.backgroundColor = color;
Array.from(gutters).forEach(
- (gutter) => (gutter.style.backgroundColor = color)
+ (gutter) => (gutter.style.backgroundColor = color),
);
setTimeout(() => {
domElement.style.backgroundColor = "";
Array.from(gutters).forEach(
- (gutter) => (gutter.style.backgroundColor = "")
+ (gutter) => (gutter.style.backgroundColor = ""),
);
domElement.classList.remove("fluid-bg-transition");
Array.from(gutters).forEach((gutter) =>
- gutter.classList.remove("fluid-bg-transition")
+ gutter.classList.remove("fluid-bg-transition"),
);
}, duration);
}
@@ -466,7 +506,7 @@ export class Editor {
private initializeElements(): void {
for (const [key, value] of Object.entries(singleElements)) {
this.interface[key] = document.getElementById(
- value
+ value,
) as ElementMap[keyof ElementMap];
}
}
@@ -474,12 +514,18 @@ export class Editor {
private initializeButtonGroups(): void {
for (const [key, ids] of Object.entries(buttonGroups)) {
this.buttonElements[key] = ids.map(
- (id) => document.getElementById(id) as HTMLButtonElement
+ (id) => document.getElementById(id) as HTMLButtonElement,
);
}
}
private loadHydraSynthAsync(): void {
+ /**
+ * Loads the Hydra Synth asynchronously by creating a script element
+ * and appending it to the document head. * Once the script is
+ * loaded successfully, it initializes the Hydra Synth. If there
+ * is an error loading the script, it logs an error message.
+ */
var script = document.createElement("script");
script.src = "https://unpkg.com/hydra-synth";
script.async = true;
@@ -487,13 +533,16 @@ export class Editor {
console.log("Hydra loaded successfully");
this.initializeHydra();
};
- script.onerror = function() {
+ script.onerror = function () {
console.error("Error loading Hydra script");
};
document.head.appendChild(script);
}
private initializeHydra(): void {
+ /**
+ * Initializes the Hydra backend and sets up the Hydra synth.
+ */
// @ts-ignore
this.hydra_backend = new Hydra({
canvas: this.interface.hydra_canvas as HTMLCanvasElement,
@@ -501,18 +550,22 @@ export class Editor {
enableStreamCapture: false,
});
this.hydra = this.hydra_backend.synth;
+ (globalThis as any).hydra = this.hydra;
+ this.hydra.setResolution(1024, 768);
}
private setCanvas(canvas: HTMLCanvasElement): void {
+ /**
+ * Sets the canvas element and configures its size and context.
+ *
+ * @param canvas - The HTMLCanvasElement to set.
+ */
if (!canvas) return;
const ctx = canvas.getContext("2d");
-
const dpr = window.devicePixelRatio || 1;
-
// Assuming the canvas takes up the whole window
canvas.width = window.innerWidth * dpr;
canvas.height = window.innerHeight * dpr;
-
if (ctx) {
ctx.scale(dpr, dpr);
}
diff --git a/src/output.css b/src/output.css
index 3b75b32..653fdc9 100644
--- a/src/output.css
+++ b/src/output.css
@@ -22,7 +22,7 @@
::before,
::after {
- --tw-content: '';
+ --tw-content: "";
}
/*
@@ -42,9 +42,23 @@ html {
-moz-tab-size: 4;
/* 3 */
-o-tab-size: 4;
- tab-size: 4;
+ tab-size: 4;
/* 3 */
- font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-family:
+ ui-sans-serif,
+ system-ui,
+ -apple-system,
+ BlinkMacSystemFont,
+ "Segoe UI",
+ Roboto,
+ "Helvetica Neue",
+ Arial,
+ "Noto Sans",
+ sans-serif,
+ "Apple Color Emoji",
+ "Segoe UI Emoji",
+ "Segoe UI Symbol",
+ "Noto Color Emoji";
/* 4 */
font-feature-settings: normal;
/* 5 */
@@ -85,7 +99,7 @@ Add the correct text decoration in Chrome, Edge, and Safari.
abbr:where([title]) {
-webkit-text-decoration: underline dotted;
- text-decoration: underline dotted;
+ text-decoration: underline dotted;
}
/*
@@ -129,7 +143,8 @@ code,
kbd,
samp,
pre {
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
+ "Liberation Mono", "Courier New", monospace;
/* 1 */
font-size: 1em;
/* 2 */
@@ -224,9 +239,9 @@ select {
*/
button,
-[type='button'],
-[type='reset'],
-[type='submit'] {
+[type="button"],
+[type="reset"],
+[type="submit"] {
-webkit-appearance: button;
/* 1 */
background-color: transparent;
@@ -273,7 +288,7 @@ Correct the cursor style of increment and decrement buttons in Safari.
2. Correct the outline style in Safari.
*/
-[type='search'] {
+[type="search"] {
-webkit-appearance: textfield;
/* 1 */
outline-offset: -2px;
@@ -366,7 +381,8 @@ textarea {
2. Set the default placeholder color to the user's configured gray 400 color.
*/
-input::-moz-placeholder, textarea::-moz-placeholder {
+input::-moz-placeholder,
+textarea::-moz-placeholder {
opacity: 1;
/* 1 */
color: #9ca3af;
@@ -434,7 +450,9 @@ video {
display: none;
}
-*, ::before, ::after {
+*,
+::before,
+::after {
--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0;
--tw-translate-x: 0;
@@ -538,7 +556,7 @@ video {
display: block;
overflow-x: auto;
padding: 0.5em;
- background: #F0F0F0;
+ background: #f0f0f0;
}
.hljs,
@@ -583,11 +601,11 @@ video {
.hljs-link,
.hljs-selector-attr,
.hljs-selector-pseudo {
- color: #BC6060;
+ color: #bc6060;
}
.hljs-literal {
- color: #78A960;
+ color: #78a960;
}
.hljs-built_in,
@@ -886,8 +904,8 @@ video {
.appearance-none {
-webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
+ -moz-appearance: none;
+ appearance: none;
}
.flex-row {
@@ -1333,8 +1351,10 @@ video {
.shadow {
--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
- --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
- box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+ --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color),
+ 0 1px 2px -1px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),
+ var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.outline {
@@ -1350,11 +1370,14 @@ video {
}
.filter {
- filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast)
+ var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate)
+ var(--tw-sepia) var(--tw-drop-shadow);
}
.transition-colors {
- transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
+ transition-property: color, background-color, border-color,
+ text-decoration-color, fill, stroke;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
@@ -1399,15 +1422,21 @@ video {
}
.focus\:ring-2:focus {
- --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
- --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
- box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0
+ var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0
+ calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow),
+ var(--tw-shadow, 0 0 #0000);
}
.focus\:ring-4:focus {
- --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
- --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);
- box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0
+ var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0
+ calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow),
+ var(--tw-shadow, 0 0 #0000);
}
.focus\:ring-blue-500:focus {
@@ -1431,7 +1460,7 @@ video {
@media (prefers-reduced-motion: no-preference) {
@keyframes pulse {
50% {
- opacity: .5;
+ opacity: 0.5;
}
}
diff --git a/src/style.css b/src/style.css
index ac8d114..ea83325 100644
--- a/src/style.css
+++ b/src/style.css
@@ -3,8 +3,8 @@
@tailwind utilities;
@layer utilities {
- .striped .col-span-3, .striped .col-span-2 {
- @apply bg-neutral-300
+ .striped .col-span-3,
+ .striped .col-span-2 {
+ @apply bg-neutral-300;
}
}
-
diff --git a/src/themes/toposTheme.ts b/src/themes/toposTheme.ts
index e7c9aba..23c613a 100644
--- a/src/themes/toposTheme.ts
+++ b/src/themes/toposTheme.ts
@@ -46,10 +46,10 @@ export const toposDarkTheme = EditorView.theme(
borderLeftColor: cursor,
},
"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection":
- {
- backgroundColor: base00,
- border: `0.5px solid ${base00}`,
- },
+ {
+ backgroundColor: base00,
+ border: `0.5px solid ${base00}`,
+ },
".cm-panels": {
backgroundColor: darkBackground,
color: base05,
@@ -113,7 +113,7 @@ export const toposDarkTheme = EditorView.theme(
},
},
},
- { dark: true }
+ { dark: true },
);
/// The highlighting style for code in the Material Dark theme.
diff --git a/src/tidal-drum-machines.json b/src/tidal-drum-machines.json
index b6d528e..0942906 100644
--- a/src/tidal-drum-machines.json
+++ b/src/tidal-drum-machines.json
@@ -1,85 +1,39 @@
{
- "AJKPercusyn_bd": [
- "AJKPercusyn/ajkpercusyn-bd/Bassdrum.wav"
- ],
+ "AJKPercusyn_bd": ["AJKPercusyn/ajkpercusyn-bd/Bassdrum.wav"],
"AJKPercusyn_cb": [
"AJKPercusyn/ajkpercusyn-cb/Cowbell.wav",
"AJKPercusyn/ajkpercusyn-cb/Snarepop.wav"
],
- "AJKPercusyn_ht": [
- "AJKPercusyn/ajkpercusyn-ht/Tom.wav"
- ],
- "AJKPercusyn_sd": [
- "AJKPercusyn/ajkpercusyn-sd/Noise.wav"
- ],
- "AkaiLinn_bd": [
- "AkaiLinn/akailinn-bd/Bassdrum.wav"
- ],
- "AkaiLinn_cb": [
- "AkaiLinn/akailinn-cb/Cowbell.wav"
- ],
- "AkaiLinn_cp": [
- "AkaiLinn/akailinn-cp/Clap.wav"
- ],
- "AkaiLinn_cr": [
- "AkaiLinn/akailinn-cr/Crash.wav"
- ],
- "AkaiLinn_hh": [
- "AkaiLinn/akailinn-hh/Closed Hat.wav"
- ],
- "AkaiLinn_ht": [
- "AkaiLinn/akailinn-ht/Tom H.wav"
- ],
- "AkaiLinn_lt": [
- "AkaiLinn/akailinn-lt/Tom L.wav"
- ],
- "AkaiLinn_mt": [
- "AkaiLinn/akailinn-mt/Tom M.wav"
- ],
- "AkaiLinn_oh": [
- "AkaiLinn/akailinn-oh/Open Hat.wav"
- ],
- "AkaiLinn_rd": [
- "AkaiLinn/akailinn-rd/Ride.wav"
- ],
- "AkaiLinn_sd": [
- "AkaiLinn/akailinn-sd/SD.wav"
- ],
- "AkaiLinn_sh": [
- "AkaiLinn/akailinn-sh/Shuffle.wav"
- ],
- "AkaiLinn_tb": [
- "AkaiLinn/akailinn-tb/Tambourin.wav"
- ],
+ "AJKPercusyn_ht": ["AJKPercusyn/ajkpercusyn-ht/Tom.wav"],
+ "AJKPercusyn_sd": ["AJKPercusyn/ajkpercusyn-sd/Noise.wav"],
+ "AkaiLinn_bd": ["AkaiLinn/akailinn-bd/Bassdrum.wav"],
+ "AkaiLinn_cb": ["AkaiLinn/akailinn-cb/Cowbell.wav"],
+ "AkaiLinn_cp": ["AkaiLinn/akailinn-cp/Clap.wav"],
+ "AkaiLinn_cr": ["AkaiLinn/akailinn-cr/Crash.wav"],
+ "AkaiLinn_hh": ["AkaiLinn/akailinn-hh/Closed Hat.wav"],
+ "AkaiLinn_ht": ["AkaiLinn/akailinn-ht/Tom H.wav"],
+ "AkaiLinn_lt": ["AkaiLinn/akailinn-lt/Tom L.wav"],
+ "AkaiLinn_mt": ["AkaiLinn/akailinn-mt/Tom M.wav"],
+ "AkaiLinn_oh": ["AkaiLinn/akailinn-oh/Open Hat.wav"],
+ "AkaiLinn_rd": ["AkaiLinn/akailinn-rd/Ride.wav"],
+ "AkaiLinn_sd": ["AkaiLinn/akailinn-sd/SD.wav"],
+ "AkaiLinn_sh": ["AkaiLinn/akailinn-sh/Shuffle.wav"],
+ "AkaiLinn_tb": ["AkaiLinn/akailinn-tb/Tambourin.wav"],
"AkaiMPC60_bd": [
"AkaiMPC60/akaimpc60-bd/0 Bassdrum.wav",
"AkaiMPC60/akaimpc60-bd/Bassdrum Gated.wav"
],
- "AkaiMPC60_cp": [
- "AkaiMPC60/akaimpc60-cp/Clap.wav"
- ],
- "AkaiMPC60_cr": [
- "AkaiMPC60/akaimpc60-cr/Crash.wav"
- ],
- "AkaiMPC60_hh": [
- "AkaiMPC60/akaimpc60-hh/Closed Hat.wav"
- ],
- "AkaiMPC60_ht": [
- "AkaiMPC60/akaimpc60-ht/Tom H.wav"
- ],
- "AkaiMPC60_lt": [
- "AkaiMPC60/akaimpc60-lt/Tom L.wav"
- ],
+ "AkaiMPC60_cp": ["AkaiMPC60/akaimpc60-cp/Clap.wav"],
+ "AkaiMPC60_cr": ["AkaiMPC60/akaimpc60-cr/Crash.wav"],
+ "AkaiMPC60_hh": ["AkaiMPC60/akaimpc60-hh/Closed Hat.wav"],
+ "AkaiMPC60_ht": ["AkaiMPC60/akaimpc60-ht/Tom H.wav"],
+ "AkaiMPC60_lt": ["AkaiMPC60/akaimpc60-lt/Tom L.wav"],
"AkaiMPC60_misc": [
"AkaiMPC60/akaimpc60-misc/Bass.wav",
"AkaiMPC60/akaimpc60-misc/Electric Piano.wav"
],
- "AkaiMPC60_mt": [
- "AkaiMPC60/akaimpc60-mt/Tom M.wav"
- ],
- "AkaiMPC60_oh": [
- "AkaiMPC60/akaimpc60-oh/Open Hat.wav"
- ],
+ "AkaiMPC60_mt": ["AkaiMPC60/akaimpc60-mt/Tom M.wav"],
+ "AkaiMPC60_oh": ["AkaiMPC60/akaimpc60-oh/Open Hat.wav"],
"AkaiMPC60_perc": [
"AkaiMPC60/akaimpc60-perc/Bongo.wav",
"AkaiMPC60/akaimpc60-perc/Click.wav",
@@ -87,12 +41,8 @@
"AkaiMPC60/akaimpc60-perc/Conga L.wav",
"AkaiMPC60/akaimpc60-perc/Timbale.wav"
],
- "AkaiMPC60_rd": [
- "AkaiMPC60/akaimpc60-rd/Ride.wav"
- ],
- "AkaiMPC60_rim": [
- "AkaiMPC60/akaimpc60-rim/Rim Gated.wav"
- ],
+ "AkaiMPC60_rd": ["AkaiMPC60/akaimpc60-rd/Ride.wav"],
+ "AkaiMPC60_rim": ["AkaiMPC60/akaimpc60-rim/Rim Gated.wav"],
"AkaiMPC60_sd": [
"AkaiMPC60/akaimpc60-sd/Snare 1.wav",
"AkaiMPC60/akaimpc60-sd/Snare 2.wav",
@@ -110,12 +60,8 @@
"AkaiXR10/akaixr10-bd/Bassdrum-09.wav",
"AkaiXR10/akaixr10-bd/Bassdrum-10.wav"
],
- "AkaiXR10_cb": [
- "AkaiXR10/akaixr10-cb/Cowbell.wav"
- ],
- "AkaiXR10_cp": [
- "AkaiXR10/akaixr10-cp/Clap.wav"
- ],
+ "AkaiXR10_cb": ["AkaiXR10/akaixr10-cb/Cowbell.wav"],
+ "AkaiXR10_cp": ["AkaiXR10/akaixr10-cp/Clap.wav"],
"AkaiXR10_cr": [
"AkaiXR10/akaixr10-cr/Crash-01.wav",
"AkaiXR10/akaixr10-cr/Crash-02.wav",
@@ -125,9 +71,7 @@
"AkaiXR10/akaixr10-hh/Hat Closed.wav",
"AkaiXR10/akaixr10-hh/Hat Middle.wav"
],
- "AkaiXR10_ht": [
- "AkaiXR10/akaixr10-ht/Tom H-02.wav"
- ],
+ "AkaiXR10_ht": ["AkaiXR10/akaixr10-ht/Tom H-02.wav"],
"AkaiXR10_lt": [
"AkaiXR10/akaixr10-lt/Tom L-01.wav",
"AkaiXR10/akaixr10-lt/Tom L-02.wav"
@@ -142,9 +86,7 @@
"AkaiXR10/akaixr10-mt/Tom M-01.wav",
"AkaiXR10/akaixr10-mt/Tom M-02.wav"
],
- "AkaiXR10_oh": [
- "AkaiXR10/akaixr10-oh/Hat Open.wav"
- ],
+ "AkaiXR10_oh": ["AkaiXR10/akaixr10-oh/Hat Open.wav"],
"AkaiXR10_perc": [
"AkaiXR10/akaixr10-perc/Agogo.wav",
"AkaiXR10/akaixr10-perc/Claves.wav",
@@ -162,9 +104,7 @@
"AkaiXR10/akaixr10-perc/Vibrator.wav",
"AkaiXR10/akaixr10-perc/Whistle.wav"
],
- "AkaiXR10_rd": [
- "AkaiXR10/akaixr10-rd/Ride.wav"
- ],
+ "AkaiXR10_rd": ["AkaiXR10/akaixr10-rd/Ride.wav"],
"AkaiXR10_rim": [
"AkaiXR10/akaixr10-rim/Rim Shot-01.wav",
"AkaiXR10/akaixr10-rim/Rim Shot-02.wav"
@@ -181,30 +121,14 @@
"AkaiXR10/akaixr10-sd/Snaredrum-09.wav",
"AkaiXR10/akaixr10-sd/Snaredrum-10.wav"
],
- "AkaiXR10_sh": [
- "AkaiXR10/akaixr10-sh/Cabasa.wav"
- ],
- "AkaiXR10_tb": [
- "AkaiXR10/akaixr10-tb/Tambourine.wav"
- ],
- "AlesisHR16_bd": [
- "AlesisHR16/alesishr16-bd/Bassdrum.wav"
- ],
- "AlesisHR16_cp": [
- "AlesisHR16/alesishr16-cp/Clap.wav"
- ],
- "AlesisHR16_hh": [
- "AlesisHR16/alesishr16-hh/Closed Hat.wav"
- ],
- "AlesisHR16_ht": [
- "AlesisHR16/alesishr16-ht/Tom-2.wav"
- ],
- "AlesisHR16_lt": [
- "AlesisHR16/alesishr16-lt/Tom-1.wav"
- ],
- "AlesisHR16_oh": [
- "AlesisHR16/alesishr16-oh/Open Hat.wav"
- ],
+ "AkaiXR10_sh": ["AkaiXR10/akaixr10-sh/Cabasa.wav"],
+ "AkaiXR10_tb": ["AkaiXR10/akaixr10-tb/Tambourine.wav"],
+ "AlesisHR16_bd": ["AlesisHR16/alesishr16-bd/Bassdrum.wav"],
+ "AlesisHR16_cp": ["AlesisHR16/alesishr16-cp/Clap.wav"],
+ "AlesisHR16_hh": ["AlesisHR16/alesishr16-hh/Closed Hat.wav"],
+ "AlesisHR16_ht": ["AlesisHR16/alesishr16-ht/Tom-2.wav"],
+ "AlesisHR16_lt": ["AlesisHR16/alesishr16-lt/Tom-1.wav"],
+ "AlesisHR16_oh": ["AlesisHR16/alesishr16-oh/Open Hat.wav"],
"AlesisHR16_perc": [
"AlesisHR16/alesishr16-perc/Agogo Bell.wav",
"AlesisHR16/alesishr16-perc/Claves.wav",
@@ -215,12 +139,8 @@
"AlesisHR16/alesishr16-perc/Wood Block H.wav",
"AlesisHR16/alesishr16-perc/Wood Block L.wav"
],
- "AlesisHR16_rim": [
- "AlesisHR16/alesishr16-rim/Rim.wav"
- ],
- "AlesisHR16_sd": [
- "AlesisHR16/alesishr16-sd/Snaredrum.wav"
- ],
+ "AlesisHR16_rim": ["AlesisHR16/alesishr16-rim/Rim.wav"],
+ "AlesisHR16_sd": ["AlesisHR16/alesishr16-sd/Snaredrum.wav"],
"AlesisHR16_sh": [
"AlesisHR16/alesishr16-sh/Cabasa.wav",
"AlesisHR16/alesishr16-sh/Maracas.wav",
@@ -241,12 +161,8 @@
"AlesisSR16/alesissr16-bd/Bassdrum-12.wav",
"AlesisSR16/alesissr16-bd/Bassdrum-13.wav"
],
- "AlesisSR16_cb": [
- "AlesisSR16/alesissr16-cb/Cowbell.wav"
- ],
- "AlesisSR16_cp": [
- "AlesisSR16/alesissr16-cp/Clap.wav"
- ],
+ "AlesisSR16_cb": ["AlesisSR16/alesissr16-cb/Cowbell.wav"],
+ "AlesisSR16_cp": ["AlesisSR16/alesissr16-cp/Clap.wav"],
"AlesisSR16_cr": [
"AlesisSR16/alesissr16-cr/Crash-01.wav",
"AlesisSR16/alesissr16-cr/Crash-02.wav"
@@ -281,9 +197,7 @@
"AlesisSR16/alesissr16-rd/Ride-02.wav",
"AlesisSR16/alesissr16-rd/Ride-03.wav"
],
- "AlesisSR16_rim": [
- "AlesisSR16/alesissr16-rim/Rim.wav"
- ],
+ "AlesisSR16_rim": ["AlesisSR16/alesissr16-rim/Rim.wav"],
"AlesisSR16_sd": [
"AlesisSR16/alesissr16-sd/Snaredrum-01.wav",
"AlesisSR16/alesissr16-sd/Snaredrum-02.wav",
@@ -298,66 +212,26 @@
"AlesisSR16/alesissr16-sd/Snaredrum-11.wav",
"AlesisSR16/alesissr16-sd/Snaredrum-12.wav"
],
- "AlesisSR16_sh": [
- "AlesisSR16/alesissr16-sh/Shaker.wav"
- ],
- "AlesisSR16_tb": [
- "AlesisSR16/alesissr16-tb/Tamb.wav"
- ],
- "BossDR110_bd": [
- "BossDR110/bossdr110-bd/Bassdrum.wav"
- ],
- "BossDR110_cp": [
- "BossDR110/bossdr110-cp/Clap.wav"
- ],
- "BossDR110_cr": [
- "BossDR110/bossdr110-cr/Crash.wav"
- ],
- "BossDR110_hh": [
- "BossDR110/bossdr110-hh/Hat Closed.wav"
- ],
- "BossDR110_oh": [
- "BossDR110/bossdr110-oh/Hat Open.wav"
- ],
- "BossDR110_rd": [
- "BossDR110/bossdr110-rd/Ride.wav"
- ],
- "BossDR110_sd": [
- "BossDR110/bossdr110-sd/Snaredrum.wav"
- ],
- "BossDR220_bd": [
- "BossDR220/bossdr220-bd/Bassdrum.wav"
- ],
- "BossDR220_cp": [
- "BossDR220/bossdr220-cp/Clap.wav"
- ],
- "BossDR220_cr": [
- "BossDR220/bossdr220-cr/Crash.wav"
- ],
- "BossDR220_hh": [
- "BossDR220/bossdr220-hh/Hat Closed.wav"
- ],
- "BossDR220_ht": [
- "BossDR220/bossdr220-ht/Tom H.wav"
- ],
- "BossDR220_lt": [
- "BossDR220/bossdr220-lt/Tom L.wav"
- ],
- "BossDR220_mt": [
- "BossDR220/bossdr220-mt/Tom M.wav"
- ],
- "BossDR220_oh": [
- "BossDR220/bossdr220-oh/Hat Open.wav"
- ],
- "BossDR220_perc": [
- "BossDR220/bossdr220-perc/Clave.wav"
- ],
- "BossDR220_rd": [
- "BossDR220/bossdr220-rd/Ride.wav"
- ],
- "BossDR220_sd": [
- "BossDR220/bossdr220-sd/Snaredrum.wav"
- ],
+ "AlesisSR16_sh": ["AlesisSR16/alesissr16-sh/Shaker.wav"],
+ "AlesisSR16_tb": ["AlesisSR16/alesissr16-tb/Tamb.wav"],
+ "BossDR110_bd": ["BossDR110/bossdr110-bd/Bassdrum.wav"],
+ "BossDR110_cp": ["BossDR110/bossdr110-cp/Clap.wav"],
+ "BossDR110_cr": ["BossDR110/bossdr110-cr/Crash.wav"],
+ "BossDR110_hh": ["BossDR110/bossdr110-hh/Hat Closed.wav"],
+ "BossDR110_oh": ["BossDR110/bossdr110-oh/Hat Open.wav"],
+ "BossDR110_rd": ["BossDR110/bossdr110-rd/Ride.wav"],
+ "BossDR110_sd": ["BossDR110/bossdr110-sd/Snaredrum.wav"],
+ "BossDR220_bd": ["BossDR220/bossdr220-bd/Bassdrum.wav"],
+ "BossDR220_cp": ["BossDR220/bossdr220-cp/Clap.wav"],
+ "BossDR220_cr": ["BossDR220/bossdr220-cr/Crash.wav"],
+ "BossDR220_hh": ["BossDR220/bossdr220-hh/Hat Closed.wav"],
+ "BossDR220_ht": ["BossDR220/bossdr220-ht/Tom H.wav"],
+ "BossDR220_lt": ["BossDR220/bossdr220-lt/Tom L.wav"],
+ "BossDR220_mt": ["BossDR220/bossdr220-mt/Tom M.wav"],
+ "BossDR220_oh": ["BossDR220/bossdr220-oh/Hat Open.wav"],
+ "BossDR220_perc": ["BossDR220/bossdr220-perc/Clave.wav"],
+ "BossDR220_rd": ["BossDR220/bossdr220-rd/Ride.wav"],
+ "BossDR220_sd": ["BossDR220/bossdr220-sd/Snaredrum.wav"],
"BossDR55_bd": [
"BossDR55/bossdr55-bd/Bassdrum-01.wav",
"BossDR55/bossdr55-bd/Bassdrum-02.wav"
@@ -366,9 +240,7 @@
"BossDR55/bossdr55-hh/Hihat1.wav",
"BossDR55/bossdr55-hh/Hihat2.wav"
],
- "BossDR55_rim": [
- "BossDR55/bossdr55-rim/Rimshot.wav"
- ],
+ "BossDR55_rim": ["BossDR55/bossdr55-rim/Rimshot.wav"],
"BossDR55_sd": [
"BossDR55/bossdr55-sd/Snaredrum-01.wav",
"BossDR55/bossdr55-sd/Snaredrum-02.wav",
@@ -390,12 +262,8 @@
"BossDR550/bossdr550-cb/Cowbell-01.wav",
"BossDR550/bossdr550-cb/Cowbell-02.wav"
],
- "BossDR550_cp": [
- "BossDR550/bossdr550-cp/Clap.wav"
- ],
- "BossDR550_cr": [
- "BossDR550/bossdr550-cr/Crash.wav"
- ],
+ "BossDR550_cp": ["BossDR550/bossdr550-cp/Clap.wav"],
+ "BossDR550_cr": ["BossDR550/bossdr550-cr/Crash.wav"],
"BossDR550_hh": [
"BossDR550/bossdr550-hh/Hat Closed-01.wav",
"BossDR550/bossdr550-hh/Hat Closed-02.wav"
@@ -440,9 +308,7 @@
"BossDR550/bossdr550-rd/Ride-01.wav",
"BossDR550/bossdr550-rd/Ride-02.wav"
],
- "BossDR550_rim": [
- "BossDR550/bossdr550-rim/Rim Shot.wav"
- ],
+ "BossDR550_rim": ["BossDR550/bossdr550-rim/Rim Shot.wav"],
"BossDR550_sd": [
"BossDR550/bossdr550-sd/Snaredrum-01.wav",
"BossDR550/bossdr550-sd/Snaredrum-02.wav",
@@ -455,129 +321,55 @@
"BossDR550/bossdr550-sh/Cabasa-01.wav",
"BossDR550/bossdr550-sh/Cabasa-02.wav"
],
- "BossDR550_tb": [
- "BossDR550/bossdr550-tb/Tambourine.wav"
- ],
- "CasioRZ1_bd": [
- "CasioRZ1/casiorz1-bd/Bassdrum.wav"
- ],
- "CasioRZ1_cb": [
- "CasioRZ1/casiorz1-cb/Cowbell.wav"
- ],
- "CasioRZ1_cp": [
- "CasioRZ1/casiorz1-cp/Clap.wav"
- ],
- "CasioRZ1_cr": [
- "CasioRZ1/casiorz1-cr/Crash.wav"
- ],
- "CasioRZ1_hh": [
- "CasioRZ1/casiorz1-hh/Hat Closed.wav"
- ],
- "CasioRZ1_ht": [
- "CasioRZ1/casiorz1-ht/Tom H.wav"
- ],
- "CasioRZ1_lt": [
- "CasioRZ1/casiorz1-lt/Tom L.wav"
- ],
- "CasioRZ1_mt": [
- "CasioRZ1/casiorz1-mt/Tom M.wav"
- ],
+ "BossDR550_tb": ["BossDR550/bossdr550-tb/Tambourine.wav"],
+ "CasioRZ1_bd": ["CasioRZ1/casiorz1-bd/Bassdrum.wav"],
+ "CasioRZ1_cb": ["CasioRZ1/casiorz1-cb/Cowbell.wav"],
+ "CasioRZ1_cp": ["CasioRZ1/casiorz1-cp/Clap.wav"],
+ "CasioRZ1_cr": ["CasioRZ1/casiorz1-cr/Crash.wav"],
+ "CasioRZ1_hh": ["CasioRZ1/casiorz1-hh/Hat Closed.wav"],
+ "CasioRZ1_ht": ["CasioRZ1/casiorz1-ht/Tom H.wav"],
+ "CasioRZ1_lt": ["CasioRZ1/casiorz1-lt/Tom L.wav"],
+ "CasioRZ1_mt": ["CasioRZ1/casiorz1-mt/Tom M.wav"],
"CasioRZ1_rd": [
"CasioRZ1/casiorz1-rd/Hat Open.wav",
"CasioRZ1/casiorz1-rd/Ride.wav"
],
- "CasioRZ1_rim": [
- "CasioRZ1/casiorz1-rim/Rim Shot.wav"
- ],
- "CasioRZ1_sd": [
- "CasioRZ1/casiorz1-sd/0Snaredrum.wav"
- ],
- "CasioSK1_bd": [
- "CasioSK1/casiosk1-bd/Bassdrum.wav"
- ],
- "CasioSK1_hh": [
- "CasioSK1/casiosk1-hh/Hat Closed.wav"
- ],
- "CasioSK1_ht": [
- "CasioSK1/casiosk1-ht/Tom H.wav"
- ],
- "CasioSK1_mt": [
- "CasioSK1/casiosk1-mt/Tom L.wav"
- ],
- "CasioSK1_oh": [
- "CasioSK1/casiosk1-oh/Hat Open.wav"
- ],
- "CasioSK1_sd": [
- "CasioSK1/casiosk1-sd/Snaredrum.wav"
- ],
- "CasioVL1_bd": [
- "CasioVL1/casiovl1-bd/Bassdrum.wav"
- ],
- "CasioVL1_hh": [
- "CasioVL1/casiovl1-hh/Hi Hat.wav"
- ],
- "CasioVL1_sd": [
- "CasioVL1/casiovl1-sd/Snaredrum-01.wav"
- ],
+ "CasioRZ1_rim": ["CasioRZ1/casiorz1-rim/Rim Shot.wav"],
+ "CasioRZ1_sd": ["CasioRZ1/casiorz1-sd/0Snaredrum.wav"],
+ "CasioSK1_bd": ["CasioSK1/casiosk1-bd/Bassdrum.wav"],
+ "CasioSK1_hh": ["CasioSK1/casiosk1-hh/Hat Closed.wav"],
+ "CasioSK1_ht": ["CasioSK1/casiosk1-ht/Tom H.wav"],
+ "CasioSK1_mt": ["CasioSK1/casiosk1-mt/Tom L.wav"],
+ "CasioSK1_oh": ["CasioSK1/casiosk1-oh/Hat Open.wav"],
+ "CasioSK1_sd": ["CasioSK1/casiosk1-sd/Snaredrum.wav"],
+ "CasioVL1_bd": ["CasioVL1/casiovl1-bd/Bassdrum.wav"],
+ "CasioVL1_hh": ["CasioVL1/casiovl1-hh/Hi Hat.wav"],
+ "CasioVL1_sd": ["CasioVL1/casiovl1-sd/Snaredrum-01.wav"],
"DoepferMS404_bd": [
"DoepferMS404/doepferms404-bd/0Bassdrum.wav",
"DoepferMS404/doepferms404-bd/Bassdrum Reverse.wav"
],
- "DoepferMS404_hh": [
- "DoepferMS404/doepferms404-hh/Hat Closed.wav"
- ],
- "DoepferMS404_lt": [
- "DoepferMS404/doepferms404-lt/Tom.wav"
- ],
- "DoepferMS404_oh": [
- "DoepferMS404/doepferms404-oh/Hat Open.wav"
- ],
- "DoepferMS404_sd": [
- "DoepferMS404/doepferms404-sd/Snaredrum.wav"
- ],
- "EmuDrumulator_bd": [
- "EmuDrumulator/emudrumulator-bd/Bassdrum.wav"
- ],
- "EmuDrumulator_cb": [
- "EmuDrumulator/emudrumulator-cb/Cowbell.wav"
- ],
- "EmuDrumulator_cp": [
- "EmuDrumulator/emudrumulator-cp/Clap.wav"
- ],
- "EmuDrumulator_cr": [
- "EmuDrumulator/emudrumulator-cr/Cymbal.wav"
- ],
- "EmuDrumulator_hh": [
- "EmuDrumulator/emudrumulator-hh/Hat Closed.wav"
- ],
- "EmuDrumulator_ht": [
- "EmuDrumulator/emudrumulator-ht/Tom H.wav"
- ],
- "EmuDrumulator_lt": [
- "EmuDrumulator/emudrumulator-lt/Tom L.wav"
- ],
- "EmuDrumulator_mt": [
- "EmuDrumulator/emudrumulator-mt/Tom M.wav"
- ],
- "EmuDrumulator_oh": [
- "EmuDrumulator/emudrumulator-oh/Hat Open.wav"
- ],
- "EmuDrumulator_perc": [
- "EmuDrumulator/emudrumulator-perc/Claves.wav"
- ],
- "EmuDrumulator_rim": [
- "EmuDrumulator/emudrumulator-rim/Rim Shot.wav"
- ],
- "EmuDrumulator_sd": [
- "EmuDrumulator/emudrumulator-sd/0Snaredrum.wav"
- ],
+ "DoepferMS404_hh": ["DoepferMS404/doepferms404-hh/Hat Closed.wav"],
+ "DoepferMS404_lt": ["DoepferMS404/doepferms404-lt/Tom.wav"],
+ "DoepferMS404_oh": ["DoepferMS404/doepferms404-oh/Hat Open.wav"],
+ "DoepferMS404_sd": ["DoepferMS404/doepferms404-sd/Snaredrum.wav"],
+ "EmuDrumulator_bd": ["EmuDrumulator/emudrumulator-bd/Bassdrum.wav"],
+ "EmuDrumulator_cb": ["EmuDrumulator/emudrumulator-cb/Cowbell.wav"],
+ "EmuDrumulator_cp": ["EmuDrumulator/emudrumulator-cp/Clap.wav"],
+ "EmuDrumulator_cr": ["EmuDrumulator/emudrumulator-cr/Cymbal.wav"],
+ "EmuDrumulator_hh": ["EmuDrumulator/emudrumulator-hh/Hat Closed.wav"],
+ "EmuDrumulator_ht": ["EmuDrumulator/emudrumulator-ht/Tom H.wav"],
+ "EmuDrumulator_lt": ["EmuDrumulator/emudrumulator-lt/Tom L.wav"],
+ "EmuDrumulator_mt": ["EmuDrumulator/emudrumulator-mt/Tom M.wav"],
+ "EmuDrumulator_oh": ["EmuDrumulator/emudrumulator-oh/Hat Open.wav"],
+ "EmuDrumulator_perc": ["EmuDrumulator/emudrumulator-perc/Claves.wav"],
+ "EmuDrumulator_rim": ["EmuDrumulator/emudrumulator-rim/Rim Shot.wav"],
+ "EmuDrumulator_sd": ["EmuDrumulator/emudrumulator-sd/0Snaredrum.wav"],
"EmuModular_bd": [
"EmuModular/emumodular-bd/Bassdrum-01.wav",
"EmuModular/emumodular-bd/Bassdrum-02.wav"
],
- "EmuModular_misc": [
- "EmuModular/emumodular-misc/EmuPong.wav"
- ],
+ "EmuModular_misc": ["EmuModular/emumodular-misc/EmuPong.wav"],
"EmuModular_perc": [
"EmuModular/emumodular-perc/Flick-02.wav",
"EmuModular/emumodular-perc/Flick01.wav"
@@ -598,15 +390,9 @@
"EmuSP12/emusp12-bd/Bassdrum-13.wav",
"EmuSP12/emusp12-bd/Bassdrum-14.wav"
],
- "EmuSP12_cb": [
- "EmuSP12/emusp12-cb/Cowbell.wav"
- ],
- "EmuSP12_cp": [
- "EmuSP12/emusp12-cp/Clap.wav"
- ],
- "EmuSP12_cr": [
- "EmuSP12/emusp12-cr/Crash.wav"
- ],
+ "EmuSP12_cb": ["EmuSP12/emusp12-cb/Cowbell.wav"],
+ "EmuSP12_cp": ["EmuSP12/emusp12-cp/Clap.wav"],
+ "EmuSP12_cr": ["EmuSP12/emusp12-cr/Crash.wav"],
"EmuSP12_hh": [
"EmuSP12/emusp12-hh/Hat Closed-01.wav",
"EmuSP12/emusp12-hh/Hat Closed-02.wav"
@@ -642,15 +428,9 @@
"EmuSP12/emusp12-mt/Tom M-03.wav",
"EmuSP12/emusp12-mt/Tom M-05.wav"
],
- "EmuSP12_oh": [
- "EmuSP12/emusp12-oh/Hhopen1.wav"
- ],
- "EmuSP12_perc": [
- "EmuSP12/emusp12-perc/Blow1.wav"
- ],
- "EmuSP12_rd": [
- "EmuSP12/emusp12-rd/Ride.wav"
- ],
+ "EmuSP12_oh": ["EmuSP12/emusp12-oh/Hhopen1.wav"],
+ "EmuSP12_perc": ["EmuSP12/emusp12-perc/Blow1.wav"],
+ "EmuSP12_rd": ["EmuSP12/emusp12-rd/Ride.wav"],
"EmuSP12_rim": [
"EmuSP12/emusp12-rim/zRim Shot-01.wav",
"EmuSP12/emusp12-rim/zRim Shot-02.wav"
@@ -678,18 +458,10 @@
"EmuSP12/emusp12-sd/Snaredrum-20.wav",
"EmuSP12/emusp12-sd/Snaredrum-21.wav"
],
- "KorgDDM110_bd": [
- "KorgDDM110/korgddm110-bd/Bassdrum.wav"
- ],
- "KorgDDM110_cp": [
- "KorgDDM110/korgddm110-cp/Clap.wav"
- ],
- "KorgDDM110_cr": [
- "KorgDDM110/korgddm110-cr/Crash.wav"
- ],
- "KorgDDM110_hh": [
- "KorgDDM110/korgddm110-hh/Hat Closed.wav"
- ],
+ "KorgDDM110_bd": ["KorgDDM110/korgddm110-bd/Bassdrum.wav"],
+ "KorgDDM110_cp": ["KorgDDM110/korgddm110-cp/Clap.wav"],
+ "KorgDDM110_cr": ["KorgDDM110/korgddm110-cr/Crash.wav"],
+ "KorgDDM110_hh": ["KorgDDM110/korgddm110-hh/Hat Closed.wav"],
"KorgDDM110_ht": [
"KorgDDM110/korgddm110-ht/Tom H.wav",
"KorgDDM110/korgddm110-ht/Tom-01.wav"
@@ -698,86 +470,38 @@
"KorgDDM110/korgddm110-lt/Tom L.wav",
"KorgDDM110/korgddm110-lt/Tom-02.wav"
],
- "KorgDDM110_oh": [
- "KorgDDM110/korgddm110-oh/Hat Open.wav"
- ],
- "KorgDDM110_rim": [
- "KorgDDM110/korgddm110-rim/Rim Shot.wav"
- ],
- "KorgDDM110_sd": [
- "KorgDDM110/korgddm110-sd/0Snaredrum.wav"
- ],
- "KorgKPR77_bd": [
- "KorgKPR77/korgkpr77-bd/Bassdrum.wav"
- ],
- "KorgKPR77_cp": [
- "KorgKPR77/korgkpr77-cp/Clap.wav"
- ],
- "KorgKPR77_hh": [
- "KorgKPR77/korgkpr77-hh/Hat Closed.wav"
- ],
- "KorgKPR77_oh": [
- "KorgKPR77/korgkpr77-oh/Hat Open.wav"
- ],
- "KorgKPR77_sd": [
- "KorgKPR77/korgkpr77-sd/Snaredrum.wav"
- ],
- "KorgKR55_bd": [
- "KorgKR55/korgkr55-bd/Bassdrum.wav"
- ],
- "KorgKR55_cb": [
- "KorgKR55/korgkr55-cb/Cowbell.wav"
- ],
- "KorgKR55_cr": [
- "KorgKR55/korgkr55-cr/Cymbal.wav"
- ],
- "KorgKR55_hh": [
- "KorgKR55/korgkr55-hh/Hat Closed.wav"
- ],
- "KorgKR55_ht": [
- "KorgKR55/korgkr55-ht/Tom.wav"
- ],
- "KorgKR55_oh": [
- "KorgKR55/korgkr55-oh/Hat Open.wav"
- ],
+ "KorgDDM110_oh": ["KorgDDM110/korgddm110-oh/Hat Open.wav"],
+ "KorgDDM110_rim": ["KorgDDM110/korgddm110-rim/Rim Shot.wav"],
+ "KorgDDM110_sd": ["KorgDDM110/korgddm110-sd/0Snaredrum.wav"],
+ "KorgKPR77_bd": ["KorgKPR77/korgkpr77-bd/Bassdrum.wav"],
+ "KorgKPR77_cp": ["KorgKPR77/korgkpr77-cp/Clap.wav"],
+ "KorgKPR77_hh": ["KorgKPR77/korgkpr77-hh/Hat Closed.wav"],
+ "KorgKPR77_oh": ["KorgKPR77/korgkpr77-oh/Hat Open.wav"],
+ "KorgKPR77_sd": ["KorgKPR77/korgkpr77-sd/Snaredrum.wav"],
+ "KorgKR55_bd": ["KorgKR55/korgkr55-bd/Bassdrum.wav"],
+ "KorgKR55_cb": ["KorgKR55/korgkr55-cb/Cowbell.wav"],
+ "KorgKR55_cr": ["KorgKR55/korgkr55-cr/Cymbal.wav"],
+ "KorgKR55_hh": ["KorgKR55/korgkr55-hh/Hat Closed.wav"],
+ "KorgKR55_ht": ["KorgKR55/korgkr55-ht/Tom.wav"],
+ "KorgKR55_oh": ["KorgKR55/korgkr55-oh/Hat Open.wav"],
"KorgKR55_perc": [
"KorgKR55/korgkr55-perc/Claves.wav",
"KorgKR55/korgkr55-perc/Conga.wav"
],
- "KorgKR55_rim": [
- "KorgKR55/korgkr55-rim/Rim Shot.wav"
- ],
- "KorgKR55_sd": [
- "KorgKR55/korgkr55-sd/0Snaredrum.wav"
- ],
- "KorgKRZ_bd": [
- "KorgKRZ/korgkrz-bd/Bassdrum.wav"
- ],
- "KorgKRZ_cr": [
- "KorgKRZ/korgkrz-cr/Crash.wav"
- ],
+ "KorgKR55_rim": ["KorgKR55/korgkr55-rim/Rim Shot.wav"],
+ "KorgKR55_sd": ["KorgKR55/korgkr55-sd/0Snaredrum.wav"],
+ "KorgKRZ_bd": ["KorgKRZ/korgkrz-bd/Bassdrum.wav"],
+ "KorgKRZ_cr": ["KorgKRZ/korgkrz-cr/Crash.wav"],
"KorgKRZ_fx": [
"KorgKRZ/korgkrz-fx/FX-01.wav",
"KorgKRZ/korgkrz-fx/FX-02.wav"
],
- "KorgKRZ_hh": [
- "KorgKRZ/korgkrz-hh/Hat Closed.wav"
- ],
- "KorgKRZ_ht": [
- "KorgKRZ/korgkrz-ht/Tom-02.wav"
- ],
- "KorgKRZ_lt": [
- "KorgKRZ/korgkrz-lt/Tom-01.wav"
- ],
- "KorgKRZ_misc": [
- "KorgKRZ/korgkrz-misc/Bell.wav"
- ],
- "KorgKRZ_oh": [
- "KorgKRZ/korgkrz-oh/Hat Open.wav"
- ],
- "KorgKRZ_rd": [
- "KorgKRZ/korgkrz-rd/Ride.wav"
- ],
+ "KorgKRZ_hh": ["KorgKRZ/korgkrz-hh/Hat Closed.wav"],
+ "KorgKRZ_ht": ["KorgKRZ/korgkrz-ht/Tom-02.wav"],
+ "KorgKRZ_lt": ["KorgKRZ/korgkrz-lt/Tom-01.wav"],
+ "KorgKRZ_misc": ["KorgKRZ/korgkrz-misc/Bell.wav"],
+ "KorgKRZ_oh": ["KorgKRZ/korgkrz-oh/Hat Open.wav"],
+ "KorgKRZ_rd": ["KorgKRZ/korgkrz-rd/Ride.wav"],
"KorgKRZ_sd": [
"KorgKRZ/korgkrz-sd/Snaredrum-01.wav",
"KorgKRZ/korgkrz-sd/Snaredrum-02.wav"
@@ -787,23 +511,14 @@
"KorgM1/korgm1-bd/Bassdrum-02.wav",
"KorgM1/korgm1-bd/Bassdrum-03.wav"
],
- "KorgM1_cb": [
- "KorgM1/korgm1-cb/Cowbel.wav"
- ],
- "KorgM1_cp": [
- "KorgM1/korgm1-cp/Clap.wav"
- ],
- "KorgM1_cr": [
- "KorgM1/korgm1-cr/Crash.wav"
- ],
+ "KorgM1_cb": ["KorgM1/korgm1-cb/Cowbel.wav"],
+ "KorgM1_cp": ["KorgM1/korgm1-cp/Clap.wav"],
+ "KorgM1_cr": ["KorgM1/korgm1-cr/Crash.wav"],
"KorgM1_hh": [
"KorgM1/korgm1-hh/Hat Closed-01.wav",
"KorgM1/korgm1-hh/Hat Closed-02.wav"
],
- "KorgM1_ht": [
- "KorgM1/korgm1-ht/Tom-02.wav",
- "KorgM1/korgm1-ht/Tom-03.wav"
- ],
+ "KorgM1_ht": ["KorgM1/korgm1-ht/Tom-02.wav", "KorgM1/korgm1-ht/Tom-03.wav"],
"KorgM1_misc": [
"KorgM1/korgm1-misc/Belrng.wav",
"KorgM1/korgm1-misc/Drop.wav",
@@ -822,9 +537,7 @@
"KorgM1/korgm1-misc/Whiplash.wav",
"KorgM1/korgm1-misc/Windbells.wav"
],
- "KorgM1_mt": [
- "KorgM1/korgm1-mt/Tom-01.wav"
- ],
+ "KorgM1_mt": ["KorgM1/korgm1-mt/Tom-01.wav"],
"KorgM1_oh": [
"KorgM1/korgm1-oh/Hat Open-01.wav",
"KorgM1/korgm1-oh/Hat Open-02.wav"
@@ -838,24 +551,16 @@
"KorgM1/korgm1-perc/Timbale-02.wav",
"KorgM1/korgm1-perc/Woodblock.wav"
],
- "KorgM1_rd": [
- "KorgM1/korgm1-rd/Ride.wav"
- ],
- "KorgM1_rim": [
- "KorgM1/korgm1-rim/Snaredrum-side.wav"
- ],
+ "KorgM1_rd": ["KorgM1/korgm1-rd/Ride.wav"],
+ "KorgM1_rim": ["KorgM1/korgm1-rim/Snaredrum-side.wav"],
"KorgM1_sd": [
"KorgM1/korgm1-sd/Snaredrum-01.wav",
"KorgM1/korgm1-sd/Snaredrum-02.wav",
"KorgM1/korgm1-sd/Snaredrum-03.wav",
"KorgM1/korgm1-sd/Snaredrum-04.wav"
],
- "KorgM1_sh": [
- "KorgM1/korgm1-sh/Shakers.wav"
- ],
- "KorgM1_tb": [
- "KorgM1/korgm1-tb/Tambourine.wav"
- ],
+ "KorgM1_sh": ["KorgM1/korgm1-sh/Shakers.wav"],
+ "KorgM1_tb": ["KorgM1/korgm1-tb/Tambourine.wav"],
"KorgMinipops_bd": [
"KorgMinipops/korgminipops-bd/Bassdrum-01.wav",
"KorgMinipops/korgminipops-bd/Bassdrum-02.wav",
@@ -911,9 +616,7 @@
"KorgT3/korgt3-bd/Bassdrum-04.wav",
"KorgT3/korgt3-bd/Bassdrum-05.wav"
],
- "KorgT3_cp": [
- "KorgT3/korgt3-cp/Clap.wav"
- ],
+ "KorgT3_cp": ["KorgT3/korgt3-cp/Clap.wav"],
"KorgT3_hh": [
"KorgT3/korgt3-hh/Hat Closed-01.wav",
"KorgT3/korgt3-hh/Hat Closed-02.wav"
@@ -934,9 +637,7 @@
"KorgT3/korgt3-perc/Hit.wav",
"KorgT3/korgt3-perc/Stick.wav"
],
- "KorgT3_rim": [
- "KorgT3/korgt3-rim/Rim shot.wav"
- ],
+ "KorgT3_rim": ["KorgT3/korgt3-rim/Rim shot.wav"],
"KorgT3_sd": [
"KorgT3/korgt3-sd/Snaredrum-01.wav",
"KorgT3/korgt3-sd/Snaredrum-02.wav",
@@ -949,9 +650,7 @@
"KorgT3/korgt3-sh/Shaker-02.wav",
"KorgT3/korgt3-sh/zCabasa.wav"
],
- "Linn9000_bd": [
- "Linn9000/linn9000-bd/BAssdrum.wav"
- ],
+ "Linn9000_bd": ["Linn9000/linn9000-bd/BAssdrum.wav"],
"Linn9000_cb": [
"Linn9000/linn9000-cb/Cowbell-01.wav",
"Linn9000/linn9000-cb/Cowbell-02.wav"
@@ -960,9 +659,7 @@
"Linn9000/linn9000-cr/Crash-01.wav",
"Linn9000/linn9000-cr/Crash-02.wav"
],
- "Linn9000_hh": [
- "Linn9000/linn9000-hh/Hat Closed.wav"
- ],
+ "Linn9000_hh": ["Linn9000/linn9000-hh/Hat Closed.wav"],
"Linn9000_ht": [
"Linn9000/linn9000-ht/Tom-01.wav",
"Linn9000/linn9000-ht/Tom-02.wav"
@@ -971,12 +668,8 @@
"Linn9000/linn9000-lt/Tom-04.wav",
"Linn9000/linn9000-lt/Tom-05.wav"
],
- "Linn9000_mt": [
- "Linn9000/linn9000-mt/Tom-03.wav"
- ],
- "Linn9000_oh": [
- "Linn9000/linn9000-oh/Hat Open.wav"
- ],
+ "Linn9000_mt": ["Linn9000/linn9000-mt/Tom-03.wav"],
+ "Linn9000_oh": ["Linn9000/linn9000-oh/Hat Open.wav"],
"Linn9000_perc": [
"Linn9000/linn9000-perc/Conga H.wav",
"Linn9000/linn9000-perc/Conga L.wav",
@@ -986,27 +679,13 @@
"Linn9000/linn9000-rd/Crash-03.wav",
"Linn9000/linn9000-rd/Ping.wav"
],
- "Linn9000_rim": [
- "Linn9000/linn9000-rim/Rim Shot.wav"
- ],
- "Linn9000_sd": [
- "Linn9000/linn9000-sd/0Snaredrum.wav"
- ],
- "Linn9000_tb": [
- "Linn9000/linn9000-tb/Tambourine.wav"
- ],
- "LinnDrum_bd": [
- "LinnDrum/linndrum-bd/Bassdrum.wav"
- ],
- "LinnDrum_cb": [
- "LinnDrum/linndrum-cb/Cowbell.wav"
- ],
- "LinnDrum_cp": [
- "LinnDrum/linndrum-cp/Clap.wav"
- ],
- "LinnDrum_cr": [
- "LinnDrum/linndrum-cr/Crash.wav"
- ],
+ "Linn9000_rim": ["Linn9000/linn9000-rim/Rim Shot.wav"],
+ "Linn9000_sd": ["Linn9000/linn9000-sd/0Snaredrum.wav"],
+ "Linn9000_tb": ["Linn9000/linn9000-tb/Tambourine.wav"],
+ "LinnDrum_bd": ["LinnDrum/linndrum-bd/Bassdrum.wav"],
+ "LinnDrum_cb": ["LinnDrum/linndrum-cb/Cowbell.wav"],
+ "LinnDrum_cp": ["LinnDrum/linndrum-cp/Clap.wav"],
+ "LinnDrum_cr": ["LinnDrum/linndrum-cr/Crash.wav"],
"LinnDrum_hh": [
"LinnDrum/linndrum-hh/Hat Closed-01.wav",
"LinnDrum/linndrum-hh/Hat Closed-02.wav",
@@ -1020,12 +699,8 @@
"LinnDrum/linndrum-lt/Tom L-01.wav",
"LinnDrum/linndrum-lt/Tom L-02.wav"
],
- "LinnDrum_mt": [
- "LinnDrum/linndrum-mt/Tom M-01.wav"
- ],
- "LinnDrum_oh": [
- "LinnDrum/linndrum-oh/Hat Open.wav"
- ],
+ "LinnDrum_mt": ["LinnDrum/linndrum-mt/Tom M-01.wav"],
+ "LinnDrum_oh": ["LinnDrum/linndrum-oh/Hat Open.wav"],
"LinnDrum_perc": [
"LinnDrum/linndrum-perc/Conga H-01.wav",
"LinnDrum/linndrum-perc/Conga H-02.wav",
@@ -1034,9 +709,7 @@
"LinnDrum/linndrum-perc/Conga M-01.wav",
"LinnDrum/linndrum-perc/Conga M-02.wav"
],
- "LinnDrum_rd": [
- "LinnDrum/linndrum-rd/Ride.wav"
- ],
+ "LinnDrum_rd": ["LinnDrum/linndrum-rd/Ride.wav"],
"LinnDrum_rim": [
"LinnDrum/linndrum-rim/Sidestick-01.wav",
"LinnDrum/linndrum-rim/Sidestick-02.wav",
@@ -1047,88 +720,50 @@
"LinnDrum/linndrum-sd/0Snarderum-02.wav",
"LinnDrum/linndrum-sd/0Snarderum-03.wav"
],
- "LinnDrum_sh": [
- "LinnDrum/linndrum-sh/Cabasa.wav"
- ],
- "LinnDrum_tb": [
- "LinnDrum/linndrum-tb/Tambourine.wav"
- ],
+ "LinnDrum_sh": ["LinnDrum/linndrum-sh/Cabasa.wav"],
+ "LinnDrum_tb": ["LinnDrum/linndrum-tb/Tambourine.wav"],
"LinnLM1_bd": [
"LinnLM1/linnlm1-bd/LM-1_BD_1_TL.wav",
"LinnLM1/linnlm1-bd/LM-1_BD_2_TL.wav",
"LinnLM1/linnlm1-bd/LM-1_BD_3_TL.wav",
"LinnLM1/linnlm1-bd/LM-1_BD_4_TL.wav"
],
- "LinnLM1_cb": [
- "LinnLM1/linnlm1-cb/LM-1_COWBELL_TL.wav"
- ],
- "LinnLM1_cp": [
- "LinnLM1/linnlm1-cp/LM-1_CLAP_1_TL.wav"
- ],
- "LinnLM1_hh": [
- "LinnLM1/linnlm1-hh/LM-1_HH_1_TL.wav"
- ],
- "LinnLM1_ht": [
- "LinnLM1/linnlm1-ht/LM-1_Tom_2_TL.wav"
- ],
- "LinnLM1_lt": [
- "LinnLM1/linnlm1-lt/LM-1_Tom_1_TL.wav"
- ],
- "LinnLM1_oh": [
- "LinnLM1/linnlm1-oh/LM-1_HH_2_TL.wav"
- ],
+ "LinnLM1_cb": ["LinnLM1/linnlm1-cb/LM-1_COWBELL_TL.wav"],
+ "LinnLM1_cp": ["LinnLM1/linnlm1-cp/LM-1_CLAP_1_TL.wav"],
+ "LinnLM1_hh": ["LinnLM1/linnlm1-hh/LM-1_HH_1_TL.wav"],
+ "LinnLM1_ht": ["LinnLM1/linnlm1-ht/LM-1_Tom_2_TL.wav"],
+ "LinnLM1_lt": ["LinnLM1/linnlm1-lt/LM-1_Tom_1_TL.wav"],
+ "LinnLM1_oh": ["LinnLM1/linnlm1-oh/LM-1_HH_2_TL.wav"],
"LinnLM1_perc": [
"LinnLM1/linnlm1-perc/LM-1_BONGO_1_TL.wav",
"LinnLM1/linnlm1-perc/LM-1_BONGO_2_TL.wav",
"LinnLM1/linnlm1-perc/LM-1_WOODBLOCK_TL.wav"
],
- "LinnLM1_rim": [
- "LinnLM1/linnlm1-rim/LM-1_RIMSHOT_1_TL.wav"
- ],
- "LinnLM1_sd": [
- "LinnLM1/linnlm1-sd/LM-1_SD_1_TL.wav"
- ],
- "LinnLM1_sh": [
- "LinnLM1/linnlm1-sh/LM-1_SHAKER_1_TL.wav"
- ],
- "LinnLM1_tb": [
- "LinnLM1/linnlm1-tb/LM-1_TAMB_TL.wav"
- ],
+ "LinnLM1_rim": ["LinnLM1/linnlm1-rim/LM-1_RIMSHOT_1_TL.wav"],
+ "LinnLM1_sd": ["LinnLM1/linnlm1-sd/LM-1_SD_1_TL.wav"],
+ "LinnLM1_sh": ["LinnLM1/linnlm1-sh/LM-1_SHAKER_1_TL.wav"],
+ "LinnLM1_tb": ["LinnLM1/linnlm1-tb/LM-1_TAMB_TL.wav"],
"LinnLM2_bd": [
"LinnLM2/linnlm2-bd/LM-2_BD_1_TL.wav",
"LinnLM2/linnlm2-bd/LM-2_BD_2_TL.wav",
"LinnLM2/linnlm2-bd/LM-2_BD_3_TL.wav",
"LinnLM2/linnlm2-bd/LM-2_BD_4_TL.wav"
],
- "LinnLM2_cb": [
- "LinnLM2/linnlm2-cb/LM-2_COWBELL_1_TL.wav"
- ],
- "LinnLM2_cp": [
- "LinnLM2/linnlm2-cp/LM-2_CLAP_1_TL.wav"
- ],
- "LinnLM2_cr": [
- "LinnLM2/linnlm2-cr/LM-2_CRASH_1_TL.wav"
- ],
+ "LinnLM2_cb": ["LinnLM2/linnlm2-cb/LM-2_COWBELL_1_TL.wav"],
+ "LinnLM2_cp": ["LinnLM2/linnlm2-cp/LM-2_CLAP_1_TL.wav"],
+ "LinnLM2_cr": ["LinnLM2/linnlm2-cr/LM-2_CRASH_1_TL.wav"],
"LinnLM2_hh": [
"LinnLM2/linnlm2-hh/LM-2_HH_1_TL.wav",
"LinnLM2/linnlm2-hh/LM-2_HH_2_TL.wav"
],
- "LinnLM2_ht": [
- "LinnLM2/linnlm2-ht/LM-2_TOM_1_TL.wav"
- ],
- "LinnLM2_lt": [
- "LinnLM2/linnlm2-lt/LM-2_TOM_3_TL.wav"
- ],
- "LinnLM2_mt": [
- "LinnLM2/linnlm2-mt/LM-2_TOM_2_TL.wav"
- ],
+ "LinnLM2_ht": ["LinnLM2/linnlm2-ht/LM-2_TOM_1_TL.wav"],
+ "LinnLM2_lt": ["LinnLM2/linnlm2-lt/LM-2_TOM_3_TL.wav"],
+ "LinnLM2_mt": ["LinnLM2/linnlm2-mt/LM-2_TOM_2_TL.wav"],
"LinnLM2_oh": [
"LinnLM2/linnlm2-oh/LM-2_OPEN_HH_2_TL.wav",
"LinnLM2/linnlm2-oh/LM-2_OPEN_HH_TL.wav"
],
- "LinnLM2_rd": [
- "LinnLM2/linnlm2-rd/LM-2_RIDE_1_TL.wav"
- ],
+ "LinnLM2_rd": ["LinnLM2/linnlm2-rd/LM-2_RIDE_1_TL.wav"],
"LinnLM2_rim": [
"LinnLM2/linnlm2-rim/LM-2_RIMSHOT_1_TL.wav",
"LinnLM2/linnlm2-rim/LM-2_RIMSHOT_2_TL.wav"
@@ -1139,39 +774,17 @@
"LinnLM2/linnlm2-sd/LM-2_SD_3_TL.wav",
"LinnLM2/linnlm2-sd/LM-2_SD_4_TL.wav"
],
- "LinnLM2_sh": [
- "LinnLM2/linnlm2-sh/LM-2_SHAKER_1_TL.wav"
- ],
- "LinnLM2_tb": [
- "LinnLM2/linnlm2-tb/LM-2_TAMB_1_TL.wav"
- ],
- "MFB512_bd": [
- "MFB512/mfb512-bd/Bassdrum.wav"
- ],
- "MFB512_cp": [
- "MFB512/mfb512-cp/Clap.wav"
- ],
- "MFB512_cr": [
- "MFB512/mfb512-cr/Crash.wav"
- ],
- "MFB512_hh": [
- "MFB512/mfb512-hh/Hat Closed.wav"
- ],
- "MFB512_ht": [
- "MFB512/mfb512-ht/Tom H.wav"
- ],
- "MFB512_lt": [
- "MFB512/mfb512-lt/Tom L.wav"
- ],
- "MFB512_mt": [
- "MFB512/mfb512-mt/Tom M.wav"
- ],
- "MFB512_oh": [
- "MFB512/mfb512-oh/Hat Open.wav"
- ],
- "MFB512_sd": [
- "MFB512/mfb512-sd/Snaredrum.wav"
- ],
+ "LinnLM2_sh": ["LinnLM2/linnlm2-sh/LM-2_SHAKER_1_TL.wav"],
+ "LinnLM2_tb": ["LinnLM2/linnlm2-tb/LM-2_TAMB_1_TL.wav"],
+ "MFB512_bd": ["MFB512/mfb512-bd/Bassdrum.wav"],
+ "MFB512_cp": ["MFB512/mfb512-cp/Clap.wav"],
+ "MFB512_cr": ["MFB512/mfb512-cr/Crash.wav"],
+ "MFB512_hh": ["MFB512/mfb512-hh/Hat Closed.wav"],
+ "MFB512_ht": ["MFB512/mfb512-ht/Tom H.wav"],
+ "MFB512_lt": ["MFB512/mfb512-lt/Tom L.wav"],
+ "MFB512_mt": ["MFB512/mfb512-mt/Tom M.wav"],
+ "MFB512_oh": ["MFB512/mfb512-oh/Hat Open.wav"],
+ "MFB512_sd": ["MFB512/mfb512-sd/Snaredrum.wav"],
"MPC1000_bd": [
"MPC1000/mpc1000-bd/MPC1000_808BD_TL.wav",
"MPC1000/mpc1000-bd/MPC1000_909BD_TL.wav",
@@ -1179,30 +792,22 @@
"MPC1000/mpc1000-bd/MPC1000_HH-BD_TL.wav",
"MPC1000/mpc1000-bd/MPC1000_HOUSEBD_TL.wav"
],
- "MPC1000_cp": [
- "MPC1000/mpc1000-cp/MPC1000_CLAP_TL.wav"
- ],
+ "MPC1000_cp": ["MPC1000/mpc1000-cp/MPC1000_CLAP_TL.wav"],
"MPC1000_hh": [
"MPC1000/mpc1000-hh/MPC1000_808HH1_TL.wav",
"MPC1000/mpc1000-hh/MPC1000_808HH2_TL.wav",
"MPC1000/mpc1000-hh/MPC1000_909CHH_TL.wav",
"MPC1000/mpc1000-hh/MPC1000_HHCHH1_TL.wav"
],
- "MPC1000_oh": [
- "MPC1000/mpc1000-oh/MPC1000_909OHH_TL.wav"
- ],
- "MPC1000_perc": [
- "MPC1000/mpc1000-perc/MPC1000_HHPERC_TL.wav"
- ],
+ "MPC1000_oh": ["MPC1000/mpc1000-oh/MPC1000_909OHH_TL.wav"],
+ "MPC1000_perc": ["MPC1000/mpc1000-perc/MPC1000_HHPERC_TL.wav"],
"MPC1000_sd": [
"MPC1000/mpc1000-sd/MPC1000_808SD_TL.wav",
"MPC1000/mpc1000-sd/MPC1000_909SD_TL.wav",
"MPC1000/mpc1000-sd/MPC1000_DB-SN_TL.wav",
"MPC1000/mpc1000-sd/MPC1000_HH-SN_TL.wav"
],
- "MPC1000_sh": [
- "MPC1000/mpc1000-sh/MPC1000_808MRC_TL.wav"
- ],
+ "MPC1000_sh": ["MPC1000/mpc1000-sh/MPC1000_808MRC_TL.wav"],
"MoogConcertMateMG1_bd": [
"MoogConcertMateMG1/moogconcertmatemg1-bd/Bassdrum-01.wav",
"MoogConcertMateMG1/moogconcertmatemg1-bd/Bassdrum-02.wav",
@@ -1222,44 +827,22 @@
"OberheimDMX/oberheimdmx-bd/Bassdrum-02.wav",
"OberheimDMX/oberheimdmx-bd/Bassdrum-03.wav"
],
- "OberheimDMX_cp": [
- "OberheimDMX/oberheimdmx-cp/Clap.wav"
- ],
- "OberheimDMX_cr": [
- "OberheimDMX/oberheimdmx-cr/Crash.wav"
- ],
- "OberheimDMX_hh": [
- "OberheimDMX/oberheimdmx-hh/Hat Closed.wav"
- ],
- "OberheimDMX_ht": [
- "OberheimDMX/oberheimdmx-ht/Tom H.wav"
- ],
- "OberheimDMX_lt": [
- "OberheimDMX/oberheimdmx-lt/Tom L.wav"
- ],
- "OberheimDMX_mt": [
- "OberheimDMX/oberheimdmx-mt/Tom M.wav"
- ],
- "OberheimDMX_oh": [
- "OberheimDMX/oberheimdmx-oh/Hat Open.wav"
- ],
- "OberheimDMX_rd": [
- "OberheimDMX/oberheimdmx-rd/Ride.wav"
- ],
- "OberheimDMX_rim": [
- "OberheimDMX/oberheimdmx-rim/Rim Shot.wav"
- ],
+ "OberheimDMX_cp": ["OberheimDMX/oberheimdmx-cp/Clap.wav"],
+ "OberheimDMX_cr": ["OberheimDMX/oberheimdmx-cr/Crash.wav"],
+ "OberheimDMX_hh": ["OberheimDMX/oberheimdmx-hh/Hat Closed.wav"],
+ "OberheimDMX_ht": ["OberheimDMX/oberheimdmx-ht/Tom H.wav"],
+ "OberheimDMX_lt": ["OberheimDMX/oberheimdmx-lt/Tom L.wav"],
+ "OberheimDMX_mt": ["OberheimDMX/oberheimdmx-mt/Tom M.wav"],
+ "OberheimDMX_oh": ["OberheimDMX/oberheimdmx-oh/Hat Open.wav"],
+ "OberheimDMX_rd": ["OberheimDMX/oberheimdmx-rd/Ride.wav"],
+ "OberheimDMX_rim": ["OberheimDMX/oberheimdmx-rim/Rim Shot.wav"],
"OberheimDMX_sd": [
"OberheimDMX/oberheimdmx-sd/Snaredrum-01.wav",
"OberheimDMX/oberheimdmx-sd/Snaredrum-02.wav",
"OberheimDMX/oberheimdmx-sd/Snaredrum-03.wav"
],
- "OberheimDMX_sh": [
- "OberheimDMX/oberheimdmx-sh/Cabasa.wav"
- ],
- "OberheimDMX_tb": [
- "OberheimDMX/oberheimdmx-tb/Tamborine.wav"
- ],
+ "OberheimDMX_sh": ["OberheimDMX/oberheimdmx-sh/Cabasa.wav"],
+ "OberheimDMX_tb": ["OberheimDMX/oberheimdmx-tb/Tamborine.wav"],
"RhodesPolaris_bd": [
"RhodesPolaris/rhodespolaris-bd/Bassdrum-01.wav",
"RhodesPolaris/rhodespolaris-bd/Bassdrum-02.wav",
@@ -1283,18 +866,10 @@
"RhythmAce/rhythmace-bd/Bassdrum-02.wav",
"RhythmAce/rhythmace-bd/Bassdrum-03.wav"
],
- "RhythmAce_hh": [
- "RhythmAce/rhythmace-hh/Hat Closed.wav"
- ],
- "RhythmAce_ht": [
- "RhythmAce/rhythmace-ht/Tom H.wav"
- ],
- "RhythmAce_lt": [
- "RhythmAce/rhythmace-lt/Tom L.wav"
- ],
- "RhythmAce_oh": [
- "RhythmAce/rhythmace-oh/Hat Open.wav"
- ],
+ "RhythmAce_hh": ["RhythmAce/rhythmace-hh/Hat Closed.wav"],
+ "RhythmAce_ht": ["RhythmAce/rhythmace-ht/Tom H.wav"],
+ "RhythmAce_lt": ["RhythmAce/rhythmace-lt/Tom L.wav"],
+ "RhythmAce_oh": ["RhythmAce/rhythmace-oh/Hat Open.wav"],
"RhythmAce_perc": [
"RhythmAce/rhythmace-perc/Clave.wav",
"RhythmAce/rhythmace-perc/Click.wav",
@@ -1422,22 +997,14 @@
"RolandCompurhythm8000_sd": [
"RolandCompurhythm8000/rolandcompurhythm8000-sd/Snarderum.wav"
],
- "RolandD110_bd": [
- "RolandD110/rolandd110-bd/Bassdrum.wav"
- ],
+ "RolandD110_bd": ["RolandD110/rolandd110-bd/Bassdrum.wav"],
"RolandD110_cb": [
"RolandD110/rolandd110-cb/Cowbell H.wav",
"RolandD110/rolandd110-cb/Cowbell L.wav"
],
- "RolandD110_cr": [
- "RolandD110/rolandd110-cr/Crash.wav"
- ],
- "RolandD110_hh": [
- "RolandD110/rolandd110-hh/Hat Closed.wav"
- ],
- "RolandD110_lt": [
- "RolandD110/rolandd110-lt/Tom.wav"
- ],
+ "RolandD110_cr": ["RolandD110/rolandd110-cr/Crash.wav"],
+ "RolandD110_hh": ["RolandD110/rolandd110-hh/Hat Closed.wav"],
+ "RolandD110_lt": ["RolandD110/rolandd110-lt/Tom.wav"],
"RolandD110_oh": [
"RolandD110/rolandd110-oh/Hat Open.wav",
"RolandD110/rolandd110-oh/Hat Pedal.wav"
@@ -1447,59 +1014,31 @@
"RolandD110/rolandd110-perc/Conga.wav",
"RolandD110/rolandd110-perc/Woodblock.wav"
],
- "RolandD110_rd": [
- "RolandD110/rolandd110-rd/Ride.wav"
- ],
- "RolandD110_rim": [
- "RolandD110/rolandd110-rim/Rimshot.wav"
- ],
+ "RolandD110_rd": ["RolandD110/rolandd110-rd/Ride.wav"],
+ "RolandD110_rim": ["RolandD110/rolandd110-rim/Rimshot.wav"],
"RolandD110_sd": [
"RolandD110/rolandd110-sd/Snaredrum-01.wav",
"RolandD110/rolandd110-sd/Snaredrum-02.wav",
"RolandD110/rolandd110-sd/Snaredrum-03.wav"
],
- "RolandD110_sh": [
- "RolandD110/rolandd110-sh/Cabasa.wav"
- ],
- "RolandD110_tb": [
- "RolandD110/rolandd110-tb/Tambourine.wav"
- ],
+ "RolandD110_sh": ["RolandD110/rolandd110-sh/Cabasa.wav"],
+ "RolandD110_tb": ["RolandD110/rolandd110-tb/Tambourine.wav"],
"RolandD70_bd": [
"RolandD70/rolandd70-bd/Bassdrum-01.wav",
"RolandD70/rolandd70-bd/Bassdrum-02.wav",
"RolandD70/rolandd70-bd/Bassdrum-03.wav",
"RolandD70/rolandd70-bd/Bassdrum-04.wav"
],
- "RolandD70_cb": [
- "RolandD70/rolandd70-cb/Cowbell.wav"
- ],
- "RolandD70_cp": [
- "RolandD70/rolandd70-cp/Clap.wav"
- ],
- "RolandD70_cr": [
- "RolandD70/rolandd70-cr/Crash.wav"
- ],
- "RolandD70_hh": [
- "RolandD70/rolandd70-hh/Hat Closed.wav"
- ],
- "RolandD70_lt": [
- "RolandD70/rolandd70-lt/Tom-02.wav"
- ],
- "RolandD70_mt": [
- "RolandD70/rolandd70-mt/Tom.-01.wav"
- ],
- "RolandD70_oh": [
- "RolandD70/rolandd70-oh/Hat Open.wav"
- ],
- "RolandD70_perc": [
- "RolandD70/rolandd70-perc/Sticks.wav"
- ],
- "RolandD70_rd": [
- "RolandD70/rolandd70-rd/Ride.wav"
- ],
- "RolandD70_rim": [
- "RolandD70/rolandd70-rim/Rim Shot.wav"
- ],
+ "RolandD70_cb": ["RolandD70/rolandd70-cb/Cowbell.wav"],
+ "RolandD70_cp": ["RolandD70/rolandd70-cp/Clap.wav"],
+ "RolandD70_cr": ["RolandD70/rolandd70-cr/Crash.wav"],
+ "RolandD70_hh": ["RolandD70/rolandd70-hh/Hat Closed.wav"],
+ "RolandD70_lt": ["RolandD70/rolandd70-lt/Tom-02.wav"],
+ "RolandD70_mt": ["RolandD70/rolandd70-mt/Tom.-01.wav"],
+ "RolandD70_oh": ["RolandD70/rolandd70-oh/Hat Open.wav"],
+ "RolandD70_perc": ["RolandD70/rolandd70-perc/Sticks.wav"],
+ "RolandD70_rd": ["RolandD70/rolandd70-rd/Ride.wav"],
+ "RolandD70_rim": ["RolandD70/rolandd70-rim/Rim Shot.wav"],
"RolandD70_sd": [
"RolandD70/rolandd70-sd/Snaredrum-01.wav",
"RolandD70/rolandd70-sd/Snaredrum-02.wav",
@@ -1507,9 +1046,7 @@
"RolandD70/rolandd70-sd/Snaredrum-04.wav",
"RolandD70/rolandd70-sd/Snaredrum-05.wav"
],
- "RolandD70_sh": [
- "RolandD70/rolandd70-sh/Cabasa.wav"
- ],
+ "RolandD70_sh": ["RolandD70/rolandd70-sh/Cabasa.wav"],
"RolandDDR30_bd": [
"RolandDDR30/rolandddr30-bd/Bassdrum-01.wav",
"RolandDDR30/rolandddr30-bd/Bassdrum-02.wav",
@@ -1554,24 +1091,16 @@
"RolandJD990/rolandjd990-bd/Solid-k.wav",
"RolandJD990/rolandjd990-bd/Tekno-k.wav"
],
- "RolandJD990_cb": [
- "RolandJD990/rolandjd990-cb/Cowbell.wav"
- ],
- "RolandJD990_cp": [
- "RolandJD990/rolandjd990-cp/Dance-cl.wav"
- ],
- "RolandJD990_cr": [
- "RolandJD990/rolandjd990-cr/Crsh-cym.wav"
- ],
+ "RolandJD990_cb": ["RolandJD990/rolandjd990-cb/Cowbell.wav"],
+ "RolandJD990_cp": ["RolandJD990/rolandjd990-cp/Dance-cl.wav"],
+ "RolandJD990_cr": ["RolandJD990/rolandjd990-cr/Crsh-cym.wav"],
"RolandJD990_hh": [
"RolandJD990/rolandjd990-hh/Chh_1.wav",
"RolandJD990/rolandjd990-hh/Chh_2.wav",
"RolandJD990/rolandjd990-hh/Lite-ch1.wav",
"RolandJD990/rolandjd990-hh/Lite-ch2.wav"
],
- "RolandJD990_ht": [
- "RolandJD990/rolandjd990-ht/Rim-tom1.wav"
- ],
+ "RolandJD990_ht": ["RolandJD990/rolandjd990-ht/Rim-tom1.wav"],
"RolandJD990_lt": [
"RolandJD990/rolandjd990-lt/Blast-tm.wav",
"RolandJD990/rolandjd990-lt/Boosh-tm.wav",
@@ -1609,9 +1138,7 @@
"RolandJD990/rolandjd990-perc/Snaps.wav",
"RolandJD990/rolandjd990-perc/Woodcrak.wav"
],
- "RolandJD990_rd": [
- "RolandJD990/rolandjd990-rd/Ride_cym.wav"
- ],
+ "RolandJD990_rd": ["RolandJD990/rolandjd990-rd/Ride_cym.wav"],
"RolandJD990_sd": [
"RolandJD990/rolandjd990-sd/90's-sd.wav",
"RolandJD990/rolandjd990-sd/Attack_s.wav",
@@ -1629,9 +1156,7 @@
"RolandJD990/rolandjd990-sd/Swing-sd.wav",
"RolandJD990/rolandjd990-sd/Video-sd.wav"
],
- "RolandJD990_tb": [
- "RolandJD990/rolandjd990-tb/Tambourn.wav"
- ],
+ "RolandJD990_tb": ["RolandJD990/rolandjd990-tb/Tambourn.wav"],
"RolandMC202_bd": [
"RolandMC202/rolandmc202-bd/Bassdrum-01.wav",
"RolandMC202/rolandmc202-bd/Bassdrum-02.wav",
@@ -1644,9 +1169,7 @@
"RolandMC202/rolandmc202-ht/Tom H-03.wav",
"RolandMC202/rolandmc202-ht/Tom H-04.wav"
],
- "RolandMC202_perc": [
- "RolandMC202/rolandmc202-perc/Click.wav"
- ],
+ "RolandMC202_perc": ["RolandMC202/rolandmc202-perc/Click.wav"],
"RolandMC303_bd": [
"RolandMC303/rolandmc303-bd/606bd1.wav",
"RolandMC303/rolandmc303-bd/606bd2.wav",
@@ -1827,30 +1350,14 @@
"RolandMC303/rolandmc303-tb/Shaketam.wav",
"RolandMC303/rolandmc303-tb/Tambouri.wav"
],
- "RolandMT32_bd": [
- "RolandMT32/rolandmt32-bd/Bassdrum.wav"
- ],
- "RolandMT32_cb": [
- "RolandMT32/rolandmt32-cb/Cowbell.wav"
- ],
- "RolandMT32_cp": [
- "RolandMT32/rolandmt32-cp/Clap.wav"
- ],
- "RolandMT32_cr": [
- "RolandMT32/rolandmt32-cr/Crash.wav"
- ],
- "RolandMT32_hh": [
- "RolandMT32/rolandmt32-hh/Hat Closed.wav"
- ],
- "RolandMT32_ht": [
- "RolandMT32/rolandmt32-ht/Tom H.wav"
- ],
- "RolandMT32_lt": [
- "RolandMT32/rolandmt32-lt/Tom L.wav"
- ],
- "RolandMT32_mt": [
- "RolandMT32/rolandmt32-mt/Tom M.wav"
- ],
+ "RolandMT32_bd": ["RolandMT32/rolandmt32-bd/Bassdrum.wav"],
+ "RolandMT32_cb": ["RolandMT32/rolandmt32-cb/Cowbell.wav"],
+ "RolandMT32_cp": ["RolandMT32/rolandmt32-cp/Clap.wav"],
+ "RolandMT32_cr": ["RolandMT32/rolandmt32-cr/Crash.wav"],
+ "RolandMT32_hh": ["RolandMT32/rolandmt32-hh/Hat Closed.wav"],
+ "RolandMT32_ht": ["RolandMT32/rolandmt32-ht/Tom H.wav"],
+ "RolandMT32_lt": ["RolandMT32/rolandmt32-lt/Tom L.wav"],
+ "RolandMT32_mt": ["RolandMT32/rolandmt32-mt/Tom M.wav"],
"RolandMT32_oh": [
"RolandMT32/rolandmt32-oh/Hat Open-01.wav",
"RolandMT32/rolandmt32-oh/Hat Open-02.wav"
@@ -1870,12 +1377,8 @@
"RolandMT32/rolandmt32-perc/Whistle Short.wav",
"RolandMT32/rolandmt32-perc/Whistle.wav"
],
- "RolandMT32_rd": [
- "RolandMT32/rolandmt32-rd/Ride.wav"
- ],
- "RolandMT32_rim": [
- "RolandMT32/rolandmt32-rim/RimShot.wav"
- ],
+ "RolandMT32_rd": ["RolandMT32/rolandmt32-rd/Ride.wav"],
+ "RolandMT32_rim": ["RolandMT32/rolandmt32-rim/RimShot.wav"],
"RolandMT32_sd": [
"RolandMT32/rolandmt32-sd/Snaredrum-01.wav",
"RolandMT32/rolandmt32-sd/Snaredrum-02.wav"
@@ -1884,9 +1387,7 @@
"RolandMT32/rolandmt32-sh/Cabasa.wav",
"RolandMT32/rolandmt32-sh/Maracas.wav"
],
- "RolandMT32_tb": [
- "RolandMT32/rolandmt32-tb/Tambourine.wav"
- ],
+ "RolandMT32_tb": ["RolandMT32/rolandmt32-tb/Tambourine.wav"],
"RolandR8_bd": [
"RolandR8/rolandr8-bd/Bassdrum-01.wav",
"RolandR8/rolandr8-bd/Bassdrum-02.wav",
@@ -1896,15 +1397,9 @@
"RolandR8/rolandr8-bd/Bassdrum-06.wav",
"RolandR8/rolandr8-bd/Bassdrum-07.wav"
],
- "RolandR8_cb": [
- "RolandR8/rolandr8-cb/Cowbell.wav"
- ],
- "RolandR8_cp": [
- "RolandR8/rolandr8-cp/Clap.wav"
- ],
- "RolandR8_cr": [
- "RolandR8/rolandr8-cr/Crash.wav"
- ],
+ "RolandR8_cb": ["RolandR8/rolandr8-cb/Cowbell.wav"],
+ "RolandR8_cp": ["RolandR8/rolandr8-cp/Clap.wav"],
+ "RolandR8_cr": ["RolandR8/rolandr8-cr/Crash.wav"],
"RolandR8_hh": [
"RolandR8/rolandr8-hh/Hat Closed.wav",
"RolandR8/rolandr8-hh/Hat Pedal.wav"
@@ -1927,9 +1422,7 @@
"RolandR8/rolandr8-mt/Tom M-03.wav",
"RolandR8/rolandr8-mt/Tom M-04.wav"
],
- "RolandR8_oh": [
- "RolandR8/rolandr8-oh/Hat Open.wav"
- ],
+ "RolandR8_oh": ["RolandR8/rolandr8-oh/Hat Open.wav"],
"RolandR8_perc": [
"RolandR8/rolandr8-perc/Bell-01.wav",
"RolandR8/rolandr8-perc/Bell-02.wav",
@@ -1966,28 +1459,20 @@
"RolandR8/rolandr8-sh/Cabasa1.wav",
"RolandR8/rolandr8-sh/Cabasa2.wav"
],
- "RolandR8_tb": [
- "RolandR8/rolandr8-tb/Tambourine.wav"
- ],
+ "RolandR8_tb": ["RolandR8/rolandr8-tb/Tambourine.wav"],
"RolandS50_bd": [
"RolandS50/rolands50-bd/Bassdrum-01.wav",
"RolandS50/rolands50-bd/Bassdrum-02.wav",
"RolandS50/rolands50-bd/Bassdrum-03.wav",
"RolandS50/rolands50-bd/Bassdrum-04.wav"
],
- "RolandS50_cb": [
- "RolandS50/rolands50-cb/Cowbell.wav"
- ],
- "RolandS50_cp": [
- "RolandS50/rolands50-cp/Clap.wav"
- ],
+ "RolandS50_cb": ["RolandS50/rolands50-cb/Cowbell.wav"],
+ "RolandS50_cp": ["RolandS50/rolands50-cp/Clap.wav"],
"RolandS50_cr": [
"RolandS50/rolands50-cr/China.wav",
"RolandS50/rolands50-cr/Crash.wav"
],
- "RolandS50_ht": [
- "RolandS50/rolands50-ht/Tom-01.wav"
- ],
+ "RolandS50_ht": ["RolandS50/rolands50-ht/Tom-01.wav"],
"RolandS50_lt": [
"RolandS50/rolands50-lt/Tom-03.wav",
"RolandS50/rolands50-lt/Tom-04.wav"
@@ -2000,12 +1485,8 @@
"RolandS50/rolands50-misc/Gong.wav",
"RolandS50/rolands50-misc/Tria-2.wav"
],
- "RolandS50_mt": [
- "RolandS50/rolands50-mt/Tom-02.wav"
- ],
- "RolandS50_oh": [
- "RolandS50/rolands50-oh/Hihat.wav"
- ],
+ "RolandS50_mt": ["RolandS50/rolands50-mt/Tom-02.wav"],
+ "RolandS50_oh": ["RolandS50/rolands50-oh/Hihat.wav"],
"RolandS50_perc": [
"RolandS50/rolands50-perc/Agogo-01.wav",
"RolandS50/rolands50-perc/Agogo-02.wav",
@@ -2022,9 +1503,7 @@
"RolandS50/rolands50-perc/Wblk.wav",
"RolandS50/rolands50-perc/Whstl.wav"
],
- "RolandS50_rd": [
- "RolandS50/rolands50-rd/Ride.wav"
- ],
+ "RolandS50_rd": ["RolandS50/rolands50-rd/Ride.wav"],
"RolandS50_sd": [
"RolandS50/rolands50-sd/Snaredrum-01.wav",
"RolandS50/rolands50-sd/Snaredrum-02.wav",
@@ -2159,86 +1638,44 @@
"RolandSystem100/rolandsystem100-sd/Snaredrum-21.wav",
"RolandSystem100/rolandsystem100-sd/Snaredrum-22.wav"
],
- "RolandTR505_bd": [
- "RolandTR505/rolandtr505-bd/Bassdrum.wav"
- ],
+ "RolandTR505_bd": ["RolandTR505/rolandtr505-bd/Bassdrum.wav"],
"RolandTR505_cb": [
"RolandTR505/rolandtr505-cb/Cowbell H.wav",
"RolandTR505/rolandtr505-cb/Cowbell L.wav"
],
- "RolandTR505_cp": [
- "RolandTR505/rolandtr505-cp/Clap.wav"
- ],
- "RolandTR505_cr": [
- "RolandTR505/rolandtr505-cr/Crash.wav"
- ],
- "RolandTR505_hh": [
- "RolandTR505/rolandtr505-hh/Hat Closed.wav"
- ],
- "RolandTR505_ht": [
- "RolandTR505/rolandtr505-ht/Tom H.wav"
- ],
- "RolandTR505_lt": [
- "RolandTR505/rolandtr505-lt/Tom L.wav"
- ],
- "RolandTR505_mt": [
- "RolandTR505/rolandtr505-mt/Tom M.wav"
- ],
- "RolandTR505_oh": [
- "RolandTR505/rolandtr505-oh/Hat Open.wav"
- ],
+ "RolandTR505_cp": ["RolandTR505/rolandtr505-cp/Clap.wav"],
+ "RolandTR505_cr": ["RolandTR505/rolandtr505-cr/Crash.wav"],
+ "RolandTR505_hh": ["RolandTR505/rolandtr505-hh/Hat Closed.wav"],
+ "RolandTR505_ht": ["RolandTR505/rolandtr505-ht/Tom H.wav"],
+ "RolandTR505_lt": ["RolandTR505/rolandtr505-lt/Tom L.wav"],
+ "RolandTR505_mt": ["RolandTR505/rolandtr505-mt/Tom M.wav"],
+ "RolandTR505_oh": ["RolandTR505/rolandtr505-oh/Hat Open.wav"],
"RolandTR505_perc": [
"RolandTR505/rolandtr505-perc/Conga H.wav",
"RolandTR505/rolandtr505-perc/Conga L.wav",
"RolandTR505/rolandtr505-perc/Timbale.wav"
],
- "RolandTR505_rd": [
- "RolandTR505/rolandtr505-rd/Ride.wav"
- ],
- "RolandTR505_rim": [
- "RolandTR505/rolandtr505-rim/Rimshot.wav"
- ],
- "RolandTR505_sd": [
- "RolandTR505/rolandtr505-sd/Snaredrum.wav"
- ],
- "RolandTR606_bd": [
- "RolandTR606/rolandtr606-bd/Bassdrum.wav"
- ],
- "RolandTR606_cr": [
- "RolandTR606/rolandtr606-cr/Cymbal.wav"
- ],
- "RolandTR606_hh": [
- "RolandTR606/rolandtr606-hh/Hat Closed.wav"
- ],
- "RolandTR606_ht": [
- "RolandTR606/rolandtr606-ht/Tom H.wav"
- ],
- "RolandTR606_lt": [
- "RolandTR606/rolandtr606-lt/Tom L.wav"
- ],
- "RolandTR606_oh": [
- "RolandTR606/rolandtr606-oh/Hat Open.wav"
- ],
- "RolandTR606_sd": [
- "RolandTR606/rolandtr606-sd/Snaredrum.wav"
- ],
+ "RolandTR505_rd": ["RolandTR505/rolandtr505-rd/Ride.wav"],
+ "RolandTR505_rim": ["RolandTR505/rolandtr505-rim/Rimshot.wav"],
+ "RolandTR505_sd": ["RolandTR505/rolandtr505-sd/Snaredrum.wav"],
+ "RolandTR606_bd": ["RolandTR606/rolandtr606-bd/Bassdrum.wav"],
+ "RolandTR606_cr": ["RolandTR606/rolandtr606-cr/Cymbal.wav"],
+ "RolandTR606_hh": ["RolandTR606/rolandtr606-hh/Hat Closed.wav"],
+ "RolandTR606_ht": ["RolandTR606/rolandtr606-ht/Tom H.wav"],
+ "RolandTR606_lt": ["RolandTR606/rolandtr606-lt/Tom L.wav"],
+ "RolandTR606_oh": ["RolandTR606/rolandtr606-oh/Hat Open.wav"],
+ "RolandTR606_sd": ["RolandTR606/rolandtr606-sd/Snaredrum.wav"],
"RolandTR626_bd": [
"RolandTR626/rolandtr626-bd/Bassdrum-01.wav",
"RolandTR626/rolandtr626-bd/Bassdrum-02.wav"
],
- "RolandTR626_cb": [
- "RolandTR626/rolandtr626-cb/Cowbell.wav"
- ],
- "RolandTR626_cp": [
- "RolandTR626/rolandtr626-cp/Clap.wav"
- ],
+ "RolandTR626_cb": ["RolandTR626/rolandtr626-cb/Cowbell.wav"],
+ "RolandTR626_cp": ["RolandTR626/rolandtr626-cp/Clap.wav"],
"RolandTR626_cr": [
"RolandTR626/rolandtr626-cr/Crash.wav",
"RolandTR626/rolandtr626-cr/zChina.wav"
],
- "RolandTR626_hh": [
- "RolandTR626/rolandtr626-hh/Hat Closed.wav"
- ],
+ "RolandTR626_hh": ["RolandTR626/rolandtr626-hh/Hat Closed.wav"],
"RolandTR626_ht": [
"RolandTR626/rolandtr626-ht/Tom H-01.wav",
"RolandTR626/rolandtr626-ht/Tom H-02.wav"
@@ -2251,9 +1688,7 @@
"RolandTR626/rolandtr626-mt/Tom M-01.wav",
"RolandTR626/rolandtr626-mt/Tom M-02.wav"
],
- "RolandTR626_oh": [
- "RolandTR626/rolandtr626-oh/Hat Open.wav"
- ],
+ "RolandTR626_oh": ["RolandTR626/rolandtr626-oh/Hat Open.wav"],
"RolandTR626_perc": [
"RolandTR626/rolandtr626-perc/Agogo H.wav",
"RolandTR626/rolandtr626-perc/Agogo L.wav",
@@ -2268,58 +1703,32 @@
"RolandTR626/rolandtr626-rd/Ride-01.wav",
"RolandTR626/rolandtr626-rd/Ride-02.wav"
],
- "RolandTR626_rim": [
- "RolandTR626/rolandtr626-rim/Rimshot.wav"
- ],
+ "RolandTR626_rim": ["RolandTR626/rolandtr626-rim/Rimshot.wav"],
"RolandTR626_sd": [
"RolandTR626/rolandtr626-sd/Snaredrum-01.wav",
"RolandTR626/rolandtr626-sd/Snaredrum-02.wav",
"RolandTR626/rolandtr626-sd/Snaredrum-03.wav"
],
- "RolandTR626_sh": [
- "RolandTR626/rolandtr626-sh/Shaker.wav"
- ],
- "RolandTR626_tb": [
- "RolandTR626/rolandtr626-tb/Tambourine.wav"
- ],
+ "RolandTR626_sh": ["RolandTR626/rolandtr626-sh/Shaker.wav"],
+ "RolandTR626_tb": ["RolandTR626/rolandtr626-tb/Tambourine.wav"],
"RolandTR707_bd": [
"RolandTR707/rolandtr707-bd/Bassdrum-01.wav",
"RolandTR707/rolandtr707-bd/Bassdrum-02.wav"
],
- "RolandTR707_cb": [
- "RolandTR707/rolandtr707-cb/Cowbell.wav"
- ],
- "RolandTR707_cp": [
- "RolandTR707/rolandtr707-cp/Clap.wav"
- ],
- "RolandTR707_cr": [
- "RolandTR707/rolandtr707-cr/Crash.wav"
- ],
- "RolandTR707_hh": [
- "RolandTR707/rolandtr707-hh/Hat Closed.wav"
- ],
- "RolandTR707_ht": [
- "RolandTR707/rolandtr707-ht/Tom H.wav"
- ],
- "RolandTR707_lt": [
- "RolandTR707/rolandtr707-lt/Tom L.wav"
- ],
- "RolandTR707_mt": [
- "RolandTR707/rolandtr707-mt/Tom M.wav"
- ],
- "RolandTR707_oh": [
- "RolandTR707/rolandtr707-oh/Hat Open.wav"
- ],
- "RolandTR707_rim": [
- "RolandTR707/rolandtr707-rim/Rimshot.wav"
- ],
+ "RolandTR707_cb": ["RolandTR707/rolandtr707-cb/Cowbell.wav"],
+ "RolandTR707_cp": ["RolandTR707/rolandtr707-cp/Clap.wav"],
+ "RolandTR707_cr": ["RolandTR707/rolandtr707-cr/Crash.wav"],
+ "RolandTR707_hh": ["RolandTR707/rolandtr707-hh/Hat Closed.wav"],
+ "RolandTR707_ht": ["RolandTR707/rolandtr707-ht/Tom H.wav"],
+ "RolandTR707_lt": ["RolandTR707/rolandtr707-lt/Tom L.wav"],
+ "RolandTR707_mt": ["RolandTR707/rolandtr707-mt/Tom M.wav"],
+ "RolandTR707_oh": ["RolandTR707/rolandtr707-oh/Hat Open.wav"],
+ "RolandTR707_rim": ["RolandTR707/rolandtr707-rim/Rimshot.wav"],
"RolandTR707_sd": [
"RolandTR707/rolandtr707-sd/Snaredrum-01.wav",
"RolandTR707/rolandtr707-sd/Snaredrum-02.wav"
],
- "RolandTR707_tb": [
- "RolandTR707/rolandtr707-tb/Tambourine.wav"
- ],
+ "RolandTR707_tb": ["RolandTR707/rolandtr707-tb/Tambourine.wav"],
"RolandTR727_perc": [
"RolandTR727/rolandtr727-perc/Agogo H.wav",
"RolandTR727/rolandtr727-perc/Agogo L.wav",
@@ -2401,9 +1810,7 @@
"RolandTR808/rolandtr808-cr/CY7550.WAV",
"RolandTR808/rolandtr808-cr/CY7575.WAV"
],
- "RolandTR808_hh": [
- "RolandTR808/rolandtr808-hh/CH.WAV"
- ],
+ "RolandTR808_hh": ["RolandTR808/rolandtr808-hh/CH.WAV"],
"RolandTR808_ht": [
"RolandTR808/rolandtr808-ht/HT00.WAV",
"RolandTR808/rolandtr808-ht/HT10.WAV",
@@ -2450,9 +1857,7 @@
"RolandTR808/rolandtr808-perc/MC50.WAV",
"RolandTR808/rolandtr808-perc/MC75.WAV"
],
- "RolandTR808_rim": [
- "RolandTR808/rolandtr808-rim/RS.WAV"
- ],
+ "RolandTR808_rim": ["RolandTR808/rolandtr808-rim/RS.WAV"],
"RolandTR808_sd": [
"RolandTR808/rolandtr808-sd/SD0000.WAV",
"RolandTR808/rolandtr808-sd/SD0010.WAV",
@@ -2585,39 +1990,25 @@
"SakataDPM48/sakatadpm48-bd/Bassdrum-02.wav",
"SakataDPM48/sakatadpm48-bd/Bassdrum-03.wav"
],
- "SakataDPM48_cp": [
- "SakataDPM48/sakatadpm48-cp/Clap.wav"
- ],
- "SakataDPM48_cr": [
- "SakataDPM48/sakatadpm48-cr/Crash.wav"
- ],
+ "SakataDPM48_cp": ["SakataDPM48/sakatadpm48-cp/Clap.wav"],
+ "SakataDPM48_cr": ["SakataDPM48/sakatadpm48-cr/Crash.wav"],
"SakataDPM48_hh": [
"SakataDPM48/sakatadpm48-hh/Hat Closed-01.wav",
"SakataDPM48/sakatadpm48-hh/Hat Closed-02.wav"
],
- "SakataDPM48_ht": [
- "SakataDPM48/sakatadpm48-ht/Tom-01.wav"
- ],
+ "SakataDPM48_ht": ["SakataDPM48/sakatadpm48-ht/Tom-01.wav"],
"SakataDPM48_lt": [
"SakataDPM48/sakatadpm48-lt/Tom-03.wav",
"SakataDPM48/sakatadpm48-lt/Tom-04.wav"
],
- "SakataDPM48_mt": [
- "SakataDPM48/sakatadpm48-mt/Tom-02.wav"
- ],
- "SakataDPM48_oh": [
- "SakataDPM48/sakatadpm48-oh/Hat Open.wav"
- ],
+ "SakataDPM48_mt": ["SakataDPM48/sakatadpm48-mt/Tom-02.wav"],
+ "SakataDPM48_oh": ["SakataDPM48/sakatadpm48-oh/Hat Open.wav"],
"SakataDPM48_perc": [
"SakataDPM48/sakatadpm48-perc/Agogo1.wav",
"SakataDPM48/sakatadpm48-perc/Agogo2.wav"
],
- "SakataDPM48_rd": [
- "SakataDPM48/sakatadpm48-rd/Ride.wav"
- ],
- "SakataDPM48_rim": [
- "SakataDPM48/sakatadpm48-rim/Rim.wav"
- ],
+ "SakataDPM48_rd": ["SakataDPM48/sakatadpm48-rd/Ride.wav"],
+ "SakataDPM48_rim": ["SakataDPM48/sakatadpm48-rim/Rim.wav"],
"SakataDPM48_sd": [
"SakataDPM48/sakatadpm48-sd/Snaredrum-01.wav",
"SakataDPM48/sakatadpm48-sd/Snaredrum-02.wav"
@@ -2684,12 +2075,8 @@
"SequentialCircuitsTom_sd": [
"SequentialCircuitsTom/sequentialcircuitstom-sd/Snaredrum.wav"
],
- "SergeModular_bd": [
- "SergeModular/sergemodular-bd/Bassdrum.wav"
- ],
- "SergeModular_misc": [
- "SergeModular/sergemodular-misc/Clink.wav"
- ],
+ "SergeModular_bd": ["SergeModular/sergemodular-bd/Bassdrum.wav"],
+ "SergeModular_misc": ["SergeModular/sergemodular-misc/Clink.wav"],
"SergeModular_perc": [
"SergeModular/sergemodular-perc/Claves.wav",
"SergeModular/sergemodular-perc/Click-01.wav",
@@ -2805,18 +2192,10 @@
"SimmonsSDS5/simmonssds5-sd/Snaredrum-20.wav",
"SimmonsSDS5/simmonssds5-sd/Snaredrum-21.wav"
],
- "SoundmastersR88_bd": [
- "SoundmastersR88/soundmastersr88-bd/Bassdrum.wav"
- ],
- "SoundmastersR88_cr": [
- "SoundmastersR88/soundmastersr88-cr/Crash.wav"
- ],
- "SoundmastersR88_hh": [
- "SoundmastersR88/soundmastersr88-hh/Closed Hat.wav"
- ],
- "SoundmastersR88_oh": [
- "SoundmastersR88/soundmastersr88-oh/Open Hat.wav"
- ],
+ "SoundmastersR88_bd": ["SoundmastersR88/soundmastersr88-bd/Bassdrum.wav"],
+ "SoundmastersR88_cr": ["SoundmastersR88/soundmastersr88-cr/Crash.wav"],
+ "SoundmastersR88_hh": ["SoundmastersR88/soundmastersr88-hh/Closed Hat.wav"],
+ "SoundmastersR88_oh": ["SoundmastersR88/soundmastersr88-oh/Open Hat.wav"],
"SoundmastersR88_sd": [
"SoundmastersR88/soundmastersr88-sd/Snare-1.wav",
"SoundmastersR88/soundmastersr88-sd/Snare-2.wav"
@@ -2846,9 +2225,7 @@
"ViscoSpaceDrum/viscospacedrum-bd/Bassdrum-10.wav",
"ViscoSpaceDrum/viscospacedrum-bd/Bassdrum-11.wav"
],
- "ViscoSpaceDrum_cb": [
- "ViscoSpaceDrum/viscospacedrum-cb/Cowbell.wav"
- ],
+ "ViscoSpaceDrum_cb": ["ViscoSpaceDrum/viscospacedrum-cb/Cowbell.wav"],
"ViscoSpaceDrum_hh": [
"ViscoSpaceDrum/viscospacedrum-hh/Hat Closed-01.wav",
"ViscoSpaceDrum/viscospacedrum-hh/Hat Closed-02.wav",
@@ -2887,9 +2264,7 @@
"ViscoSpaceDrum/viscospacedrum-perc/Woodblock1.wav",
"ViscoSpaceDrum/viscospacedrum-perc/Woodblock2.wav"
],
- "ViscoSpaceDrum_rim": [
- "ViscoSpaceDrum/viscospacedrum-rim/Rimshot.wav"
- ],
+ "ViscoSpaceDrum_rim": ["ViscoSpaceDrum/viscospacedrum-rim/Rimshot.wav"],
"ViscoSpaceDrum_sd": [
"ViscoSpaceDrum/viscospacedrum-sd/Snaredrum-01.wav",
"ViscoSpaceDrum/viscospacedrum-sd/Snaredrum-02.wav",
@@ -2900,9 +2275,7 @@
"XdrumLM8953/xdrumlm8953-bd/Bassdrum-02.wav",
"XdrumLM8953/xdrumlm8953-bd/zphil-drm.wav"
],
- "XdrumLM8953_cr": [
- "XdrumLM8953/xdrumlm8953-cr/Crash.wav"
- ],
+ "XdrumLM8953_cr": ["XdrumLM8953/xdrumlm8953-cr/Crash.wav"],
"XdrumLM8953_hh": [
"XdrumLM8953/xdrumlm8953-hh/Hat Closed.wav",
"XdrumLM8953/xdrumlm8953-hh/Hat Pedal.wav"
@@ -2919,12 +2292,8 @@
"XdrumLM8953/xdrumlm8953-mt/Tom-03.wav",
"XdrumLM8953/xdrumlm8953-mt/Tom-04.wav"
],
- "XdrumLM8953_oh": [
- "XdrumLM8953/xdrumlm8953-oh/Hat Open.wav"
- ],
- "XdrumLM8953_rd": [
- "XdrumLM8953/xdrumlm8953-rd/Ride.wav"
- ],
+ "XdrumLM8953_oh": ["XdrumLM8953/xdrumlm8953-oh/Hat Open.wav"],
+ "XdrumLM8953_rd": ["XdrumLM8953/xdrumlm8953-rd/Ride.wav"],
"XdrumLM8953_rim": [
"XdrumLM8953/xdrumlm8953-rim/Rim Shot-01.wav",
"XdrumLM8953/xdrumlm8953-rim/Rim Shot-02.wav"
@@ -2936,9 +2305,7 @@
"XdrumLM8953/xdrumlm8953-sd/Snaredrum-04.wav",
"XdrumLM8953/xdrumlm8953-sd/zSnare Fill.wav"
],
- "XdrumLM8953_tb": [
- "XdrumLM8953/xdrumlm8953-tb/Tambourine.wav"
- ],
+ "XdrumLM8953_tb": ["XdrumLM8953/xdrumlm8953-tb/Tambourine.wav"],
"YamahaRM50_bd": [
"YamahaRM50/yamaharm50-bd/BD-001.wav",
"YamahaRM50/yamaharm50-bd/BD-002.wav",
@@ -3454,66 +2821,32 @@
"YamahaRM50/yamaharm50-tb/FX_031.wav",
"YamahaRM50/yamaharm50-tb/FX_032.wav"
],
- "YamahaRX21_bd": [
- "YamahaRX21/yamaharx21-bd/Bassdrum.wav"
- ],
- "YamahaRX21_cp": [
- "YamahaRX21/yamaharx21-cp/Clap.wav"
- ],
- "YamahaRX21_cr": [
- "YamahaRX21/yamaharx21-cr/Crash.wav"
- ],
- "YamahaRX21_hh": [
- "YamahaRX21/yamaharx21-hh/Closed Hat.wav"
- ],
- "YamahaRX21_ht": [
- "YamahaRX21/yamaharx21-ht/Tom H.wav"
- ],
- "YamahaRX21_lt": [
- "YamahaRX21/yamaharx21-lt/Tom L.wav"
- ],
- "YamahaRX21_mt": [
- "YamahaRX21/yamaharx21-mt/Tom M.wav"
- ],
- "YamahaRX21_oh": [
- "YamahaRX21/yamaharx21-oh/Open hat.wav"
- ],
- "YamahaRX21_sd": [
- "YamahaRX21/yamaharx21-sd/Snaredrum.wav"
- ],
+ "YamahaRX21_bd": ["YamahaRX21/yamaharx21-bd/Bassdrum.wav"],
+ "YamahaRX21_cp": ["YamahaRX21/yamaharx21-cp/Clap.wav"],
+ "YamahaRX21_cr": ["YamahaRX21/yamaharx21-cr/Crash.wav"],
+ "YamahaRX21_hh": ["YamahaRX21/yamaharx21-hh/Closed Hat.wav"],
+ "YamahaRX21_ht": ["YamahaRX21/yamaharx21-ht/Tom H.wav"],
+ "YamahaRX21_lt": ["YamahaRX21/yamaharx21-lt/Tom L.wav"],
+ "YamahaRX21_mt": ["YamahaRX21/yamaharx21-mt/Tom M.wav"],
+ "YamahaRX21_oh": ["YamahaRX21/yamaharx21-oh/Open hat.wav"],
+ "YamahaRX21_sd": ["YamahaRX21/yamaharx21-sd/Snaredrum.wav"],
"YamahaRX5_bd": [
"YamahaRX5/yamaharx5-bd/Bassdrum-02.wav",
"YamahaRX5/yamaharx5-bd/Bassdrum.wav"
],
- "YamahaRX5_cb": [
- "YamahaRX5/yamaharx5-cb/Cowbell.wav"
- ],
- "YamahaRX5_fx": [
- "YamahaRX5/yamaharx5-fx/SFX.wav"
- ],
- "YamahaRX5_hh": [
- "YamahaRX5/yamaharx5-hh/Hat Closed.wav"
- ],
- "YamahaRX5_lt": [
- "YamahaRX5/yamaharx5-lt/Tom.wav"
- ],
- "YamahaRX5_oh": [
- "YamahaRX5/yamaharx5-oh/Hat Open.wav"
- ],
- "YamahaRX5_rim": [
- "YamahaRX5/yamaharx5-rim/Rimshot.wav"
- ],
+ "YamahaRX5_cb": ["YamahaRX5/yamaharx5-cb/Cowbell.wav"],
+ "YamahaRX5_fx": ["YamahaRX5/yamaharx5-fx/SFX.wav"],
+ "YamahaRX5_hh": ["YamahaRX5/yamaharx5-hh/Hat Closed.wav"],
+ "YamahaRX5_lt": ["YamahaRX5/yamaharx5-lt/Tom.wav"],
+ "YamahaRX5_oh": ["YamahaRX5/yamaharx5-oh/Hat Open.wav"],
+ "YamahaRX5_rim": ["YamahaRX5/yamaharx5-rim/Rimshot.wav"],
"YamahaRX5_sd": [
"YamahaRX5/yamaharx5-sd/Snaredrum-02.wav",
"YamahaRX5/yamaharx5-sd/Snaredrum-03.wav",
"YamahaRX5/yamaharx5-sd/Snaredrum.wav"
],
- "YamahaRX5_sh": [
- "YamahaRX5/yamaharx5-sh/Shaker.wav"
- ],
- "YamahaRX5_tb": [
- "YamahaRX5/yamaharx5-tb/Tambourine.wav"
- ],
+ "YamahaRX5_sh": ["YamahaRX5/yamaharx5-sh/Shaker.wav"],
+ "YamahaRX5_tb": ["YamahaRX5/yamaharx5-tb/Tambourine.wav"],
"YamahaRY30_bd": [
"YamahaRY30/yamahary30-bd/Bassdrum-01.wav",
"YamahaRY30/yamahary30-bd/Bassdrum-02.wav",
@@ -3533,9 +2866,7 @@
"YamahaRY30/yamahary30-cb/Cowbell-01.wav",
"YamahaRY30/yamahary30-cb/Cowbell-02.wav"
],
- "YamahaRY30_cp": [
- "YamahaRY30/yamahary30-cp/Clap.wav"
- ],
+ "YamahaRY30_cp": ["YamahaRY30/yamahary30-cp/Clap.wav"],
"YamahaRY30_cr": [
"YamahaRY30/yamahary30-cr/Crash1.wav",
"YamahaRY30/yamahary30-cr/zChina.wav"
@@ -3627,9 +2958,7 @@
"YamahaRY30/yamahary30-sh/Cabasa-01.wav",
"YamahaRY30/yamahary30-sh/Cabasa-02.wav"
],
- "YamahaRY30_tb": [
- "YamahaRY30/yamahary30-tb/Tamb.wav"
- ],
+ "YamahaRY30_tb": ["YamahaRY30/yamahary30-tb/Tamb.wav"],
"YamahaTG33_bd": [
"YamahaTG33/yamahatg33-bd/Bassdrum-01.wav",
"YamahaTG33/yamahatg33-bd/Bassdrum-02.wav",
@@ -3641,17 +2970,13 @@
"YamahaTG33/yamahatg33-cb/Cowbell L.wav",
"YamahaTG33/yamahatg33-cb/Cowbell.wav"
],
- "YamahaTG33_cp": [
- "YamahaTG33/yamahatg33-cp/Clap.wav"
- ],
+ "YamahaTG33_cp": ["YamahaTG33/yamahatg33-cp/Clap.wav"],
"YamahaTG33_cr": [
"YamahaTG33/yamahatg33-cr/Crash-01.wav",
"YamahaTG33/yamahatg33-cr/Crash-02.wav",
"YamahaTG33/yamahatg33-cr/zCrash Reverse.wav"
],
- "YamahaTG33_fx": [
- "YamahaTG33/yamahatg33-fx/SFX-01.wav"
- ],
+ "YamahaTG33_fx": ["YamahaTG33/yamahatg33-fx/SFX-01.wav"],
"YamahaTG33_ht": [
"YamahaTG33/yamahatg33-ht/Tom-04.wav",
"YamahaTG33/yamahatg33-ht/Tom-06.wav"
@@ -3676,9 +3001,7 @@
"YamahaTG33/yamahatg33-mt/Tom-07.wav",
"YamahaTG33/yamahatg33-mt/zTom-02.wav"
],
- "YamahaTG33_oh": [
- "YamahaTG33/yamahatg33-oh/Hat Open.wav"
- ],
+ "YamahaTG33_oh": ["YamahaTG33/yamahatg33-oh/Hat Open.wav"],
"YamahaTG33_perc": [
"YamahaTG33/yamahatg33-perc/Bongo-01.wav",
"YamahaTG33/yamahatg33-perc/Bongo-02.wav",
@@ -3697,9 +3020,7 @@
"YamahaTG33/yamahatg33-rd/Ride-01.wav",
"YamahaTG33/yamahatg33-rd/Ride-02.wav"
],
- "YamahaTG33_rim": [
- "YamahaTG33/yamahatg33-rim/Rimshot.wav"
- ],
+ "YamahaTG33_rim": ["YamahaTG33/yamahatg33-rim/Rimshot.wav"],
"YamahaTG33_sd": [
"YamahaTG33/yamahatg33-sd/Snaredrum-01.wav",
"YamahaTG33/yamahatg33-sd/Snaredrum-02.wav",
@@ -3707,10 +3028,6 @@
"YamahaTG33/yamahatg33-sd/Snaredrum-04.wav",
"YamahaTG33/yamahatg33-sd/Snaredrum-05.wav"
],
- "YamahaTG33_sh": [
- "YamahaTG33/yamahatg33-sh/Shaker.wav"
- ],
- "YamahaTG33_tb": [
- "YamahaTG33/yamahatg33-tb/Tambourine.wav"
- ]
+ "YamahaTG33_sh": ["YamahaTG33/yamahatg33-sh/Shaker.wav"],
+ "YamahaTG33_tb": ["YamahaTG33/yamahatg33-tb/Tambourine.wav"]
}
diff --git a/tsconfig.json b/tsconfig.json
index 1ad475b..641e63e 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -15,7 +15,7 @@
/* Linting */
"strict": true,
- "forceConsistentCasingInFileNames": true,
+ "forceConsistentCasingInFileNames": true,
"useDefineForClassFields": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
diff --git a/yarn.lock b/yarn.lock
index b1598b0..1859df8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4028,10 +4028,15 @@ yaml@^2.1.1:
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b"
integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==
-zifferjs@^0.0.39:
- version "0.0.39"
- resolved "https://registry.yarnpkg.com/zifferjs/-/zifferjs-0.0.39.tgz#a3916ca1b38d493edea14bf4f29948f2f6f1572e"
- integrity sha512-WMSJ9SPGA/OP/9Z936anUUOM66qzuwPZaE99Qix+Q7jr4fFuoZ/Xw76m2/1C2UVk85sauAecnSfjcK3zo6nA3Q==
+zifferjs@^0.0.44:
+ version "0.0.44"
+ resolved "https://registry.yarnpkg.com/zifferjs/-/zifferjs-0.0.44.tgz#c6b425166488ec05e349867e3de2460b74204449"
+ integrity sha512-Q+0affxeUZwl+oJpsa1nb4hqHV6V4VX+pkejCQq/e9+/0H6ooTpcDQ9IDopvrWBnhA8E11k0tbwUee5TJtE8UQ==
+
+zyklus@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/zyklus/-/zyklus-0.1.4.tgz#229b2966fd1126ef72c6004697269118762bdcd5"
+ integrity sha512-hbv2cyy4nOI7P8nL8b3ki1jswoLzkUzewPgCLDdDfABryDkV5iO8DAbU25OgO5ShRZHLjXJIylwv5PJQPl3Mpw==
zzfx@^1.2.0:
version "1.2.0"