mirror of
https://codeberg.org/uzu/strudel
synced 2026-09-16 10:46:57 -04:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ecbd7c77a5 | |||
| ec920a1551 | |||
| d6045c943b | |||
| 30c80119e9 | |||
| ab12c6ae0a | |||
| 4a894b0be2 | |||
| 4ad305550e | |||
| cf5c502a05 | |||
| e136e95375 | |||
| 004c0baa59 | |||
| 2dd528134a | |||
| fef50e654c |
@@ -1,9 +1,12 @@
|
||||
import { registerSound, onTriggerSample } from '@strudel/webaudio';
|
||||
import { isAudioFile } from './files.mjs';
|
||||
import { logger } from '@strudel/core';
|
||||
|
||||
//utilites for writing and reading to the indexdb
|
||||
|
||||
|
||||
export const isAudioFile = (filename) =>
|
||||
['wav', 'mp3', 'flac', 'ogg', 'm4a', 'aac'].includes(filename.split('.').slice(-1)[0]);
|
||||
|
||||
export const userSamplesDBConfig = {
|
||||
dbName: 'samples',
|
||||
table: 'usersamples',
|
||||
@@ -25,6 +25,8 @@ export * from './cyclist.mjs';
|
||||
export * from './logger.mjs';
|
||||
export * from './time.mjs';
|
||||
export * from './ui.mjs';
|
||||
export * from './ui.mjs';
|
||||
export * from './idbutils.mjs'
|
||||
export { default as drawLine } from './drawLine.mjs';
|
||||
// below won't work with runtime.mjs (json import fails)
|
||||
/* import * as p from './package.json';
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
export * from './repl-component.mjs';
|
||||
export * from './prebake.mjs';
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { noteToMidi, valueToMidi, Pattern, evalScope } from '@strudel/core';
|
||||
import { aliasBank, registerSynthSounds, registerZZFXSounds, samples } from '@strudel/webaudio';
|
||||
import { noteToMidi, valueToMidi, Pattern, evalScope,registerSamplesFromDB } from '@strudel/core';
|
||||
import { aliasBank, registerSynthSounds, registerZZFXSounds, samples, } from '@strudel/webaudio';
|
||||
import * as core from '@strudel/core';
|
||||
|
||||
export async function prebake() {
|
||||
@@ -28,6 +28,7 @@ export async function prebake() {
|
||||
modulesLoading,
|
||||
registerSynthSounds(),
|
||||
registerZZFXSounds(),
|
||||
registerSamplesFromDB(),
|
||||
//registerSoundfonts(),
|
||||
// need dynamic import here, because importing @strudel/soundfonts fails on server:
|
||||
// => getting "window is not defined", as soon as "@strudel/soundfonts" is imported statically
|
||||
@@ -36,9 +37,10 @@ export async function prebake() {
|
||||
samples(`${ds}/tidal-drum-machines.json`),
|
||||
samples(`${ds}/piano.json`),
|
||||
samples(`${ds}/Dirt-Samples.json`),
|
||||
samples(`${ds}/EmuSP12.json`),
|
||||
samples(`https://raw.githubusercontent.com/tidalcycles/uzu-drumkit/main/strudel.json`),
|
||||
samples(`${ds}/vcsl.json`),
|
||||
samples(`${ds}/mridangam.json`),
|
||||
registerSamplesFromDB(),
|
||||
]);
|
||||
|
||||
aliasBank(`${ts}/tidal-drum-machines-alias.json`);
|
||||
|
||||
@@ -216,50 +216,63 @@ function getSamplesPrefixHandler(url) {
|
||||
*/
|
||||
|
||||
export const samples = async (sampleMap, baseUrl = sampleMap._base || '', options = {}) => {
|
||||
|
||||
if (typeof sampleMap === 'string') {
|
||||
// check if custom prefix handler
|
||||
const handler = getSamplesPrefixHandler(sampleMap);
|
||||
if (handler) {
|
||||
return handler(sampleMap);
|
||||
}
|
||||
sampleMap = resolveSpecialPaths(sampleMap);
|
||||
if (sampleMap.startsWith('github:')) {
|
||||
sampleMap = githubPath(sampleMap, 'strudel.json');
|
||||
}
|
||||
if (sampleMap.startsWith('local:')) {
|
||||
sampleMap = `http://localhost:5432`;
|
||||
}
|
||||
if (sampleMap.startsWith('shabda:')) {
|
||||
let [_, path] = sampleMap.split('shabda:');
|
||||
sampleMap = `https://shabda.ndre.gr/${path}.json?strudel=1`;
|
||||
}
|
||||
if (sampleMap.startsWith('shabda/speech')) {
|
||||
let [_, path] = sampleMap.split('shabda/speech');
|
||||
path = path.startsWith('/') ? path.substring(1) : path;
|
||||
let [params, words] = path.split(':');
|
||||
let gender = 'f';
|
||||
let language = 'en-GB';
|
||||
if (params) {
|
||||
[language, gender] = params.split('/');
|
||||
}
|
||||
sampleMap = `https://shabda.ndre.gr/speech/${words}.json?gender=${gender}&language=${language}&strudel=1'`;
|
||||
}
|
||||
if (typeof fetch !== 'function') {
|
||||
// not a browser
|
||||
return;
|
||||
}
|
||||
const base = sampleMap.split('/').slice(0, -1).join('/');
|
||||
if (typeof fetch === 'undefined') {
|
||||
// skip fetch when in node / testing
|
||||
return;
|
||||
const savedJSON = localStorage.getItem(sampleMap)
|
||||
if (savedJSON) {
|
||||
const json = JSON.parse(savedJSON)
|
||||
samples(json, baseUrl || json._base || base, options)
|
||||
} else {
|
||||
|
||||
|
||||
// check if custom prefix handler
|
||||
const handler = getSamplesPrefixHandler(sampleMap);
|
||||
if (handler) {
|
||||
return handler(sampleMap);
|
||||
}
|
||||
sampleMap = resolveSpecialPaths(sampleMap);
|
||||
if (sampleMap.startsWith('github:')) {
|
||||
sampleMap = githubPath(sampleMap, 'strudel.json');
|
||||
}
|
||||
if (sampleMap.startsWith('local:')) {
|
||||
sampleMap = `http://localhost:5432`;
|
||||
}
|
||||
if (sampleMap.startsWith('shabda:')) {
|
||||
let [_, path] = sampleMap.split('shabda:');
|
||||
sampleMap = `https://shabda.ndre.gr/${path}.json?strudel=1`;
|
||||
}
|
||||
if (sampleMap.startsWith('shabda/speech')) {
|
||||
let [_, path] = sampleMap.split('shabda/speech');
|
||||
path = path.startsWith('/') ? path.substring(1) : path;
|
||||
let [params, words] = path.split(':');
|
||||
let gender = 'f';
|
||||
let language = 'en-GB';
|
||||
if (params) {
|
||||
[language, gender] = params.split('/');
|
||||
}
|
||||
sampleMap = `https://shabda.ndre.gr/speech/${words}.json?gender=${gender}&language=${language}&strudel=1'`;
|
||||
}
|
||||
if (typeof fetch !== 'function') {
|
||||
// not a browser
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeof fetch === 'undefined') {
|
||||
// skip fetch when in node / testing
|
||||
return;
|
||||
}
|
||||
return fetch(sampleMap)
|
||||
.then((res) => res.json())
|
||||
.then((json) => {
|
||||
localStorage.setItem(sampleMap, JSON.stringify(json))
|
||||
samples(json, baseUrl || json._base || base, options)
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error(error);
|
||||
throw new Error(`error loading "${sampleMap}"`);
|
||||
});
|
||||
}
|
||||
return fetch(sampleMap)
|
||||
.then((res) => res.json())
|
||||
.then((json) => samples(json, baseUrl || json._base || base, options))
|
||||
.catch((error) => {
|
||||
console.error(error);
|
||||
throw new Error(`error loading "${sampleMap}"`);
|
||||
});
|
||||
}
|
||||
const { prebake, tag } = options;
|
||||
processSampleMap(
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
{
|
||||
"_base": "https://raw.githubusercontent.com/ritchse/tidal-drum-machines/main/machines/EmuSP12/",
|
||||
"bd": ["emusp12-bd/Bassdrum-01.wav","emusp12-bd/Bassdrum-02.wav","emusp12-bd/Bassdrum-03.wav","emusp12-bd/Bassdrum-04.wav","emusp12-bd/Bassdrum-05.wav","emusp12-bd/Bassdrum-06.wav","emusp12-bd/Bassdrum-07.wav","emusp12-bd/Bassdrum-08.wav","emusp12-bd/Bassdrum-09.wav","emusp12-bd/Bassdrum-10.wav","emusp12-bd/Bassdrum-11.wav","emusp12-bd/Bassdrum-12.wav","emusp12-bd/Bassdrum-13.wav","emusp12-bd/Bassdrum-14.wav"],
|
||||
"cb": ["emusp12-cb/Cowbell.wav"],
|
||||
"cp": ["emusp12-cp/Clap.wav"],
|
||||
"cr": ["emusp12-cr/Crash.wav"],
|
||||
"hh": ["emusp12-hh/Hat Closed-01.wav","emusp12-hh/Hat Closed-02.wav"],
|
||||
"ht": ["emusp12-ht/Tom H-01.wav","emusp12-ht/Tom H-02.wav","emusp12-ht/Tom H-03.wav","emusp12-ht/Tom H-04.wav","emusp12-ht/Tom H-05.wav","emusp12-ht/Tom H-06.wav"],
|
||||
"lt": ["emusp12-lt/Tom L-01.wav","emusp12-lt/Tom L-02.wav","emusp12-lt/Tom L-03.wav","emusp12-lt/Tom L-04.wav","emusp12-lt/Tom L-05.wav","emusp12-lt/Tom L-06.wav"],
|
||||
"misc": ["emusp12-misc/Metal-01.wav","emusp12-misc/Metal-02.wav","emusp12-misc/Metal-03.wav","emusp12-misc/Scratch.wav","emusp12-misc/Shot-01.wav","emusp12-misc/Shot-02.wav","emusp12-misc/Shot-03.wav"],
|
||||
"mt": ["emusp12-mt/Tom M-01.wav","emusp12-mt/Tom M-02.wav","emusp12-mt/Tom M-03.wav","emusp12-mt/Tom M-05.wav"],
|
||||
"oh": ["emusp12-oh/Hhopen1.wav"],
|
||||
"perc": ["emusp12-perc/Blow1.wav"],
|
||||
"rd": ["emusp12-rd/Ride.wav"],
|
||||
"rim": ["emusp12-rim/zRim Shot-01.wav","emusp12-rim/zRim Shot-02.wav"],
|
||||
"sd": ["emusp12-sd/Snaredrum-01.wav","emusp12-sd/Snaredrum-02.wav","emusp12-sd/Snaredrum-03.wav","emusp12-sd/Snaredrum-04.wav","emusp12-sd/Snaredrum-05.wav","emusp12-sd/Snaredrum-06.wav","emusp12-sd/Snaredrum-07.wav","emusp12-sd/Snaredrum-08.wav","emusp12-sd/Snaredrum-09.wav","emusp12-sd/Snaredrum-10.wav","emusp12-sd/Snaredrum-11.wav","emusp12-sd/Snaredrum-12.wav","emusp12-sd/Snaredrum-13.wav","emusp12-sd/Snaredrum-14.wav","emusp12-sd/Snaredrum-15.wav","emusp12-sd/Snaredrum-16.wav","emusp12-sd/Snaredrum-17.wav","emusp12-sd/Snaredrum-18.wav","emusp12-sd/Snaredrum-19.wav","emusp12-sd/Snaredrum-20.wav","emusp12-sd/Snaredrum-21.wav"]
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Fragment, useEffect } from 'react';
|
||||
import React, { useMemo, useState } from 'react';
|
||||
import { isAudioFile, readDir, dir, playFile } from '../../files.mjs';
|
||||
|
||||
import { useMemo, useState } from 'react';
|
||||
import { readDir, dir, playFile } from '../../files.mjs';
|
||||
import { isAudioFile } from '@strudel/core';
|
||||
export function FilesTab() {
|
||||
const [path, setPath] = useState([]);
|
||||
useEffect(() => {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import React, { useCallback, useState } from 'react';
|
||||
import { registerSamplesFromDB, uploadSamplesToDB, userSamplesDBConfig } from '../../idbutils.mjs';
|
||||
import { registerSamplesFromDB, uploadSamplesToDB, userSamplesDBConfig } from '@strudel/core';
|
||||
|
||||
//choose a directory to locally import samples
|
||||
export default function ImportSoundsButton({ onComplete }) {
|
||||
|
||||
@@ -125,7 +125,7 @@ function UserPatterns({ context }) {
|
||||
style={{ display: 'none' }}
|
||||
type="file"
|
||||
multiple
|
||||
accept="text/plain,application/json"
|
||||
accept="text/plain,text/x-markdown,application/json"
|
||||
onChange={(e) => importPatterns(e.target.files)}
|
||||
/>
|
||||
import
|
||||
|
||||
@@ -75,8 +75,7 @@ export const walkFileTree = (node, fn) => {
|
||||
}
|
||||
};
|
||||
|
||||
export const isAudioFile = (filename) =>
|
||||
['wav', 'mp3', 'flac', 'ogg', 'm4a', 'aac'].includes(filename.split('.').slice(-1)[0]);
|
||||
|
||||
|
||||
function uint8ArrayToDataURL(uint8Array) {
|
||||
const blob = new Blob([uint8Array], { type: 'audio/*' });
|
||||
|
||||
+146
-141
@@ -1,153 +1,158 @@
|
||||
import { Pattern, noteToMidi, valueToMidi } from '@strudel/core';
|
||||
import { aliasBank, registerSynthSounds, registerZZFXSounds, samples } from '@strudel/webaudio';
|
||||
import { registerSamplesFromDB } from './idbutils.mjs';
|
||||
import { registerSamplesFromDB } from '@strudel/core'
|
||||
import './piano.mjs';
|
||||
import './files.mjs';
|
||||
|
||||
const { BASE_URL } = import.meta.env;
|
||||
const baseNoTrailing = BASE_URL.endsWith('/') ? BASE_URL.slice(0, -1) : BASE_URL;
|
||||
|
||||
export async function prebake() {
|
||||
// https://archive.org/details/SalamanderGrandPianoV3
|
||||
// License: CC-by http://creativecommons.org/licenses/by/3.0/ Author: Alexander Holm
|
||||
await Promise.all([
|
||||
registerSynthSounds(),
|
||||
registerZZFXSounds(),
|
||||
registerSamplesFromDB(),
|
||||
//registerSoundfonts(),
|
||||
// need dynamic import here, because importing @strudel/soundfonts fails on server:
|
||||
// => getting "window is not defined", as soon as "@strudel/soundfonts" is imported statically
|
||||
// seems to be a problem with soundfont2
|
||||
import('@strudel/soundfonts').then(({ registerSoundfonts }) => registerSoundfonts()),
|
||||
samples(`${baseNoTrailing}/piano.json`, undefined, { prebake: true }),
|
||||
// https://github.com/sgossner/VCSL/
|
||||
// https://api.github.com/repositories/126427031/contents/
|
||||
// LICENSE: CC0 general-purpose
|
||||
samples(`${baseNoTrailing}/vcsl.json`, 'github:sgossner/VCSL/master/', { prebake: true }),
|
||||
samples(`${baseNoTrailing}/tidal-drum-machines.json`, 'github:ritchse/tidal-drum-machines/main/machines/', {
|
||||
prebake: true,
|
||||
tag: 'drum-machines',
|
||||
}),
|
||||
samples(`${baseNoTrailing}/EmuSP12.json`, undefined, { prebake: true, tag: 'drum-machines' }),
|
||||
samples(`${baseNoTrailing}/mridangam.json`, undefined, { prebake: true, tag: 'drum-machines' }),
|
||||
samples(
|
||||
{
|
||||
casio: ['casio/high.wav', 'casio/low.wav', 'casio/noise.wav'],
|
||||
crow: ['crow/000_crow.wav', 'crow/001_crow2.wav', 'crow/002_crow3.wav', 'crow/003_crow4.wav'],
|
||||
insect: [
|
||||
'insect/000_everglades_conehead.wav',
|
||||
'insect/001_robust_shieldback.wav',
|
||||
'insect/002_seashore_meadow_katydid.wav',
|
||||
],
|
||||
wind: [
|
||||
'wind/000_wind1.wav',
|
||||
'wind/001_wind10.wav',
|
||||
'wind/002_wind2.wav',
|
||||
'wind/003_wind3.wav',
|
||||
'wind/004_wind4.wav',
|
||||
'wind/005_wind5.wav',
|
||||
'wind/006_wind6.wav',
|
||||
'wind/007_wind7.wav',
|
||||
'wind/008_wind8.wav',
|
||||
'wind/009_wind9.wav',
|
||||
],
|
||||
jazz: [
|
||||
'jazz/000_BD.wav',
|
||||
'jazz/001_CB.wav',
|
||||
'jazz/002_FX.wav',
|
||||
'jazz/003_HH.wav',
|
||||
'jazz/004_OH.wav',
|
||||
'jazz/005_P1.wav',
|
||||
'jazz/006_P2.wav',
|
||||
'jazz/007_SN.wav',
|
||||
],
|
||||
metal: [
|
||||
'metal/000_0.wav',
|
||||
'metal/001_1.wav',
|
||||
'metal/002_2.wav',
|
||||
'metal/003_3.wav',
|
||||
'metal/004_4.wav',
|
||||
'metal/005_5.wav',
|
||||
'metal/006_6.wav',
|
||||
'metal/007_7.wav',
|
||||
'metal/008_8.wav',
|
||||
'metal/009_9.wav',
|
||||
],
|
||||
east: [
|
||||
'east/000_nipon_wood_block.wav',
|
||||
'east/001_ohkawa_mute.wav',
|
||||
'east/002_ohkawa_open.wav',
|
||||
'east/003_shime_hi.wav',
|
||||
'east/004_shime_hi_2.wav',
|
||||
'east/005_shime_mute.wav',
|
||||
'east/006_taiko_1.wav',
|
||||
'east/007_taiko_2.wav',
|
||||
'east/008_taiko_3.wav',
|
||||
],
|
||||
space: [
|
||||
'space/000_0.wav',
|
||||
'space/001_1.wav',
|
||||
'space/002_11.wav',
|
||||
'space/003_12.wav',
|
||||
'space/004_13.wav',
|
||||
'space/005_14.wav',
|
||||
'space/006_15.wav',
|
||||
'space/007_16.wav',
|
||||
'space/008_17.wav',
|
||||
'space/009_18.wav',
|
||||
'space/010_2.wav',
|
||||
'space/011_3.wav',
|
||||
'space/012_4.wav',
|
||||
'space/013_5.wav',
|
||||
'space/014_6.wav',
|
||||
'space/015_7.wav',
|
||||
'space/016_8.wav',
|
||||
'space/017_9.wav',
|
||||
],
|
||||
numbers: [
|
||||
'numbers/0.wav',
|
||||
'numbers/1.wav',
|
||||
'numbers/2.wav',
|
||||
'numbers/3.wav',
|
||||
'numbers/4.wav',
|
||||
'numbers/5.wav',
|
||||
'numbers/6.wav',
|
||||
'numbers/7.wav',
|
||||
'numbers/8.wav',
|
||||
],
|
||||
num: [
|
||||
'num/00.wav',
|
||||
'num/01.wav',
|
||||
'num/02.wav',
|
||||
'num/03.wav',
|
||||
'num/04.wav',
|
||||
'num/05.wav',
|
||||
'num/06.wav',
|
||||
'num/07.wav',
|
||||
'num/08.wav',
|
||||
'num/09.wav',
|
||||
'num/10.wav',
|
||||
'num/11.wav',
|
||||
'num/12.wav',
|
||||
'num/13.wav',
|
||||
'num/14.wav',
|
||||
'num/15.wav',
|
||||
'num/16.wav',
|
||||
'num/17.wav',
|
||||
'num/18.wav',
|
||||
'num/19.wav',
|
||||
'num/20.wav',
|
||||
],
|
||||
},
|
||||
'github:tidalcycles/dirt-samples',
|
||||
{
|
||||
prebake: true,
|
||||
},
|
||||
),
|
||||
]);
|
||||
// export async function prebake() {
|
||||
// // https://archive.org/details/SalamanderGrandPianoV3
|
||||
// // License: CC-by http://creativecommons.org/licenses/by/3.0/ Author: Alexander Holm
|
||||
|
||||
|
||||
// await Promise.all([
|
||||
// registerSynthSounds(),
|
||||
// registerZZFXSounds(),
|
||||
// registerSamplesFromDB(),
|
||||
// //registerSoundfonts(),
|
||||
// // need dynamic import here, because importing @strudel/soundfonts fails on server:
|
||||
// // => getting "window is not defined", as soon as "@strudel/soundfonts" is imported statically
|
||||
// // seems to be a problem with soundfont2
|
||||
// import('@strudel/soundfonts').then(({ registerSoundfonts }) => registerSoundfonts()),
|
||||
// samples(`${baseNoTrailing}/piano.json`, undefined, { prebake: true }),
|
||||
// // https://github.com/sgossner/VCSL/
|
||||
// // https://api.github.com/repositories/126427031/contents/
|
||||
// // LICENSE: CC0 general-purpose
|
||||
// samples(`${baseNoTrailing}/vcsl.json`, 'github:sgossner/VCSL/master/', { prebake: true }),
|
||||
// samples(`${baseNoTrailing}/tidal-drum-machines.json`, 'github:ritchse/tidal-drum-machines/main/machines/', {
|
||||
// prebake: true,
|
||||
// tag: 'drum-machines',
|
||||
// }),
|
||||
// samples(`https://raw.githubusercontent.com/tidalcycles/uzu-drumkit/main/strudel.json`, undefined, {
|
||||
// prebake: true,
|
||||
// tag: 'drum-machines',
|
||||
// }),
|
||||
// samples(`${baseNoTrailing}/mridangam.json`, undefined, { prebake: true, tag: 'drum-machines' }),
|
||||
// samples(
|
||||
// {
|
||||
// casio: ['casio/high.wav', 'casio/low.wav', 'casio/noise.wav'],
|
||||
// crow: ['crow/000_crow.wav', 'crow/001_crow2.wav', 'crow/002_crow3.wav', 'crow/003_crow4.wav'],
|
||||
// insect: [
|
||||
// 'insect/000_everglades_conehead.wav',
|
||||
// 'insect/001_robust_shieldback.wav',
|
||||
// 'insect/002_seashore_meadow_katydid.wav',
|
||||
// ],
|
||||
// wind: [
|
||||
// 'wind/000_wind1.wav',
|
||||
// 'wind/001_wind10.wav',
|
||||
// 'wind/002_wind2.wav',
|
||||
// 'wind/003_wind3.wav',
|
||||
// 'wind/004_wind4.wav',
|
||||
// 'wind/005_wind5.wav',
|
||||
// 'wind/006_wind6.wav',
|
||||
// 'wind/007_wind7.wav',
|
||||
// 'wind/008_wind8.wav',
|
||||
// 'wind/009_wind9.wav',
|
||||
// ],
|
||||
// jazz: [
|
||||
// 'jazz/000_BD.wav',
|
||||
// 'jazz/001_CB.wav',
|
||||
// 'jazz/002_FX.wav',
|
||||
// 'jazz/003_HH.wav',
|
||||
// 'jazz/004_OH.wav',
|
||||
// 'jazz/005_P1.wav',
|
||||
// 'jazz/006_P2.wav',
|
||||
// 'jazz/007_SN.wav',
|
||||
// ],
|
||||
// metal: [
|
||||
// 'metal/000_0.wav',
|
||||
// 'metal/001_1.wav',
|
||||
// 'metal/002_2.wav',
|
||||
// 'metal/003_3.wav',
|
||||
// 'metal/004_4.wav',
|
||||
// 'metal/005_5.wav',
|
||||
// 'metal/006_6.wav',
|
||||
// 'metal/007_7.wav',
|
||||
// 'metal/008_8.wav',
|
||||
// 'metal/009_9.wav',
|
||||
// ],
|
||||
// east: [
|
||||
// 'east/000_nipon_wood_block.wav',
|
||||
// 'east/001_ohkawa_mute.wav',
|
||||
// 'east/002_ohkawa_open.wav',
|
||||
// 'east/003_shime_hi.wav',
|
||||
// 'east/004_shime_hi_2.wav',
|
||||
// 'east/005_shime_mute.wav',
|
||||
// 'east/006_taiko_1.wav',
|
||||
// 'east/007_taiko_2.wav',
|
||||
// 'east/008_taiko_3.wav',
|
||||
// ],
|
||||
// space: [
|
||||
// 'space/000_0.wav',
|
||||
// 'space/001_1.wav',
|
||||
// 'space/002_11.wav',
|
||||
// 'space/003_12.wav',
|
||||
// 'space/004_13.wav',
|
||||
// 'space/005_14.wav',
|
||||
// 'space/006_15.wav',
|
||||
// 'space/007_16.wav',
|
||||
// 'space/008_17.wav',
|
||||
// 'space/009_18.wav',
|
||||
// 'space/010_2.wav',
|
||||
// 'space/011_3.wav',
|
||||
// 'space/012_4.wav',
|
||||
// 'space/013_5.wav',
|
||||
// 'space/014_6.wav',
|
||||
// 'space/015_7.wav',
|
||||
// 'space/016_8.wav',
|
||||
// 'space/017_9.wav',
|
||||
// ],
|
||||
// numbers: [
|
||||
// 'numbers/0.wav',
|
||||
// 'numbers/1.wav',
|
||||
// 'numbers/2.wav',
|
||||
// 'numbers/3.wav',
|
||||
// 'numbers/4.wav',
|
||||
// 'numbers/5.wav',
|
||||
// 'numbers/6.wav',
|
||||
// 'numbers/7.wav',
|
||||
// 'numbers/8.wav',
|
||||
// ],
|
||||
// num: [
|
||||
// 'num/00.wav',
|
||||
// 'num/01.wav',
|
||||
// 'num/02.wav',
|
||||
// 'num/03.wav',
|
||||
// 'num/04.wav',
|
||||
// 'num/05.wav',
|
||||
// 'num/06.wav',
|
||||
// 'num/07.wav',
|
||||
// 'num/08.wav',
|
||||
// 'num/09.wav',
|
||||
// 'num/10.wav',
|
||||
// 'num/11.wav',
|
||||
// 'num/12.wav',
|
||||
// 'num/13.wav',
|
||||
// 'num/14.wav',
|
||||
// 'num/15.wav',
|
||||
// 'num/16.wav',
|
||||
// 'num/17.wav',
|
||||
// 'num/18.wav',
|
||||
// 'num/19.wav',
|
||||
// 'num/20.wav',
|
||||
// ],
|
||||
// },
|
||||
// 'github:tidalcycles/dirt-samples',
|
||||
// {
|
||||
// prebake: true,
|
||||
// },
|
||||
// ),
|
||||
// ]);
|
||||
|
||||
aliasBank(`${baseNoTrailing}/tidal-drum-machines-alias.json`);
|
||||
}
|
||||
// aliasBank(`${baseNoTrailing}/tidal-drum-machines-alias.json`);
|
||||
// }
|
||||
|
||||
const maxPan = noteToMidi('C8');
|
||||
const panwidth = (pan, width) => pan * width + (1 - width) / 2;
|
||||
|
||||
@@ -31,7 +31,7 @@ import {
|
||||
import { superdirtOutput } from '@strudel/osc/superdirtoutput';
|
||||
import { audioEngineTargets } from '../settings.mjs';
|
||||
import { useStore } from '@nanostores/react';
|
||||
import { prebake } from './prebake.mjs';
|
||||
import { prebake } from '../../../packages/repl/prebake.mjs'
|
||||
import { getRandomTune, initCode, loadModules, shareCode } from './util.mjs';
|
||||
import './Repl.css';
|
||||
import { setInterval, clearInterval } from 'worker-timers';
|
||||
|
||||
@@ -197,7 +197,7 @@ export async function importPatterns(fileList) {
|
||||
if (file.type === 'application/json') {
|
||||
const userPatterns = userPattern.getAll();
|
||||
setUserPatterns({ ...userPatterns, ...parseJSON(content) });
|
||||
} else if (file.type === 'text/plain') {
|
||||
} else if (['text/x-markdown', 'text/plain'].includes(file.type)) {
|
||||
const id = file.name.replace(/\.[^/.]+$/, '');
|
||||
userPattern.update(id, { code: content });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user