@react-synth/synth 0.0.7-alpha → 0.2.1-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +361 -187
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +80 -80
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/audio/scheduler.ts","../src/components/Track.tsx","../src/components/Loop.tsx","../src/utils/envelope.ts","../node_modules/@tonaljs/pitch/dist/index.mjs","../node_modules/@tonaljs/pitch-interval/dist/index.mjs","../node_modules/@tonaljs/pitch-note/dist/index.mjs","../node_modules/@tonaljs/pitch-distance/dist/index.mjs","../node_modules/@tonaljs/collection/dist/index.mjs","../node_modules/@tonaljs/pcset/dist/index.mjs","../node_modules/@tonaljs/chord-type/dist/index.mjs","../node_modules/@tonaljs/interval/dist/index.mjs","../node_modules/@tonaljs/scale-type/dist/index.mjs","../node_modules/@tonaljs/chord/dist/index.mjs","../node_modules/@tonaljs/duration-value/dist/index.mjs","../node_modules/@tonaljs/midi/dist/index.mjs","../node_modules/@tonaljs/note/dist/index.mjs","../node_modules/@tonaljs/mode/dist/index.mjs","../src/utils/notes.ts","../src/utils/line.ts","../src/components/Synth/presets.ts","../src/components/Synth/Synth.tsx","../src/components/Note/Note.tsx","../src/audio/sampleLoader.ts","../src/components/Sample/Sample.tsx","../src/components/Chord.tsx","../src/components/Sequence.tsx"],"sourcesContent":["import {\r\n AudioContext,\r\n type AudioContext as AudioContextType,\r\n} from \"node-web-audio-api\";\r\n\r\nexport type ScheduleCallback = (audioTime: number, beatTime: number) => void;\r\n\r\ntype ScheduledEvent = {\r\n id: string;\r\n nextBeatTime: number;\r\n intervalBeats: number;\r\n callback: ScheduleCallback;\r\n active: boolean;\r\n /** Timestamp when the loop was marked for removal (for grace period during HMR) */\r\n pendingRemoval?: number;\r\n};\r\n\r\nlet schedulerInstance: Scheduler | undefined;\r\nlet audioContextInstance: AudioContextType | undefined;\r\n\r\nexport class Scheduler {\r\n private context: AudioContextType;\r\n private _bpm: number;\r\n private startTime: number;\r\n private events: Map<string, ScheduledEvent> = new Map();\r\n private timerID: ReturnType<typeof setInterval> | null = null;\r\n private running = false;\r\n\r\n private readonly lookahead = 0.1;\r\n private readonly scheduleInterval = 25;\r\n /** Grace period before actually removing a loop - allows React HMR to re-add it */\r\n private readonly removalGracePeriod = 100;\r\n\r\n constructor(bpm: number) {\r\n if (!audioContextInstance) {\r\n audioContextInstance = new AudioContext();\r\n }\r\n this.context = audioContextInstance;\r\n this._bpm = bpm;\r\n this.startTime = this.context.currentTime;\r\n }\r\n\r\n // --- Public API ---\r\n\r\n get audioContext(): AudioContextType {\r\n return this.context;\r\n }\r\n\r\n get bpm(): number {\r\n return this._bpm;\r\n }\r\n\r\n set bpm(value: number) {\r\n this._bpm = value;\r\n }\r\n\r\n start(): void {\r\n if (this.running) return;\r\n\r\n this.startTime = this.context.currentTime;\r\n this.running = true;\r\n\r\n for (const event of this.events.values()) {\r\n if (event.intervalBeats > 0) {\r\n event.nextBeatTime = 0;\r\n event.active = true;\r\n }\r\n }\r\n\r\n this.timerID = setInterval(() => this.schedule(), this.scheduleInterval);\r\n }\r\n\r\n stop(): void {\r\n if (this.timerID) {\r\n clearInterval(this.timerID);\r\n this.timerID = null;\r\n }\r\n this.running = false;\r\n console.debug(\"[scheduler] stopped\");\r\n }\r\n\r\n clear(): void {\r\n this.events.clear();\r\n }\r\n\r\n addLoop(\r\n id: string,\r\n intervalBeats: number,\r\n callback: ScheduleCallback,\r\n startBeat?: number,\r\n ): void {\r\n const existing = this.events.get(id);\r\n\r\n // HMR optimization: if loop exists (even if pending removal), update in-place\r\n // This preserves timing across hot reloads\r\n if (existing && existing.intervalBeats === intervalBeats) {\r\n existing.callback = callback;\r\n existing.active = true;\r\n existing.pendingRemoval = undefined; // Cancel pending removal\r\n // console.debug(`[scheduler] loop \"${id}\" updated (HMR)`);\r\n return;\r\n }\r\n\r\n const currentBeat = this.getCurrentBeat();\r\n let nextBeat: number;\r\n\r\n if (startBeat !== undefined) {\r\n nextBeat = startBeat;\r\n } else {\r\n nextBeat = Math.ceil(currentBeat / intervalBeats) * intervalBeats;\r\n if (nextBeat <= currentBeat) {\r\n nextBeat += intervalBeats;\r\n }\r\n }\r\n\r\n this.events.delete(id);\r\n this.events.set(id, {\r\n id,\r\n nextBeatTime: nextBeat,\r\n intervalBeats,\r\n callback,\r\n active: true,\r\n });\r\n\r\n console.debug(\r\n `[scheduler] loop \"${id}\" added, interval=${intervalBeats} beats, start=${\r\n nextBeat.toFixed(2)\r\n }`,\r\n );\r\n }\r\n\r\n remove(id: string): void {\r\n const event = this.events.get(id);\r\n if (event) {\r\n // Don't remove immediately - mark for removal with grace period\r\n // This allows React's HMR unmount/remount cycle to re-add the loop\r\n // and preserve its timing\r\n event.pendingRemoval = Date.now();\r\n }\r\n }\r\n\r\n beatsToSeconds(beats: number): number {\r\n return (beats * 60) / this._bpm;\r\n }\r\n\r\n // --- Private ---\r\n\r\n private secondsToBeats(seconds: number): number {\r\n return (seconds * this._bpm) / 60;\r\n }\r\n\r\n private getCurrentBeat(): number {\r\n const elapsed = this.context.currentTime - this.startTime;\r\n return this.secondsToBeats(elapsed);\r\n }\r\n\r\n private beatToAudioTime(beatTime: number): number {\r\n return this.startTime + this.beatsToSeconds(beatTime);\r\n }\r\n\r\n private schedule(): void {\r\n const currentAudioTime = this.context.currentTime;\r\n const currentBeat = this.getCurrentBeat();\r\n const scheduleUntilBeat = currentBeat + this.secondsToBeats(this.lookahead);\r\n const now = Date.now();\r\n\r\n for (const event of this.events.values()) {\r\n // Skip events pending removal\r\n if (event.pendingRemoval !== undefined) continue;\r\n if (!event.active) continue;\r\n\r\n while (event.nextBeatTime < scheduleUntilBeat) {\r\n const audioTime = this.beatToAudioTime(event.nextBeatTime);\r\n\r\n if (audioTime >= currentAudioTime) {\r\n event.callback(audioTime, event.nextBeatTime);\r\n }\r\n\r\n if (event.intervalBeats > 0) {\r\n event.nextBeatTime += event.intervalBeats;\r\n } else {\r\n event.active = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Clean up events\r\n for (const [id, event] of this.events) {\r\n if (!event.active && event.intervalBeats === 0) {\r\n this.events.delete(id);\r\n } else if (\r\n event.pendingRemoval !== undefined &&\r\n now - event.pendingRemoval > this.removalGracePeriod\r\n ) {\r\n this.events.delete(id);\r\n console.debug(`[scheduler] loop \"${id}\" removed`);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function getScheduler(bpm: number): Scheduler {\r\n if (!schedulerInstance) {\r\n schedulerInstance = new Scheduler(bpm);\r\n } else {\r\n schedulerInstance.bpm = bpm;\r\n }\r\n return schedulerInstance;\r\n}\r\n\r\nexport function resetScheduler(bpm: number): Scheduler {\r\n if (schedulerInstance) {\r\n schedulerInstance.stop();\r\n schedulerInstance.clear();\r\n }\r\n schedulerInstance = new Scheduler(bpm);\r\n return schedulerInstance;\r\n}\r\n","import {\r\n type Context,\r\n createContext,\r\n type ReactNode,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n} from \"react\";\r\nimport {\r\n getScheduler,\r\n type ScheduleCallback,\r\n type Scheduler,\r\n} from \"../audio/scheduler\";\r\nimport type { AudioContext as AudioContextType } from \"node-web-audio-api\";\r\n\r\nexport type ScheduleNoteContextValue = {\r\n /**\r\n * Schedule a note to be played.\r\n * @param id - Unique identifier for this note callback\r\n * @param callback - The audio callback to invoke at the scheduled time\r\n * @param stepIndex - Optional step index when inside a Sequence\r\n */\r\n scheduleNote: (\r\n id: string,\r\n callback: ScheduleCallback,\r\n stepIndex?: number,\r\n ) => void;\r\n\r\n /**\r\n * Unschedule a previously scheduled note.\r\n * @param id - The identifier used when scheduling\r\n */\r\n unscheduleNote: (id: string) => void;\r\n};\r\n\r\nexport const ScheduleNoteContext: Context<ScheduleNoteContextValue | null> =\r\n createContext<ScheduleNoteContextValue | null>(null);\r\n\r\ntype TrackContextValue = {\r\n audioContext: AudioContextType;\r\n scheduler: Scheduler;\r\n};\r\n\r\nconst TrackContext = createContext<TrackContextValue | null>(null);\r\n\r\ntype TrackProps = {\r\n bpm: number;\r\n children: ReactNode;\r\n};\r\n\r\n/**\r\n * Track component - wraps your song and provides timing context\r\n *\r\n * @example\r\n * <Track bpm={120}>\r\n * <Loop id=\"drums\" interval={1}>\r\n * <Note note=\"C4\" />\r\n * </Loop>\r\n * </Track>\r\n */\r\nexport function Track({ bpm, children }: TrackProps): ReactNode {\r\n const scheduler = useRef<Scheduler>(getScheduler(bpm));\r\n const audioContext = scheduler.current.audioContext;\r\n\r\n useEffect(() => {\r\n scheduler.current.start();\r\n }, [scheduler]);\r\n\r\n // Default scheduling: immediate playback (for standalone Notes)\r\n const scheduleContextValue: ScheduleNoteContextValue = useMemo(\r\n () => ({\r\n scheduleNote: (_id, callback) => {\r\n const now = audioContext.currentTime + 0.005;\r\n callback(now, 0);\r\n },\r\n unscheduleNote: () => {\r\n // Nothing to clean up for one-shot playback\r\n },\r\n }),\r\n [audioContext],\r\n );\r\n\r\n return (\r\n <TrackContext.Provider\r\n value={{\r\n audioContext,\r\n scheduler: scheduler.current,\r\n }}\r\n >\r\n <ScheduleNoteContext.Provider value={scheduleContextValue}>\r\n {children}\r\n </ScheduleNoteContext.Provider>\r\n </TrackContext.Provider>\r\n );\r\n}\r\n\r\nexport function useTrack(): TrackContextValue {\r\n const ctx = useContext(TrackContext);\r\n if (!ctx) {\r\n throw new Error(\"useTrack must be used inside a <Track> component\");\r\n }\r\n return ctx;\r\n}\r\n\r\nexport function useScheduleNote(): ScheduleNoteContextValue {\r\n const ctx = useContext(ScheduleNoteContext);\r\n if (!ctx) {\r\n throw new Error(\"useScheduleNote must be used inside a <Track> component\");\r\n }\r\n\r\n return ctx;\r\n}\r\n","import { type ReactNode, useEffect, useMemo, useRef } from \"react\";\r\nimport {\r\n ScheduleNoteContext,\r\n type ScheduleNoteContextValue,\r\n useTrack,\r\n} from \"./Track\";\r\nimport type { ScheduleCallback } from \"../audio/scheduler\";\r\n\r\ntype LoopProps = {\r\n /** Unique identifier for this loop */\r\n id: string;\r\n /** Interval in beats between each loop iteration */\r\n interval: number;\r\n /** Content to play on each loop */\r\n children: ReactNode;\r\n};\r\n\r\n/**\r\n * Loop component - plays its children repeatedly at the specified interval\r\n *\r\n * Children should use the useLoop() hook to register their audio callbacks,\r\n * which will be called with precise timing by the scheduler.\r\n *\r\n * @example\r\n * <Loop id=\"kick\" interval={1}>\r\n * <Note note=\"C2\" />\r\n * </Loop>\r\n */\r\nexport function Loop({\r\n id,\r\n interval,\r\n children,\r\n}: LoopProps): ReactNode {\r\n const { scheduler } = useTrack();\r\n const callbacksRef = useRef<Map<string, ScheduleCallback>>(new Map());\r\n\r\n useEffect(() => {\r\n const loopId = id;\r\n const callbacks = callbacksRef.current;\r\n\r\n const runAllCallbacks: ScheduleCallback = (audioTime, beatTime) => {\r\n for (const callback of callbacks.values()) {\r\n callback(audioTime, beatTime);\r\n }\r\n };\r\n\r\n scheduler.addLoop(loopId, interval, runAllCallbacks);\r\n\r\n return () => {\r\n scheduler.remove(loopId);\r\n };\r\n }, [id, interval, scheduler]);\r\n\r\n const scheduleContextValue: ScheduleNoteContextValue = useMemo(\r\n () => ({\r\n scheduleNote: (noteId, callback) => {\r\n callbacksRef.current.set(noteId, callback);\r\n },\r\n unscheduleNote: (noteId) => {\r\n callbacksRef.current.delete(noteId);\r\n },\r\n }),\r\n [],\r\n );\r\n\r\n return (\r\n <ScheduleNoteContext.Provider value={scheduleContextValue}>\r\n {children}\r\n </ScheduleNoteContext.Provider>\r\n );\r\n}\r\n","export type ADSRProps = {\r\n /** Attack time in beats - time from silence to attack_level (default: 0) */\r\n attack?: number;\r\n /** Peak amplitude at end of attack, multiplied by amp (default: 1) */\r\n attack_level?: number;\r\n /** Decay time in beats - time from attack_level to decay_level (default: 0) */\r\n decay?: number;\r\n /** Amplitude at end of decay, multiplied by amp (default: sustain_level) */\r\n decay_level?: number;\r\n /** Sustain time in beats - time at sustain_level (default: 0) */\r\n sustain?: number;\r\n /** Sustained amplitude level, multiplied by amp (default: 1) */\r\n sustain_level?: number;\r\n /** Release time in beats - time from sustain_level to silence (default: 1) */\r\n release?: number;\r\n};\r\n\r\nexport const ADSR_DEFAULTS = {\r\n attack: 0,\r\n attack_level: 1,\r\n decay: 0,\r\n sustain: 0,\r\n sustain_level: 1,\r\n release: 1,\r\n} as const;\r\n\r\nexport function applyADSREnvelope(\r\n gainNode: GainNode,\r\n audioTime: number,\r\n props: ADSRProps,\r\n amp: number,\r\n beatsToSeconds: (beats: number) => number,\r\n): number {\r\n // Extract props with defaults\r\n const attack = props.attack ?? ADSR_DEFAULTS.attack;\r\n const attack_level = props.attack_level ?? ADSR_DEFAULTS.attack_level;\r\n const decay = props.decay ?? ADSR_DEFAULTS.decay;\r\n const sustain = props.sustain ?? ADSR_DEFAULTS.sustain;\r\n const sustain_level = props.sustain_level ?? ADSR_DEFAULTS.sustain_level;\r\n const release = props.release ?? ADSR_DEFAULTS.release;\r\n const decay_level = props.decay_level ?? sustain_level;\r\n\r\n // Convert times from beats to seconds\r\n const attackSec = beatsToSeconds(attack);\r\n const decaySec = beatsToSeconds(decay);\r\n const sustainSec = beatsToSeconds(sustain);\r\n const releaseSec = beatsToSeconds(release);\r\n\r\n // Calculate amplitude values\r\n const attackAmp = attack_level * amp;\r\n const decayAmp = decay_level * amp;\r\n const sustainAmp = sustain_level * amp;\r\n\r\n // Calculate envelope time points\r\n const attackEnd = audioTime + attackSec;\r\n const decayEnd = attackEnd + decaySec;\r\n const sustainEnd = decayEnd + sustainSec;\r\n const releaseEnd = sustainEnd + releaseSec;\r\n\r\n // Start at silence\r\n gainNode.gain.setValueAtTime(0.001, audioTime);\r\n\r\n // Attack: ramp to attack_level\r\n if (attackSec > 0) {\r\n gainNode.gain.linearRampToValueAtTime(attackAmp, attackEnd);\r\n } else {\r\n gainNode.gain.setValueAtTime(attackAmp, audioTime);\r\n }\r\n\r\n // Decay: ramp to decay_level\r\n if (decaySec > 0) {\r\n gainNode.gain.linearRampToValueAtTime(decayAmp, decayEnd);\r\n } else {\r\n gainNode.gain.setValueAtTime(decayAmp, attackEnd);\r\n }\r\n\r\n // Sustain: ramp to sustain_level and hold\r\n if (sustainSec > 0) {\r\n gainNode.gain.linearRampToValueAtTime(sustainAmp, decayEnd + 0.001);\r\n gainNode.gain.setValueAtTime(sustainAmp, sustainEnd);\r\n } else {\r\n gainNode.gain.setValueAtTime(sustainAmp, decayEnd);\r\n }\r\n\r\n // Release: ramp to silence\r\n gainNode.gain.exponentialRampToValueAtTime(0.001, releaseEnd);\r\n\r\n return releaseEnd;\r\n}\r\n","// index.ts\nfunction isNamedPitch(src) {\n return src !== null && typeof src === \"object\" && \"name\" in src && typeof src.name === \"string\" ? true : false;\n}\nvar SIZES = [0, 2, 4, 5, 7, 9, 11];\nvar chroma = ({ step, alt }) => (SIZES[step] + alt + 120) % 12;\nvar height = ({ step, alt, oct, dir = 1 }) => dir * (SIZES[step] + alt + 12 * (oct === void 0 ? -100 : oct));\nvar midi = (pitch2) => {\n const h = height(pitch2);\n return pitch2.oct !== void 0 && h >= -12 && h <= 115 ? h + 12 : null;\n};\nfunction isPitch(pitch2) {\n return pitch2 !== null && typeof pitch2 === \"object\" && \"step\" in pitch2 && typeof pitch2.step === \"number\" && \"alt\" in pitch2 && typeof pitch2.alt === \"number\" && !isNaN(pitch2.step) && !isNaN(pitch2.alt) ? true : false;\n}\nvar FIFTHS = [0, 2, 4, -1, 1, 3, 5];\nvar STEPS_TO_OCTS = FIFTHS.map(\n (fifths) => Math.floor(fifths * 7 / 12)\n);\nfunction coordinates(pitch2) {\n const { step, alt, oct, dir = 1 } = pitch2;\n const f = FIFTHS[step] + 7 * alt;\n if (oct === void 0) {\n return [dir * f];\n }\n const o = oct - STEPS_TO_OCTS[step] - 4 * alt;\n return [dir * f, dir * o];\n}\nvar FIFTHS_TO_STEPS = [3, 0, 4, 1, 5, 2, 6];\nfunction pitch(coord) {\n const [f, o, dir] = coord;\n const step = FIFTHS_TO_STEPS[unaltered(f)];\n const alt = Math.floor((f + 1) / 7);\n if (o === void 0) {\n return { step, alt, dir };\n }\n const oct = o + 4 * alt + STEPS_TO_OCTS[step];\n return { step, alt, oct, dir };\n}\nfunction unaltered(f) {\n const i = (f + 1) % 7;\n return i < 0 ? 7 + i : i;\n}\nexport {\n chroma,\n coordinates,\n height,\n isNamedPitch,\n isPitch,\n midi,\n pitch\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport {\n coordinates,\n isNamedPitch,\n isPitch,\n pitch\n} from \"@tonaljs/pitch\";\nvar fillStr = (s, n) => Array(Math.abs(n) + 1).join(s);\nvar NoInterval = Object.freeze({\n empty: true,\n name: \"\",\n num: NaN,\n q: \"\",\n type: \"\",\n step: NaN,\n alt: NaN,\n dir: NaN,\n simple: NaN,\n semitones: NaN,\n chroma: NaN,\n coord: [],\n oct: NaN\n});\nvar INTERVAL_TONAL_REGEX = \"([-+]?\\\\d+)(d{1,4}|m|M|P|A{1,4})\";\nvar INTERVAL_SHORTHAND_REGEX = \"(AA|A|P|M|m|d|dd)([-+]?\\\\d+)\";\nvar REGEX = new RegExp(\n \"^\" + INTERVAL_TONAL_REGEX + \"|\" + INTERVAL_SHORTHAND_REGEX + \"$\"\n);\nfunction tokenizeInterval(str) {\n const m = REGEX.exec(`${str}`);\n if (m === null) {\n return [\"\", \"\"];\n }\n return m[1] ? [m[1], m[2]] : [m[4], m[3]];\n}\nvar cache = {};\nfunction interval(src) {\n return typeof src === \"string\" ? cache[src] || (cache[src] = parse(src)) : isPitch(src) ? interval(pitchName(src)) : isNamedPitch(src) ? interval(src.name) : NoInterval;\n}\nvar SIZES = [0, 2, 4, 5, 7, 9, 11];\nvar TYPES = \"PMMPPMM\";\nfunction parse(str) {\n const tokens = tokenizeInterval(str);\n if (tokens[0] === \"\") {\n return NoInterval;\n }\n const num = +tokens[0];\n const q = tokens[1];\n const step = (Math.abs(num) - 1) % 7;\n const t = TYPES[step];\n if (t === \"M\" && q === \"P\") {\n return NoInterval;\n }\n const type = t === \"M\" ? \"majorable\" : \"perfectable\";\n const name = \"\" + num + q;\n const dir = num < 0 ? -1 : 1;\n const simple = num === 8 || num === -8 ? num : dir * (step + 1);\n const alt = qToAlt(type, q);\n const oct = Math.floor((Math.abs(num) - 1) / 7);\n const semitones = dir * (SIZES[step] + alt + 12 * oct);\n const chroma = (dir * (SIZES[step] + alt) % 12 + 12) % 12;\n const coord = coordinates({ step, alt, oct, dir });\n return {\n empty: false,\n name,\n num,\n q,\n step,\n alt,\n dir,\n type,\n simple,\n semitones,\n chroma,\n coord,\n oct\n };\n}\nfunction coordToInterval(coord, forceDescending) {\n const [f, o = 0] = coord;\n const isDescending = f * 7 + o * 12 < 0;\n const ivl = forceDescending || isDescending ? [-f, -o, -1] : [f, o, 1];\n return interval(pitch(ivl));\n}\nfunction qToAlt(type, q) {\n return q === \"M\" && type === \"majorable\" || q === \"P\" && type === \"perfectable\" ? 0 : q === \"m\" && type === \"majorable\" ? -1 : /^A+$/.test(q) ? q.length : /^d+$/.test(q) ? -1 * (type === \"perfectable\" ? q.length : q.length + 1) : 0;\n}\nfunction pitchName(props) {\n const { step, alt, oct = 0, dir } = props;\n if (!dir) {\n return \"\";\n }\n const calcNum = step + 1 + 7 * oct;\n const num = calcNum === 0 ? step + 1 : calcNum;\n const d = dir < 0 ? \"-\" : \"\";\n const type = TYPES[step] === \"M\" ? \"majorable\" : \"perfectable\";\n const name = d + num + altToQ(type, alt);\n return name;\n}\nfunction altToQ(type, alt) {\n if (alt === 0) {\n return type === \"majorable\" ? \"M\" : \"P\";\n } else if (alt === -1 && type === \"majorable\") {\n return \"m\";\n } else if (alt > 0) {\n return fillStr(\"A\", alt);\n } else {\n return fillStr(\"d\", type === \"perfectable\" ? alt : alt + 1);\n }\n}\nexport {\n coordToInterval,\n interval,\n tokenizeInterval\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport {\n coordinates,\n isNamedPitch,\n isPitch,\n pitch\n} from \"@tonaljs/pitch\";\nvar fillStr = (s, n) => Array(Math.abs(n) + 1).join(s);\nvar NoNote = Object.freeze({\n empty: true,\n name: \"\",\n letter: \"\",\n acc: \"\",\n pc: \"\",\n step: NaN,\n alt: NaN,\n chroma: NaN,\n height: NaN,\n coord: [],\n midi: null,\n freq: null\n});\nvar cache = /* @__PURE__ */ new Map();\nvar stepToLetter = (step) => \"CDEFGAB\".charAt(step);\nvar altToAcc = (alt) => alt < 0 ? fillStr(\"b\", -alt) : fillStr(\"#\", alt);\nvar accToAlt = (acc) => acc[0] === \"b\" ? -acc.length : acc.length;\nfunction note(src) {\n const stringSrc = JSON.stringify(src);\n const cached = cache.get(stringSrc);\n if (cached) {\n return cached;\n }\n const value = typeof src === \"string\" ? parse(src) : isPitch(src) ? note(pitchName(src)) : isNamedPitch(src) ? note(src.name) : NoNote;\n cache.set(stringSrc, value);\n return value;\n}\nvar REGEX = /^([a-gA-G]?)(#{1,}|b{1,}|x{1,}|)(-?\\d*)\\s*(.*)$/;\nfunction tokenizeNote(str) {\n const m = REGEX.exec(str);\n return m ? [m[1].toUpperCase(), m[2].replace(/x/g, \"##\"), m[3], m[4]] : [\"\", \"\", \"\", \"\"];\n}\nfunction coordToNote(noteCoord) {\n return note(pitch(noteCoord));\n}\nvar mod = (n, m) => (n % m + m) % m;\nvar SEMI = [0, 2, 4, 5, 7, 9, 11];\nfunction parse(noteName) {\n const tokens = tokenizeNote(noteName);\n if (tokens[0] === \"\" || tokens[3] !== \"\") {\n return NoNote;\n }\n const letter = tokens[0];\n const acc = tokens[1];\n const octStr = tokens[2];\n const step = (letter.charCodeAt(0) + 3) % 7;\n const alt = accToAlt(acc);\n const oct = octStr.length ? +octStr : void 0;\n const coord = coordinates({ step, alt, oct });\n const name = letter + acc + octStr;\n const pc = letter + acc;\n const chroma = (SEMI[step] + alt + 120) % 12;\n const height = oct === void 0 ? mod(SEMI[step] + alt, 12) - 12 * 99 : SEMI[step] + alt + 12 * (oct + 1);\n const midi = height >= 0 && height <= 127 ? height : null;\n const freq = oct === void 0 ? null : Math.pow(2, (height - 69) / 12) * 440;\n return {\n empty: false,\n acc,\n alt,\n chroma,\n coord,\n freq,\n height,\n letter,\n midi,\n name,\n oct,\n pc,\n step\n };\n}\nfunction pitchName(props) {\n const { step, alt, oct } = props;\n const letter = stepToLetter(step);\n if (!letter) {\n return \"\";\n }\n const pc = letter + altToAcc(alt);\n return oct || oct === 0 ? pc + oct : pc;\n}\nexport {\n accToAlt,\n altToAcc,\n coordToNote,\n note,\n stepToLetter,\n tokenizeNote\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport {\n interval as asInterval,\n coordToInterval\n} from \"@tonaljs/pitch-interval\";\nimport {\n note as asNote,\n coordToNote\n} from \"@tonaljs/pitch-note\";\nfunction transpose(noteName, intervalName) {\n const note = asNote(noteName);\n const intervalCoord = Array.isArray(intervalName) ? intervalName : asInterval(intervalName).coord;\n if (note.empty || !intervalCoord || intervalCoord.length < 2) {\n return \"\";\n }\n const noteCoord = note.coord;\n const tr = noteCoord.length === 1 ? [noteCoord[0] + intervalCoord[0]] : [noteCoord[0] + intervalCoord[0], noteCoord[1] + intervalCoord[1]];\n return coordToNote(tr).name;\n}\nfunction tonicIntervalsTransposer(intervals, tonic) {\n const len = intervals.length;\n return (normalized) => {\n if (!tonic) return \"\";\n const index = normalized < 0 ? (len - -normalized % len) % len : normalized % len;\n const octaves = Math.floor(normalized / len);\n const root = transpose(tonic, [0, octaves]);\n return transpose(root, intervals[index]);\n };\n}\nfunction distance(fromNote, toNote) {\n const from = asNote(fromNote);\n const to = asNote(toNote);\n if (from.empty || to.empty) {\n return \"\";\n }\n const fcoord = from.coord;\n const tcoord = to.coord;\n const fifths = tcoord[0] - fcoord[0];\n const octs = fcoord.length === 2 && tcoord.length === 2 ? tcoord[1] - fcoord[1] : -Math.floor(fifths * 7 / 12);\n const forceDescending = to.height === from.height && to.midi !== null && from.oct === to.oct && from.step > to.step;\n return coordToInterval([fifths, octs], forceDescending).name;\n}\nexport {\n distance,\n tonicIntervalsTransposer,\n transpose\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nfunction ascR(b, n) {\n const a = [];\n for (; n--; a[n] = n + b) ;\n return a;\n}\nfunction descR(b, n) {\n const a = [];\n for (; n--; a[n] = b - n) ;\n return a;\n}\nfunction range(from, to) {\n return from < to ? ascR(from, to - from + 1) : descR(from, from - to + 1);\n}\nfunction rotate(times, arr) {\n const len = arr.length;\n const n = (times % len + len) % len;\n return arr.slice(n, len).concat(arr.slice(0, n));\n}\nfunction compact(arr) {\n return arr.filter((n) => n === 0 || n);\n}\nfunction shuffle(arr, rnd = Math.random) {\n let i;\n let t;\n let m = arr.length;\n while (m) {\n i = Math.floor(rnd() * m--);\n t = arr[m];\n arr[m] = arr[i];\n arr[i] = t;\n }\n return arr;\n}\nfunction permutations(arr) {\n if (arr.length === 0) {\n return [[]];\n }\n return permutations(arr.slice(1)).reduce((acc, perm) => {\n return acc.concat(\n arr.map((e, pos) => {\n const newPerm = perm.slice();\n newPerm.splice(pos, 0, arr[0]);\n return newPerm;\n })\n );\n }, []);\n}\nvar collection_default = {\n compact,\n permutations,\n range,\n rotate,\n shuffle\n};\nexport {\n compact,\n collection_default as default,\n permutations,\n range,\n rotate,\n shuffle\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport { compact, range, rotate } from \"@tonaljs/collection\";\nimport { transpose } from \"@tonaljs/pitch-distance\";\nimport { interval } from \"@tonaljs/pitch-interval\";\nimport { note } from \"@tonaljs/pitch-note\";\nvar EmptyPcset = {\n empty: true,\n name: \"\",\n setNum: 0,\n chroma: \"000000000000\",\n normalized: \"000000000000\",\n intervals: []\n};\nvar setNumToChroma = (num2) => Number(num2).toString(2).padStart(12, \"0\");\nvar chromaToNumber = (chroma2) => parseInt(chroma2, 2);\nvar REGEX = /^[01]{12}$/;\nfunction isChroma(set) {\n return REGEX.test(set);\n}\nvar isPcsetNum = (set) => typeof set === \"number\" && set >= 0 && set <= 4095;\nvar isPcset = (set) => set && isChroma(set.chroma);\nvar cache = { [EmptyPcset.chroma]: EmptyPcset };\nfunction get(src) {\n const chroma2 = isChroma(src) ? src : isPcsetNum(src) ? setNumToChroma(src) : Array.isArray(src) ? listToChroma(src) : isPcset(src) ? src.chroma : EmptyPcset.chroma;\n return cache[chroma2] = cache[chroma2] || chromaToPcset(chroma2);\n}\nvar pcset = get;\nvar chroma = (set) => get(set).chroma;\nvar intervals = (set) => get(set).intervals;\nvar num = (set) => get(set).setNum;\nvar IVLS = [\n \"1P\",\n \"2m\",\n \"2M\",\n \"3m\",\n \"3M\",\n \"4P\",\n \"5d\",\n \"5P\",\n \"6m\",\n \"6M\",\n \"7m\",\n \"7M\"\n];\nfunction chromaToIntervals(chroma2) {\n const intervals2 = [];\n for (let i = 0; i < 12; i++) {\n if (chroma2.charAt(i) === \"1\") intervals2.push(IVLS[i]);\n }\n return intervals2;\n}\nfunction notes(set) {\n return get(set).intervals.map((ivl) => transpose(\"C\", ivl));\n}\nfunction chromas() {\n return range(2048, 4095).map(setNumToChroma);\n}\nfunction modes(set, normalize = true) {\n const pcs = get(set);\n const binary = pcs.chroma.split(\"\");\n return compact(\n binary.map((_, i) => {\n const r = rotate(i, binary);\n return normalize && r[0] === \"0\" ? null : r.join(\"\");\n })\n );\n}\nfunction isEqual(s1, s2) {\n return get(s1).setNum === get(s2).setNum;\n}\nfunction isSubsetOf(set) {\n const s = get(set).setNum;\n return (notes2) => {\n const o = get(notes2).setNum;\n return s && s !== o && (o & s) === o;\n };\n}\nfunction isSupersetOf(set) {\n const s = get(set).setNum;\n return (notes2) => {\n const o = get(notes2).setNum;\n return s && s !== o && (o | s) === o;\n };\n}\nfunction isNoteIncludedIn(set) {\n const s = get(set);\n return (noteName) => {\n const n = note(noteName);\n return s && !n.empty && s.chroma.charAt(n.chroma) === \"1\";\n };\n}\nvar includes = isNoteIncludedIn;\nfunction filter(set) {\n const isIncluded = isNoteIncludedIn(set);\n return (notes2) => {\n return notes2.filter(isIncluded);\n };\n}\nvar pcset_default = {\n get,\n chroma,\n num,\n intervals,\n chromas,\n isSupersetOf,\n isSubsetOf,\n isNoteIncludedIn,\n isEqual,\n filter,\n modes,\n notes,\n // deprecated\n pcset\n};\nfunction chromaRotations(chroma2) {\n const binary = chroma2.split(\"\");\n return binary.map((_, i) => rotate(i, binary).join(\"\"));\n}\nfunction chromaToPcset(chroma2) {\n const setNum = chromaToNumber(chroma2);\n const normalizedNum = chromaRotations(chroma2).map(chromaToNumber).filter((n) => n >= 2048).sort()[0];\n const normalized = setNumToChroma(normalizedNum);\n const intervals2 = chromaToIntervals(chroma2);\n return {\n empty: false,\n name: \"\",\n setNum,\n chroma: chroma2,\n normalized,\n intervals: intervals2\n };\n}\nfunction listToChroma(set) {\n if (set.length === 0) {\n return EmptyPcset.chroma;\n }\n let pitch;\n const binary = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n for (let i = 0; i < set.length; i++) {\n pitch = note(set[i]);\n if (pitch.empty) pitch = interval(set[i]);\n if (!pitch.empty) binary[pitch.chroma] = 1;\n }\n return binary.join(\"\");\n}\nexport {\n EmptyPcset,\n chroma,\n chromas,\n pcset_default as default,\n filter,\n get,\n includes,\n intervals,\n isChroma,\n isEqual,\n isNoteIncludedIn,\n isSubsetOf,\n isSupersetOf,\n modes,\n notes,\n num,\n pcset\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport {\n EmptyPcset,\n get as pcset\n} from \"@tonaljs/pcset\";\n\n// data.ts\nvar CHORDS = [\n // ==Major==\n [\"1P 3M 5P\", \"major\", \"M ^ maj\"],\n [\"1P 3M 5P 7M\", \"major seventh\", \"maj7 \\u0394 ma7 M7 Maj7 ^7\"],\n [\"1P 3M 5P 7M 9M\", \"major ninth\", \"maj9 \\u03949 ^9\"],\n [\"1P 3M 5P 7M 9M 13M\", \"major thirteenth\", \"maj13 Maj13 ^13\"],\n [\"1P 3M 5P 6M\", \"sixth\", \"6 add6 add13 M6\"],\n [\"1P 3M 5P 6M 9M\", \"sixth added ninth\", \"6add9 6/9 69 M69\"],\n [\"1P 3M 6m 7M\", \"major seventh flat sixth\", \"M7b6 ^7b6\"],\n [\n \"1P 3M 5P 7M 11A\",\n \"major seventh sharp eleventh\",\n \"maj#4 \\u0394#4 \\u0394#11 M7#11 ^7#11 maj7#11\"\n ],\n // ==Minor==\n // '''Normal'''\n [\"1P 3m 5P\", \"minor\", \"m min -\"],\n [\"1P 3m 5P 7m\", \"minor seventh\", \"m7 min7 mi7 -7\"],\n [\n \"1P 3m 5P 7M\",\n \"minor/major seventh\",\n \"m/ma7 m/maj7 mM7 mMaj7 m/M7 -\\u03947 m\\u0394 -^7 -maj7\"\n ],\n [\"1P 3m 5P 6M\", \"minor sixth\", \"m6 -6\"],\n [\"1P 3m 5P 7m 9M\", \"minor ninth\", \"m9 -9\"],\n [\"1P 3m 5P 7M 9M\", \"minor/major ninth\", \"mM9 mMaj9 -^9\"],\n [\"1P 3m 5P 7m 9M 11P\", \"minor eleventh\", \"m11 -11\"],\n [\"1P 3m 5P 7m 9M 13M\", \"minor thirteenth\", \"m13 -13\"],\n // '''Diminished'''\n [\"1P 3m 5d\", \"diminished\", \"dim \\xB0 o\"],\n [\"1P 3m 5d 7d\", \"diminished seventh\", \"dim7 \\xB07 o7\"],\n [\"1P 3m 5d 7m\", \"half-diminished\", \"m7b5 \\xF8 -7b5 h7 h\"],\n // ==Dominant/Seventh==\n // '''Normal'''\n [\"1P 3M 5P 7m\", \"dominant seventh\", \"7 dom\"],\n [\"1P 3M 5P 7m 9M\", \"dominant ninth\", \"9\"],\n [\"1P 3M 5P 7m 9M 13M\", \"dominant thirteenth\", \"13\"],\n [\"1P 3M 5P 7m 11A\", \"lydian dominant seventh\", \"7#11 7#4\"],\n // '''Altered'''\n [\"1P 3M 5P 7m 9m\", \"dominant flat ninth\", \"7b9\"],\n [\"1P 3M 5P 7m 9A\", \"dominant sharp ninth\", \"7#9\"],\n [\"1P 3M 7m 9m\", \"altered\", \"alt7\"],\n // '''Suspended'''\n [\"1P 4P 5P\", \"suspended fourth\", \"sus4 sus\"],\n [\"1P 2M 5P\", \"suspended second\", \"sus2\"],\n [\"1P 4P 5P 7m\", \"suspended fourth seventh\", \"7sus4 7sus\"],\n [\"1P 5P 7m 9M 11P\", \"eleventh\", \"11\"],\n [\n \"1P 4P 5P 7m 9m\",\n \"suspended fourth flat ninth\",\n \"b9sus phryg 7b9sus 7b9sus4\"\n ],\n // ==Other==\n [\"1P 5P\", \"fifth\", \"5\"],\n [\"1P 3M 5A\", \"augmented\", \"aug + +5 ^#5\"],\n [\"1P 3m 5A\", \"minor augmented\", \"m#5 -#5 m+\"],\n [\"1P 3M 5A 7M\", \"augmented seventh\", \"maj7#5 maj7+5 +maj7 ^7#5\"],\n [\n \"1P 3M 5P 7M 9M 11A\",\n \"major sharp eleventh (lydian)\",\n \"maj9#11 \\u03949#11 ^9#11\"\n ],\n // ==Legacy==\n [\"1P 2M 4P 5P\", \"\", \"sus24 sus4add9\"],\n [\"1P 3M 5A 7M 9M\", \"\", \"maj9#5 Maj9#5\"],\n [\"1P 3M 5A 7m\", \"\", \"7#5 +7 7+ 7aug aug7\"],\n [\"1P 3M 5A 7m 9A\", \"\", \"7#5#9 7#9#5 7alt\"],\n [\"1P 3M 5A 7m 9M\", \"\", \"9#5 9+\"],\n [\"1P 3M 5A 7m 9M 11A\", \"\", \"9#5#11\"],\n [\"1P 3M 5A 7m 9m\", \"\", \"7#5b9 7b9#5\"],\n [\"1P 3M 5A 7m 9m 11A\", \"\", \"7#5b9#11\"],\n [\"1P 3M 5A 9A\", \"\", \"+add#9\"],\n [\"1P 3M 5A 9M\", \"\", \"M#5add9 +add9\"],\n [\"1P 3M 5P 6M 11A\", \"\", \"M6#11 M6b5 6#11 6b5\"],\n [\"1P 3M 5P 6M 7M 9M\", \"\", \"M7add13\"],\n [\"1P 3M 5P 6M 9M 11A\", \"\", \"69#11\"],\n [\"1P 3m 5P 6M 9M\", \"\", \"m69 -69\"],\n [\"1P 3M 5P 6m 7m\", \"\", \"7b6\"],\n [\"1P 3M 5P 7M 9A 11A\", \"\", \"maj7#9#11\"],\n [\"1P 3M 5P 7M 9M 11A 13M\", \"\", \"M13#11 maj13#11 M13+4 M13#4\"],\n [\"1P 3M 5P 7M 9m\", \"\", \"M7b9\"],\n [\"1P 3M 5P 7m 11A 13m\", \"\", \"7#11b13 7b5b13\"],\n [\"1P 3M 5P 7m 13M\", \"\", \"7add6 67 7add13\"],\n [\"1P 3M 5P 7m 9A 11A\", \"\", \"7#9#11 7b5#9 7#9b5\"],\n [\"1P 3M 5P 7m 9A 11A 13M\", \"\", \"13#9#11\"],\n [\"1P 3M 5P 7m 9A 11A 13m\", \"\", \"7#9#11b13\"],\n [\"1P 3M 5P 7m 9A 13M\", \"\", \"13#9\"],\n [\"1P 3M 5P 7m 9A 13m\", \"\", \"7#9b13\"],\n [\"1P 3M 5P 7m 9M 11A\", \"\", \"9#11 9+4 9#4\"],\n [\"1P 3M 5P 7m 9M 11A 13M\", \"\", \"13#11 13+4 13#4\"],\n [\"1P 3M 5P 7m 9M 11A 13m\", \"\", \"9#11b13 9b5b13\"],\n [\"1P 3M 5P 7m 9m 11A\", \"\", \"7b9#11 7b5b9 7b9b5\"],\n [\"1P 3M 5P 7m 9m 11A 13M\", \"\", \"13b9#11\"],\n [\"1P 3M 5P 7m 9m 11A 13m\", \"\", \"7b9b13#11 7b9#11b13 7b5b9b13\"],\n [\"1P 3M 5P 7m 9m 13M\", \"\", \"13b9\"],\n [\"1P 3M 5P 7m 9m 13m\", \"\", \"7b9b13\"],\n [\"1P 3M 5P 7m 9m 9A\", \"\", \"7b9#9\"],\n [\"1P 3M 5P 9M\", \"\", \"Madd9 2 add9 add2\"],\n [\"1P 3M 5P 9m\", \"\", \"Maddb9\"],\n [\"1P 3M 5d\", \"\", \"Mb5\"],\n [\"1P 3M 5d 6M 7m 9M\", \"\", \"13b5\"],\n [\"1P 3M 5d 7M\", \"\", \"M7b5\"],\n [\"1P 3M 5d 7M 9M\", \"\", \"M9b5\"],\n [\"1P 3M 5d 7m\", \"\", \"7b5\"],\n [\"1P 3M 5d 7m 9M\", \"\", \"9b5\"],\n [\"1P 3M 7m\", \"\", \"7no5\"],\n [\"1P 3M 7m 13m\", \"\", \"7b13\"],\n [\"1P 3M 7m 9M\", \"\", \"9no5\"],\n [\"1P 3M 7m 9M 13M\", \"\", \"13no5\"],\n [\"1P 3M 7m 9M 13m\", \"\", \"9b13\"],\n [\"1P 3m 4P 5P\", \"\", \"madd4\"],\n [\"1P 3m 5P 6m 7M\", \"\", \"mMaj7b6\"],\n [\"1P 3m 5P 6m 7M 9M\", \"\", \"mMaj9b6\"],\n [\"1P 3m 5P 7m 11P\", \"\", \"m7add11 m7add4\"],\n [\"1P 3m 5P 9M\", \"\", \"madd9\"],\n [\"1P 3m 5d 6M 7M\", \"\", \"o7M7\"],\n [\"1P 3m 5d 7M\", \"\", \"oM7\"],\n [\"1P 3m 6m 7M\", \"\", \"mb6M7\"],\n [\"1P 3m 6m 7m\", \"\", \"m7#5\"],\n [\"1P 3m 6m 7m 9M\", \"\", \"m9#5\"],\n [\"1P 3m 5A 7m 9M 11P\", \"\", \"m11A\"],\n [\"1P 3m 6m 9m\", \"\", \"mb6b9\"],\n [\"1P 2M 3m 5d 7m\", \"\", \"m9b5\"],\n [\"1P 4P 5A 7M\", \"\", \"M7#5sus4\"],\n [\"1P 4P 5A 7M 9M\", \"\", \"M9#5sus4\"],\n [\"1P 4P 5A 7m\", \"\", \"7#5sus4\"],\n [\"1P 4P 5P 7M\", \"\", \"M7sus4\"],\n [\"1P 4P 5P 7M 9M\", \"\", \"M9sus4\"],\n [\"1P 4P 5P 7m 9M\", \"\", \"9sus4 9sus\"],\n [\"1P 4P 5P 7m 9M 13M\", \"\", \"13sus4 13sus\"],\n [\"1P 4P 5P 7m 9m 13m\", \"\", \"7sus4b9b13 7b9b13sus4\"],\n [\"1P 4P 7m 10m\", \"\", \"4 quartal\"],\n [\"1P 5P 7m 9m 11P\", \"\", \"11b9\"]\n];\nvar data_default = CHORDS;\n\n// index.ts\nvar NoChordType = {\n ...EmptyPcset,\n name: \"\",\n quality: \"Unknown\",\n intervals: [],\n aliases: []\n};\nvar dictionary = [];\nvar index = {};\nfunction get(type) {\n return index[type] || NoChordType;\n}\nvar chordType = get;\nfunction names() {\n return dictionary.map((chord) => chord.name).filter((x) => x);\n}\nfunction symbols() {\n return dictionary.map((chord) => chord.aliases[0]).filter((x) => x);\n}\nfunction keys() {\n return Object.keys(index);\n}\nfunction all() {\n return dictionary.slice();\n}\nvar entries = all;\nfunction removeAll() {\n dictionary = [];\n index = {};\n}\nfunction add(intervals, aliases, fullName) {\n const quality = getQuality(intervals);\n const chord = {\n ...pcset(intervals),\n name: fullName || \"\",\n quality,\n intervals,\n aliases\n };\n dictionary.push(chord);\n if (chord.name) {\n index[chord.name] = chord;\n }\n index[chord.setNum] = chord;\n index[chord.chroma] = chord;\n chord.aliases.forEach((alias) => addAlias(chord, alias));\n}\nfunction addAlias(chord, alias) {\n index[alias] = chord;\n}\nfunction getQuality(intervals) {\n const has = (interval) => intervals.indexOf(interval) !== -1;\n return has(\"5A\") ? \"Augmented\" : has(\"3M\") ? \"Major\" : has(\"5d\") ? \"Diminished\" : has(\"3m\") ? \"Minor\" : \"Unknown\";\n}\ndata_default.forEach(\n ([ivls, fullName, names2]) => add(ivls.split(\" \"), names2.split(\" \"), fullName)\n);\ndictionary.sort((a, b) => a.setNum - b.setNum);\nvar chord_type_default = {\n names,\n symbols,\n get,\n all,\n add,\n removeAll,\n keys,\n // deprecated\n entries,\n chordType\n};\nexport {\n add,\n addAlias,\n all,\n chordType,\n chord_type_default as default,\n entries,\n get,\n keys,\n names,\n removeAll,\n symbols\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport { distance as dist } from \"@tonaljs/pitch-distance\";\nimport {\n coordToInterval,\n interval as props\n} from \"@tonaljs/pitch-interval\";\nfunction names() {\n return \"1P 2M 3M 4P 5P 6m 7m\".split(\" \");\n}\nvar get = props;\nvar name = (name2) => props(name2).name;\nvar semitones = (name2) => props(name2).semitones;\nvar quality = (name2) => props(name2).q;\nvar num = (name2) => props(name2).num;\nfunction simplify(name2) {\n const i = props(name2);\n return i.empty ? \"\" : i.simple + i.q;\n}\nfunction invert(name2) {\n const i = props(name2);\n if (i.empty) {\n return \"\";\n }\n const step = (7 - i.step) % 7;\n const alt = i.type === \"perfectable\" ? -i.alt : -(i.alt + 1);\n return props({ step, alt, oct: i.oct, dir: i.dir }).name;\n}\nvar IN = [1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7];\nvar IQ = \"P m M m M P d P m M m M\".split(\" \");\nfunction fromSemitones(semitones2) {\n const d = semitones2 < 0 ? -1 : 1;\n const n = Math.abs(semitones2);\n const c = n % 12;\n const o = Math.floor(n / 12);\n return d * (IN[c] + 7 * o) + IQ[c];\n}\nvar distance = dist;\nvar add = combinator((a, b) => [a[0] + b[0], a[1] + b[1]]);\nvar addTo = (interval) => (other) => add(interval, other);\nvar subtract = combinator((a, b) => [a[0] - b[0], a[1] - b[1]]);\nfunction transposeFifths(interval, fifths) {\n const ivl = get(interval);\n if (ivl.empty) return \"\";\n const [nFifths, nOcts, dir] = ivl.coord;\n return coordToInterval([nFifths + fifths, nOcts, dir]).name;\n}\nvar interval_default = {\n names,\n get,\n name,\n num,\n semitones,\n quality,\n fromSemitones,\n distance,\n invert,\n simplify,\n add,\n addTo,\n subtract,\n transposeFifths\n};\nfunction combinator(fn) {\n return (a, b) => {\n const coordA = props(a).coord;\n const coordB = props(b).coord;\n if (coordA && coordB) {\n const coord = fn(coordA, coordB);\n return coordToInterval(coord).name;\n }\n };\n}\nexport {\n add,\n addTo,\n interval_default as default,\n distance,\n fromSemitones,\n get,\n invert,\n name,\n names,\n num,\n quality,\n semitones,\n simplify,\n subtract,\n transposeFifths\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport {\n EmptyPcset,\n get as pcset\n} from \"@tonaljs/pcset\";\n\n// data.ts\nvar SCALES = [\n // Basic scales\n [\"1P 2M 3M 5P 6M\", \"major pentatonic\", \"pentatonic\"],\n [\"1P 2M 3M 4P 5P 6M 7M\", \"major\", \"ionian\"],\n [\"1P 2M 3m 4P 5P 6m 7m\", \"minor\", \"aeolian\"],\n // Jazz common scales\n [\"1P 2M 3m 3M 5P 6M\", \"major blues\"],\n [\"1P 3m 4P 5d 5P 7m\", \"minor blues\", \"blues\"],\n [\"1P 2M 3m 4P 5P 6M 7M\", \"melodic minor\"],\n [\"1P 2M 3m 4P 5P 6m 7M\", \"harmonic minor\"],\n [\"1P 2M 3M 4P 5P 6M 7m 7M\", \"bebop\"],\n [\"1P 2M 3m 4P 5d 6m 6M 7M\", \"diminished\", \"whole-half diminished\"],\n // Modes\n [\"1P 2M 3m 4P 5P 6M 7m\", \"dorian\"],\n [\"1P 2M 3M 4A 5P 6M 7M\", \"lydian\"],\n [\"1P 2M 3M 4P 5P 6M 7m\", \"mixolydian\", \"dominant\"],\n [\"1P 2m 3m 4P 5P 6m 7m\", \"phrygian\"],\n [\"1P 2m 3m 4P 5d 6m 7m\", \"locrian\"],\n // 5-note scales\n [\"1P 3M 4P 5P 7M\", \"ionian pentatonic\"],\n [\"1P 3M 4P 5P 7m\", \"mixolydian pentatonic\", \"indian\"],\n [\"1P 2M 4P 5P 6M\", \"ritusen\"],\n [\"1P 2M 4P 5P 7m\", \"egyptian\"],\n [\"1P 3M 4P 5d 7m\", \"neopolitan major pentatonic\"],\n [\"1P 3m 4P 5P 6m\", \"vietnamese 1\"],\n [\"1P 2m 3m 5P 6m\", \"pelog\"],\n [\"1P 2m 4P 5P 6m\", \"kumoijoshi\"],\n [\"1P 2M 3m 5P 6m\", \"hirajoshi\"],\n [\"1P 2m 4P 5d 7m\", \"iwato\"],\n [\"1P 2m 4P 5P 7m\", \"in-sen\"],\n [\"1P 3M 4A 5P 7M\", \"lydian pentatonic\", \"chinese\"],\n [\"1P 3m 4P 6m 7m\", \"malkos raga\"],\n [\"1P 3m 4P 5d 7m\", \"locrian pentatonic\", \"minor seven flat five pentatonic\"],\n [\"1P 3m 4P 5P 7m\", \"minor pentatonic\", \"vietnamese 2\"],\n [\"1P 3m 4P 5P 6M\", \"minor six pentatonic\"],\n [\"1P 2M 3m 5P 6M\", \"flat three pentatonic\", \"kumoi\"],\n [\"1P 2M 3M 5P 6m\", \"flat six pentatonic\"],\n [\"1P 2m 3M 5P 6M\", \"scriabin\"],\n [\"1P 3M 5d 6m 7m\", \"whole tone pentatonic\"],\n [\"1P 3M 4A 5A 7M\", \"lydian #5P pentatonic\"],\n [\"1P 3M 4A 5P 7m\", \"lydian dominant pentatonic\"],\n [\"1P 3m 4P 5P 7M\", \"minor #7M pentatonic\"],\n [\"1P 3m 4d 5d 7m\", \"super locrian pentatonic\"],\n // 6-note scales\n [\"1P 2M 3m 4P 5P 7M\", \"minor hexatonic\"],\n [\"1P 2A 3M 5P 5A 7M\", \"augmented\"],\n [\"1P 2M 4P 5P 6M 7m\", \"piongio\"],\n [\"1P 2m 3M 4A 6M 7m\", \"prometheus neopolitan\"],\n [\"1P 2M 3M 4A 6M 7m\", \"prometheus\"],\n [\"1P 2m 3M 5d 6m 7m\", \"mystery #1\"],\n [\"1P 2m 3M 4P 5A 6M\", \"six tone symmetric\"],\n [\"1P 2M 3M 4A 5A 6A\", \"whole tone\", \"messiaen's mode #1\"],\n [\"1P 2m 4P 4A 5P 7M\", \"messiaen's mode #5\"],\n // 7-note scales\n [\"1P 2M 3M 4P 5d 6m 7m\", \"locrian major\", \"arabian\"],\n [\"1P 2m 3M 4A 5P 6m 7M\", \"double harmonic lydian\"],\n [\n \"1P 2m 2A 3M 4A 6m 7m\",\n \"altered\",\n \"super locrian\",\n \"diminished whole tone\",\n \"pomeroy\"\n ],\n [\"1P 2M 3m 4P 5d 6m 7m\", \"locrian #2\", \"half-diminished\", \"aeolian b5\"],\n [\n \"1P 2M 3M 4P 5P 6m 7m\",\n \"mixolydian b6\",\n \"melodic minor fifth mode\",\n \"hindu\"\n ],\n [\"1P 2M 3M 4A 5P 6M 7m\", \"lydian dominant\", \"lydian b7\", \"overtone\"],\n [\"1P 2M 3M 4A 5A 6M 7M\", \"lydian augmented\"],\n [\n \"1P 2m 3m 4P 5P 6M 7m\",\n \"dorian b2\",\n \"phrygian #6\",\n \"melodic minor second mode\"\n ],\n [\n \"1P 2m 3m 4d 5d 6m 7d\",\n \"ultralocrian\",\n \"superlocrian bb7\",\n \"superlocrian diminished\"\n ],\n [\"1P 2m 3m 4P 5d 6M 7m\", \"locrian 6\", \"locrian natural 6\", \"locrian sharp 6\"],\n [\"1P 2A 3M 4P 5P 5A 7M\", \"augmented heptatonic\"],\n // Source https://en.wikipedia.org/wiki/Ukrainian_Dorian_scale\n [\n \"1P 2M 3m 4A 5P 6M 7m\",\n \"dorian #4\",\n \"ukrainian dorian\",\n \"romanian minor\",\n \"altered dorian\"\n ],\n [\"1P 2M 3m 4A 5P 6M 7M\", \"lydian diminished\"],\n [\"1P 2M 3M 4A 5A 7m 7M\", \"leading whole tone\"],\n [\"1P 2M 3M 4A 5P 6m 7m\", \"lydian minor\"],\n [\"1P 2m 3M 4P 5P 6m 7m\", \"phrygian dominant\", \"spanish\", \"phrygian major\"],\n [\"1P 2m 3m 4P 5P 6m 7M\", \"balinese\"],\n [\"1P 2m 3m 4P 5P 6M 7M\", \"neopolitan major\"],\n [\"1P 2M 3M 4P 5P 6m 7M\", \"harmonic major\"],\n [\"1P 2m 3M 4P 5P 6m 7M\", \"double harmonic major\", \"gypsy\"],\n [\"1P 2M 3m 4A 5P 6m 7M\", \"hungarian minor\"],\n [\"1P 2A 3M 4A 5P 6M 7m\", \"hungarian major\"],\n [\"1P 2m 3M 4P 5d 6M 7m\", \"oriental\"],\n [\"1P 2m 3m 3M 4A 5P 7m\", \"flamenco\"],\n [\"1P 2m 3m 4A 5P 6m 7M\", \"todi raga\"],\n [\"1P 2m 3M 4P 5d 6m 7M\", \"persian\"],\n [\"1P 2m 3M 5d 6m 7m 7M\", \"enigmatic\"],\n [\n \"1P 2M 3M 4P 5A 6M 7M\",\n \"major augmented\",\n \"major #5\",\n \"ionian augmented\",\n \"ionian #5\"\n ],\n [\"1P 2A 3M 4A 5P 6M 7M\", \"lydian #9\"],\n // 8-note scales\n [\"1P 2m 2M 4P 4A 5P 6m 7M\", \"messiaen's mode #4\"],\n [\"1P 2m 3M 4P 4A 5P 6m 7M\", \"purvi raga\"],\n [\"1P 2m 3m 3M 4P 5P 6m 7m\", \"spanish heptatonic\"],\n [\"1P 2M 3m 3M 4P 5P 6M 7m\", \"bebop minor\"],\n [\"1P 2M 3M 4P 5P 5A 6M 7M\", \"bebop major\"],\n [\"1P 2m 3m 4P 5d 5P 6m 7m\", \"bebop locrian\"],\n [\"1P 2M 3m 4P 5P 6m 7m 7M\", \"minor bebop\"],\n [\"1P 2M 3M 4P 5d 5P 6M 7M\", \"ichikosucho\"],\n [\"1P 2M 3m 4P 5P 6m 6M 7M\", \"minor six diminished\"],\n [\n \"1P 2m 3m 3M 4A 5P 6M 7m\",\n \"half-whole diminished\",\n \"dominant diminished\",\n \"messiaen's mode #2\"\n ],\n [\"1P 3m 3M 4P 5P 6M 7m 7M\", \"kafi raga\"],\n [\"1P 2M 3M 4P 4A 5A 6A 7M\", \"messiaen's mode #6\"],\n // 9-note scales\n [\"1P 2M 3m 3M 4P 5d 5P 6M 7m\", \"composite blues\"],\n [\"1P 2M 3m 3M 4A 5P 6m 7m 7M\", \"messiaen's mode #3\"],\n // 10-note scales\n [\"1P 2m 2M 3m 4P 4A 5P 6m 6M 7M\", \"messiaen's mode #7\"],\n // 12-note scales\n [\"1P 2m 2M 3m 3M 4P 5d 5P 6m 6M 7m 7M\", \"chromatic\"]\n];\nvar data_default = SCALES;\n\n// index.ts\nvar NoScaleType = {\n ...EmptyPcset,\n intervals: [],\n aliases: []\n};\nvar dictionary = [];\nvar index = {};\nfunction names() {\n return dictionary.map((scale) => scale.name);\n}\nfunction get(type) {\n return index[type] || NoScaleType;\n}\nvar scaleType = get;\nfunction all() {\n return dictionary.slice();\n}\nvar entries = all;\nfunction keys() {\n return Object.keys(index);\n}\nfunction removeAll() {\n dictionary = [];\n index = {};\n}\nfunction add(intervals, name, aliases = []) {\n const scale = { ...pcset(intervals), name, intervals, aliases };\n dictionary.push(scale);\n index[scale.name] = scale;\n index[scale.setNum] = scale;\n index[scale.chroma] = scale;\n scale.aliases.forEach((alias) => addAlias(scale, alias));\n return scale;\n}\nfunction addAlias(scale, alias) {\n index[alias] = scale;\n}\ndata_default.forEach(\n ([ivls, name, ...aliases]) => add(ivls.split(\" \"), name, aliases)\n);\nvar scale_type_default = {\n names,\n get,\n all,\n add,\n removeAll,\n keys,\n // deprecated\n entries,\n scaleType\n};\nexport {\n NoScaleType,\n add,\n addAlias,\n all,\n scale_type_default as default,\n entries,\n get,\n keys,\n names,\n removeAll,\n scaleType\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport { detect } from \"@tonaljs/chord-detect\";\nimport {\n all as chordTypes,\n get as getChordType\n} from \"@tonaljs/chord-type\";\nimport { subtract } from \"@tonaljs/interval\";\nimport { isSubsetOf, isSupersetOf } from \"@tonaljs/pcset\";\nimport {\n distance,\n tonicIntervalsTransposer,\n transpose as transposeNote\n} from \"@tonaljs/pitch-distance\";\nimport { note, tokenizeNote } from \"@tonaljs/pitch-note\";\nimport { all as scaleTypes } from \"@tonaljs/scale-type\";\nimport { detect as detect2 } from \"@tonaljs/chord-detect\";\nvar NoChord = {\n empty: true,\n name: \"\",\n symbol: \"\",\n root: \"\",\n bass: \"\",\n rootDegree: 0,\n type: \"\",\n tonic: null,\n setNum: NaN,\n quality: \"Unknown\",\n chroma: \"\",\n normalized: \"\",\n aliases: [],\n notes: [],\n intervals: []\n};\nfunction tokenize(name) {\n const [letter, acc, oct, type] = tokenizeNote(name);\n if (letter === \"\") {\n return tokenizeBass(\"\", name);\n } else if (letter === \"A\" && type === \"ug\") {\n return tokenizeBass(\"\", \"aug\");\n } else {\n return tokenizeBass(letter + acc, oct + type);\n }\n}\nfunction tokenizeBass(note2, chord2) {\n const split = chord2.split(\"/\");\n if (split.length === 1) {\n return [note2, split[0], \"\"];\n }\n const [letter, acc, oct, type] = tokenizeNote(split[1]);\n if (letter !== \"\" && oct === \"\" && type === \"\") {\n return [note2, split[0], letter + acc];\n } else {\n return [note2, chord2, \"\"];\n }\n}\nfunction get(src) {\n if (Array.isArray(src)) {\n return getChord(src[1] || \"\", src[0], src[2]);\n } else if (src === \"\") {\n return NoChord;\n } else {\n const [tonic, type, bass] = tokenize(src);\n const chord2 = getChord(type, tonic, bass);\n return chord2.empty ? getChord(src) : chord2;\n }\n}\nfunction getChord(typeName, optionalTonic, optionalBass) {\n const type = getChordType(typeName);\n const tonic = note(optionalTonic || \"\");\n const bass = note(optionalBass || \"\");\n if (type.empty || optionalTonic && tonic.empty || optionalBass && bass.empty) {\n return NoChord;\n }\n const bassInterval = distance(tonic.pc, bass.pc);\n const bassIndex = type.intervals.indexOf(bassInterval);\n const hasRoot = bassIndex >= 0;\n const root = hasRoot ? bass : note(\"\");\n const rootDegree = bassIndex === -1 ? NaN : bassIndex + 1;\n const hasBass = bass.pc && bass.pc !== tonic.pc;\n const intervals = Array.from(type.intervals);\n if (hasRoot) {\n for (let i = 1; i < rootDegree; i++) {\n const num = intervals[0][0];\n const quality = intervals[0][1];\n const newNum = parseInt(num, 10) + 7;\n intervals.push(`${newNum}${quality}`);\n intervals.shift();\n }\n } else if (hasBass) {\n const ivl = subtract(distance(tonic.pc, bass.pc), \"8P\");\n if (ivl) intervals.unshift(ivl);\n }\n const notes2 = tonic.empty ? [] : intervals.map((i) => transposeNote(tonic.pc, i));\n typeName = type.aliases.indexOf(typeName) !== -1 ? typeName : type.aliases[0];\n const symbol = `${tonic.empty ? \"\" : tonic.pc}${typeName}${hasRoot && rootDegree > 1 ? \"/\" + root.pc : hasBass ? \"/\" + bass.pc : \"\"}`;\n const name = `${optionalTonic ? tonic.pc + \" \" : \"\"}${type.name}${hasRoot && rootDegree > 1 ? \" over \" + root.pc : hasBass ? \" over \" + bass.pc : \"\"}`;\n return {\n ...type,\n name,\n symbol,\n tonic: tonic.pc,\n type: type.name,\n root: root.pc,\n bass: hasBass ? bass.pc : \"\",\n intervals,\n rootDegree,\n notes: notes2\n };\n}\nvar chord = get;\nfunction transpose(chordName, interval) {\n const [tonic, type, bass] = tokenize(chordName);\n if (!tonic) {\n return chordName;\n }\n const tr = transposeNote(bass, interval);\n const slash = tr ? \"/\" + tr : \"\";\n return transposeNote(tonic, interval) + type + slash;\n}\nfunction chordScales(name) {\n const s = get(name);\n const isChordIncluded = isSupersetOf(s.chroma);\n return scaleTypes().filter((scale) => isChordIncluded(scale.chroma)).map((scale) => scale.name);\n}\nfunction extended(chordName) {\n const s = get(chordName);\n const isSuperset = isSupersetOf(s.chroma);\n return chordTypes().filter((chord2) => isSuperset(chord2.chroma)).map((chord2) => s.tonic + chord2.aliases[0]);\n}\nfunction reduced(chordName) {\n const s = get(chordName);\n const isSubset = isSubsetOf(s.chroma);\n return chordTypes().filter((chord2) => isSubset(chord2.chroma)).map((chord2) => s.tonic + chord2.aliases[0]);\n}\nfunction notes(chordName, tonic) {\n const chord2 = get(chordName);\n const note2 = tonic || chord2.tonic;\n if (!note2 || chord2.empty) return [];\n return chord2.intervals.map((ivl) => transposeNote(note2, ivl));\n}\nfunction degrees(chordName, tonic) {\n const chord2 = get(chordName);\n const note2 = tonic || chord2.tonic;\n const transpose2 = tonicIntervalsTransposer(chord2.intervals, note2);\n return (degree) => degree ? transpose2(degree > 0 ? degree - 1 : degree) : \"\";\n}\nfunction steps(chordName, tonic) {\n const chord2 = get(chordName);\n const note2 = tonic || chord2.tonic;\n return tonicIntervalsTransposer(chord2.intervals, note2);\n}\nvar chord_default = {\n getChord,\n get,\n detect,\n chordScales,\n extended,\n reduced,\n tokenize,\n transpose,\n degrees,\n steps,\n notes,\n chord\n};\nexport {\n chord,\n chordScales,\n chord_default as default,\n degrees,\n detect2 as detect,\n extended,\n get,\n getChord,\n notes,\n reduced,\n steps,\n tokenize,\n transpose\n};\n//# sourceMappingURL=index.mjs.map","// data.ts\nvar DATA = [\n [\n 0.125,\n \"dl\",\n [\"large\", \"duplex longa\", \"maxima\", \"octuple\", \"octuple whole\"]\n ],\n [0.25, \"l\", [\"long\", \"longa\"]],\n [0.5, \"d\", [\"double whole\", \"double\", \"breve\"]],\n [1, \"w\", [\"whole\", \"semibreve\"]],\n [2, \"h\", [\"half\", \"minim\"]],\n [4, \"q\", [\"quarter\", \"crotchet\"]],\n [8, \"e\", [\"eighth\", \"quaver\"]],\n [16, \"s\", [\"sixteenth\", \"semiquaver\"]],\n [32, \"t\", [\"thirty-second\", \"demisemiquaver\"]],\n [64, \"sf\", [\"sixty-fourth\", \"hemidemisemiquaver\"]],\n [128, \"h\", [\"hundred twenty-eighth\"]],\n [256, \"th\", [\"two hundred fifty-sixth\"]]\n];\nvar data_default = DATA;\n\n// index.ts\nvar VALUES = [];\ndata_default.forEach(\n ([denominator, shorthand, names2]) => add(denominator, shorthand, names2)\n);\nvar NoDuration = {\n empty: true,\n name: \"\",\n value: 0,\n fraction: [0, 0],\n shorthand: \"\",\n dots: \"\",\n names: []\n};\nfunction names() {\n return VALUES.reduce((names2, duration) => {\n duration.names.forEach((name) => names2.push(name));\n return names2;\n }, []);\n}\nfunction shorthands() {\n return VALUES.map((dur) => dur.shorthand);\n}\nvar REGEX = /^([^.]+)(\\.*)$/;\nfunction get(name) {\n const [_, simple, dots] = REGEX.exec(name) || [];\n const base = VALUES.find(\n (dur) => dur.shorthand === simple || dur.names.includes(simple)\n );\n if (!base) {\n return NoDuration;\n }\n const fraction2 = calcDots(base.fraction, dots.length);\n const value2 = fraction2[0] / fraction2[1];\n return { ...base, name, dots, value: value2, fraction: fraction2 };\n}\nvar value = (name) => get(name).value;\nvar fraction = (name) => get(name).fraction;\nvar duration_value_default = { names, shorthands, get, value, fraction };\nfunction add(denominator, shorthand, names2) {\n VALUES.push({\n empty: false,\n dots: \"\",\n name: \"\",\n value: 1 / denominator,\n fraction: denominator < 1 ? [1 / denominator, 1] : [1, denominator],\n shorthand,\n names: names2\n });\n}\nfunction calcDots(fraction2, dots) {\n const pow = Math.pow(2, dots);\n let numerator = fraction2[0] * pow;\n let denominator = fraction2[1] * pow;\n const base = numerator;\n for (let i = 0; i < dots; i++) {\n numerator += base / Math.pow(2, i + 1);\n }\n while (numerator % 2 === 0 && denominator % 2 === 0) {\n numerator /= 2;\n denominator /= 2;\n }\n return [numerator, denominator];\n}\nexport {\n duration_value_default as default,\n fraction,\n get,\n names,\n shorthands,\n value\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport { note as props } from \"@tonaljs/pitch-note\";\nfunction isMidi(arg) {\n return +arg >= 0 && +arg <= 127;\n}\nfunction toMidi(note) {\n if (isMidi(note)) {\n return +note;\n }\n const n = props(note);\n return n.empty ? null : n.midi;\n}\nfunction midiToFreq(midi, tuning = 440) {\n return Math.pow(2, (midi - 69) / 12) * tuning;\n}\nvar L2 = Math.log(2);\nvar L440 = Math.log(440);\nfunction freqToMidi(freq) {\n const v = 12 * (Math.log(freq) - L440) / L2 + 69;\n return Math.round(v * 100) / 100;\n}\nvar SHARPS = \"C C# D D# E F F# G G# A A# B\".split(\" \");\nvar FLATS = \"C Db D Eb E F Gb G Ab A Bb B\".split(\" \");\nfunction midiToNoteName(midi, options = {}) {\n if (isNaN(midi) || midi === -Infinity || midi === Infinity) return \"\";\n midi = Math.round(midi);\n const pcs = options.sharps === true ? SHARPS : FLATS;\n const pc = pcs[midi % 12];\n if (options.pitchClass) {\n return pc;\n }\n const o = Math.floor(midi / 12) - 1;\n return pc + o;\n}\nfunction chroma(midi) {\n return midi % 12;\n}\nfunction pcsetFromChroma(chroma2) {\n return chroma2.split(\"\").reduce((pcset2, val, index) => {\n if (index < 12 && val === \"1\") pcset2.push(index);\n return pcset2;\n }, []);\n}\nfunction pcsetFromMidi(midi) {\n return midi.map(chroma).sort((a, b) => a - b).filter((n, i, a) => i === 0 || n !== a[i - 1]);\n}\nfunction pcset(notes) {\n return Array.isArray(notes) ? pcsetFromMidi(notes) : pcsetFromChroma(notes);\n}\nfunction pcsetNearest(notes) {\n const set = pcset(notes);\n return (midi) => {\n const ch = chroma(midi);\n for (let i = 0; i < 12; i++) {\n if (set.includes(ch + i)) return midi + i;\n if (set.includes(ch - i)) return midi - i;\n }\n return void 0;\n };\n}\nfunction pcsetSteps(notes, tonic) {\n const set = pcset(notes);\n const len = set.length;\n return (step) => {\n const index = step < 0 ? (len - -step % len) % len : step % len;\n const octaves = Math.floor(step / len);\n return set[index] + octaves * 12 + tonic;\n };\n}\nfunction pcsetDegrees(notes, tonic) {\n const steps = pcsetSteps(notes, tonic);\n return (degree) => {\n if (degree === 0) return void 0;\n return steps(degree > 0 ? degree - 1 : degree);\n };\n}\nvar index_default = {\n chroma,\n freqToMidi,\n isMidi,\n midiToFreq,\n midiToNoteName,\n pcsetNearest,\n pcset,\n pcsetDegrees,\n pcsetSteps,\n toMidi\n};\nexport {\n chroma,\n index_default as default,\n freqToMidi,\n isMidi,\n midiToFreq,\n midiToNoteName,\n pcset,\n pcsetDegrees,\n pcsetNearest,\n pcsetSteps,\n toMidi\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport { freqToMidi, midiToNoteName } from \"@tonaljs/midi\";\nimport { distance as _dist, transpose as _tr } from \"@tonaljs/pitch-distance\";\nimport {\n note as props\n} from \"@tonaljs/pitch-note\";\nvar NAMES = [\"C\", \"D\", \"E\", \"F\", \"G\", \"A\", \"B\"];\nvar toName = (n) => n.name;\nvar onlyNotes = (array) => array.map(props).filter((n) => !n.empty);\nfunction names(array) {\n if (array === void 0) {\n return NAMES.slice();\n } else if (!Array.isArray(array)) {\n return [];\n } else {\n return onlyNotes(array).map(toName);\n }\n}\nvar get = props;\nvar name = (note) => get(note).name;\nvar pitchClass = (note) => get(note).pc;\nvar accidentals = (note) => get(note).acc;\nvar octave = (note) => get(note).oct;\nvar midi = (note) => get(note).midi;\nvar freq = (note) => get(note).freq;\nvar chroma = (note) => get(note).chroma;\nfunction fromMidi(midi2) {\n return midiToNoteName(midi2);\n}\nfunction fromFreq(freq2) {\n return midiToNoteName(freqToMidi(freq2));\n}\nfunction fromFreqSharps(freq2) {\n return midiToNoteName(freqToMidi(freq2), { sharps: true });\n}\nfunction fromMidiSharps(midi2) {\n return midiToNoteName(midi2, { sharps: true });\n}\nvar distance = _dist;\nvar transpose = _tr;\nvar tr = _tr;\nvar transposeBy = (interval) => (note) => transpose(note, interval);\nvar trBy = transposeBy;\nvar transposeFrom = (note) => (interval) => transpose(note, interval);\nvar trFrom = transposeFrom;\nfunction transposeFifths(noteName, fifths) {\n return transpose(noteName, [fifths, 0]);\n}\nvar trFifths = transposeFifths;\nfunction transposeOctaves(noteName, octaves) {\n return transpose(noteName, [0, octaves]);\n}\nvar ascending = (a, b) => a.height - b.height;\nvar descending = (a, b) => b.height - a.height;\nfunction sortedNames(notes, comparator) {\n comparator = comparator || ascending;\n return onlyNotes(notes).sort(comparator).map(toName);\n}\nfunction sortedUniqNames(notes) {\n return sortedNames(notes, ascending).filter(\n (n, i, a) => i === 0 || n !== a[i - 1]\n );\n}\nvar simplify = (noteName) => {\n const note = get(noteName);\n if (note.empty) {\n return \"\";\n }\n return midiToNoteName(note.midi || note.chroma, {\n sharps: note.alt > 0,\n pitchClass: note.midi === null\n });\n};\nfunction enharmonic(noteName, destName) {\n const src = get(noteName);\n if (src.empty) {\n return \"\";\n }\n const dest = get(\n destName || midiToNoteName(src.midi || src.chroma, {\n sharps: src.alt < 0,\n pitchClass: true\n })\n );\n if (dest.empty || dest.chroma !== src.chroma) {\n return \"\";\n }\n if (src.oct === void 0) {\n return dest.pc;\n }\n const srcChroma = src.chroma - src.alt;\n const destChroma = dest.chroma - dest.alt;\n const destOctOffset = srcChroma > 11 || destChroma < 0 ? -1 : srcChroma < 0 || destChroma > 11 ? 1 : 0;\n const destOct = src.oct + destOctOffset;\n return dest.pc + destOct;\n}\nvar index_default = {\n names,\n get,\n name,\n pitchClass,\n accidentals,\n octave,\n midi,\n ascending,\n descending,\n distance,\n sortedNames,\n sortedUniqNames,\n fromMidi,\n fromMidiSharps,\n freq,\n fromFreq,\n fromFreqSharps,\n chroma,\n transpose,\n tr,\n transposeBy,\n trBy,\n transposeFrom,\n trFrom,\n transposeFifths,\n transposeOctaves,\n trFifths,\n simplify,\n enharmonic\n};\nexport {\n accidentals,\n ascending,\n chroma,\n index_default as default,\n descending,\n distance,\n enharmonic,\n freq,\n fromFreq,\n fromFreqSharps,\n fromMidi,\n fromMidiSharps,\n get,\n midi,\n name,\n names,\n octave,\n pitchClass,\n simplify,\n sortedNames,\n sortedUniqNames,\n tr,\n trBy,\n trFifths,\n trFrom,\n transpose,\n transposeBy,\n transposeFifths,\n transposeFrom,\n transposeOctaves\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport { rotate } from \"@tonaljs/collection\";\nimport { simplify, transposeFifths } from \"@tonaljs/interval\";\nimport { EmptyPcset } from \"@tonaljs/pcset\";\nimport { transpose } from \"@tonaljs/pitch-distance\";\nimport { get as getType } from \"@tonaljs/scale-type\";\nvar MODES = [\n [0, 2773, 0, \"ionian\", \"\", \"Maj7\", \"major\"],\n [1, 2902, 2, \"dorian\", \"m\", \"m7\"],\n [2, 3418, 4, \"phrygian\", \"m\", \"m7\"],\n [3, 2741, -1, \"lydian\", \"\", \"Maj7\"],\n [4, 2774, 1, \"mixolydian\", \"\", \"7\"],\n [5, 2906, 3, \"aeolian\", \"m\", \"m7\", \"minor\"],\n [6, 3434, 5, \"locrian\", \"dim\", \"m7b5\"]\n];\nvar NoMode = {\n ...EmptyPcset,\n name: \"\",\n alt: 0,\n modeNum: NaN,\n triad: \"\",\n seventh: \"\",\n aliases: []\n};\nvar modes = MODES.map(toMode);\nvar index = {};\nmodes.forEach((mode2) => {\n index[mode2.name] = mode2;\n mode2.aliases.forEach((alias) => {\n index[alias] = mode2;\n });\n});\nfunction get(name) {\n return typeof name === \"string\" ? index[name.toLowerCase()] || NoMode : name && name.name ? get(name.name) : NoMode;\n}\nvar mode = get;\nfunction all() {\n return modes.slice();\n}\nvar entries = all;\nfunction names() {\n return modes.map((mode2) => mode2.name);\n}\nfunction toMode(mode2) {\n const [modeNum, setNum, alt, name, triad, seventh, alias] = mode2;\n const aliases = alias ? [alias] : [];\n const chroma = Number(setNum).toString(2);\n const intervals = getType(name).intervals;\n return {\n empty: false,\n intervals,\n modeNum,\n chroma,\n normalized: chroma,\n name,\n setNum,\n alt,\n triad,\n seventh,\n aliases\n };\n}\nfunction notes(modeName, tonic) {\n return get(modeName).intervals.map((ivl) => transpose(tonic, ivl));\n}\nfunction chords(chords2) {\n return (modeName, tonic) => {\n const mode2 = get(modeName);\n if (mode2.empty) return [];\n const triads2 = rotate(mode2.modeNum, chords2);\n const tonics = mode2.intervals.map((i) => transpose(tonic, i));\n return triads2.map((triad, i) => tonics[i] + triad);\n };\n}\nvar triads = chords(MODES.map((x) => x[4]));\nvar seventhChords = chords(MODES.map((x) => x[5]));\nfunction distance(destination, source) {\n const from = get(source);\n const to = get(destination);\n if (from.empty || to.empty) return \"\";\n return simplify(transposeFifths(\"1P\", to.alt - from.alt));\n}\nfunction relativeTonic(destination, source, tonic) {\n return transpose(tonic, distance(destination, source));\n}\nvar mode_default = {\n get,\n names,\n all,\n distance,\n relativeTonic,\n notes,\n triads,\n seventhChords,\n // deprecated\n entries,\n mode\n};\nexport {\n all,\n mode_default as default,\n distance,\n entries,\n get,\n mode,\n names,\n notes,\n relativeTonic,\n seventhChords,\n triads\n};\n//# sourceMappingURL=index.mjs.map","import { Midi, Note } from \"tonal\";\r\nimport { Chord as TonalChord } from \"tonal\";\r\nimport type { NoteName } from \"../types/music\";\r\n\r\nexport function midiToFrequency(midi: number): number {\r\n return Midi.midiToFreq(midi);\r\n}\r\n\r\nexport function noteToFrequency(note: NoteName | string): number {\r\n const freq = Note.freq(note);\r\n if (freq === null) {\r\n console.warn(`Invalid note: ${note}, defaulting to A4 (440Hz)`);\r\n return 440;\r\n }\r\n return freq;\r\n}\r\n\r\nexport function resolveChordNotes(\r\n notes: string | (string | number)[],\r\n): (string | number)[] {\r\n // If already an array, return as-is\r\n if (Array.isArray(notes)) {\r\n return notes;\r\n }\r\n\r\n // Parse chord name with optional octave (e.g., \"Cmaj7:4\")\r\n const [chordName, octaveStr] = notes.split(\":\");\r\n const octave = octaveStr ? parseInt(octaveStr, 10) : 3;\r\n\r\n // Get chord notes from Tonal\r\n const chord = TonalChord.get(chordName);\r\n\r\n if (!chord.notes.length) {\r\n console.warn(`Unknown chord: ${chordName}, defaulting to root note`);\r\n return [chordName + octave];\r\n }\r\n\r\n // Add octave to each note, handling octave wrapping for notes above the root\r\n const rootPc = chord.notes[0];\r\n const noteOrder = [\"C\", \"D\", \"E\", \"F\", \"G\", \"A\", \"B\"];\r\n const rootIndex = noteOrder.findIndex((n) => rootPc.startsWith(n));\r\n\r\n return chord.notes.map((note) => {\r\n const noteIndex = noteOrder.findIndex((n) => note.startsWith(n));\r\n // If note is lower in the scale than root, it's in the next octave\r\n const noteOctave = noteIndex < rootIndex ? octave + 1 : octave;\r\n return note + noteOctave;\r\n });\r\n}\r\n","import type { CutoffType } from \"../components/Synth/types\";\r\nimport { midiToFrequency } from \"./notes\";\r\n\r\n/** Generate an array of linearly interpolated values */\r\nexport function line(start: number, end: number, steps: number): number[] {\r\n if (steps < 1) {\r\n throw new Error(\"Line must have at least 1 step\");\r\n }\r\n\r\n const increment = (end - start) / steps;\r\n return Array.from({ length: steps }, (_, i) => start + increment * i);\r\n}\r\n\r\n/** Mirror an array: [1,2,3] → [1,2,3,3,2,1] */\r\nexport function mirror(values: number[]): number[] {\r\n return [...values, ...values.toReversed()];\r\n}\r\n\r\nexport function resolveCutoff(\r\n cutoff: CutoffType,\r\n stepIndex: number,\r\n): number {\r\n if (typeof cutoff === \"number\") {\r\n return midiToFrequency(cutoff);\r\n }\r\n\r\n const values = line(cutoff.from, cutoff.to, cutoff.steps);\r\n const sequence = cutoff.mirror ? mirror(values) : values;\r\n const effectiveStep = cutoff.step ?? stepIndex;\r\n\r\n return midiToFrequency(sequence[effectiveStep % sequence.length]);\r\n}\r\n","import type { SynthConfig, SynthType } from \"./types\";\r\n\r\nexport const SYNTH_PRESETS: Record<SynthType, SynthConfig> = {\r\n /**\r\n * Pure sine wave - clean, fundamental tone\r\n */\r\n sine: {\r\n oscillator: \"sine\",\r\n filter: { type: \"lowpass\", cutoff: 135.08, resonance: 1 },\r\n voices: { count: 1, detune: 0, spread: 0 },\r\n },\r\n\r\n /**\r\n * Sawtooth wave - bright, harmonically rich\r\n */\r\n saw: {\r\n oscillator: \"sawtooth\",\r\n filter: { type: \"lowpass\", cutoff: 135.08, resonance: 1 },\r\n voices: { count: 1, detune: 0, spread: 0 },\r\n },\r\n\r\n /**\r\n * Square wave - hollow, clarinet-like\r\n */\r\n square: {\r\n oscillator: \"square\",\r\n filter: { type: \"lowpass\", cutoff: 135.08, resonance: 1 },\r\n voices: { count: 1, detune: 0, spread: 0 },\r\n },\r\n\r\n /**\r\n * Triangle wave - soft, flute-like\r\n */\r\n tri: {\r\n oscillator: \"triangle\",\r\n filter: { type: \"lowpass\", cutoff: 135.08, resonance: 1 },\r\n voices: { count: 1, detune: 0, spread: 0 },\r\n },\r\n\r\n /**\r\n * Prophet - Sequential Circuits Prophet-5 inspired\r\n * Warm analog sound with detuned voices and resonant filter\r\n * Great for leads and pads\r\n */\r\n prophet: {\r\n oscillator: \"sawtooth\",\r\n filter: { type: \"lowpass\", cutoff: 102.23, resonance: 4 },\r\n voices: { count: 3, detune: 12, spread: 0.5 },\r\n },\r\n\r\n /**\r\n * Hollow - Ethereal pad sound\r\n * Filtered square wave with soft resonance\r\n * Good for atmospheric backgrounds\r\n */\r\n hollow: {\r\n oscillator: \"square\",\r\n filter: { type: \"bandpass\", cutoff: 86.37, resonance: 2 },\r\n voices: { count: 2, detune: 8, spread: 0.7 },\r\n },\r\n\r\n /**\r\n * Dark Ambience - Deep atmospheric pad\r\n * Low-passed sawtooth with multiple detuned voices\r\n */\r\n dark_ambience: {\r\n oscillator: \"sawtooth\",\r\n filter: { type: \"lowpass\", cutoff: 79.35, resonance: 3 },\r\n voices: { count: 4, detune: 15, spread: 0.8 },\r\n },\r\n\r\n /**\r\n * Bass - Punchy bass sound\r\n * Filtered sawtooth with slight detune for thickness\r\n */\r\n bass: {\r\n oscillator: \"sawtooth\",\r\n filter: { type: \"lowpass\", cutoff: 74.37, resonance: 5 },\r\n voices: { count: 2, detune: 5, spread: 0.2 },\r\n },\r\n\r\n /**\r\n * Pluck - Bright plucked string sound\r\n * Square wave with high cutoff for attack brightness\r\n */\r\n pluck: {\r\n oscillator: \"square\",\r\n filter: { type: \"lowpass\", cutoff: 111.08, resonance: 2 },\r\n voices: { count: 2, detune: 6, spread: 0.3 },\r\n },\r\n};\r\n\r\nexport function getSynthPreset(type: SynthType): SynthConfig {\r\n return SYNTH_PRESETS[type];\r\n}\r\n\r\nexport const DEFAULT_SYNTH_CONFIG: SynthConfig = SYNTH_PRESETS.sine;\r\n","import { createContext, type ReactNode, useContext, useMemo } from \"react\";\r\nimport type { SynthConfig, SynthOverrides, SynthType } from \"./types\";\r\nimport { DEFAULT_SYNTH_CONFIG, getSynthPreset } from \"./presets\";\r\n\r\nconst SynthContext = createContext<SynthConfig | null>(null);\r\n\r\ntype SynthProps = SynthOverrides & {\r\n type: SynthType;\r\n children: React.ReactNode;\r\n};\r\n\r\n/**\r\n * Synth component - defines the synthesizer for child Note/Chord components\r\n *\r\n * @example\r\n * // Using a preset synth type\r\n * <Synth type=\"prophet\">\r\n * <Note note=\"C4\" />\r\n * </Synth>\r\n *\r\n * @example\r\n * // Overriding preset parameters with nested structure\r\n * <Synth type=\"prophet\" filter={{ cutoff: 2000, resonance: 6 }}>\r\n * <Chord notes=\"Am7\" />\r\n * </Synth>\r\n *\r\n * @example\r\n * // Creating thick unison sound\r\n * <Synth type=\"saw\" voices={{ count: 4, detune: 15, spread: 0.8 }}>\r\n * <Sequence interval={0.25}>\r\n * <Note note=\"A3\" />\r\n * <Note note=\"C4\" />\r\n * </Sequence>\r\n * </Synth>\r\n */\r\nexport function Synth({\r\n type,\r\n oscillator,\r\n filter,\r\n voices,\r\n children,\r\n}: SynthProps): ReactNode {\r\n // Build configuration by starting with preset and applying overrides\r\n const config = useMemo<SynthConfig>(() => {\r\n const preset = getSynthPreset(type);\r\n\r\n return {\r\n oscillator: oscillator ?? preset.oscillator,\r\n filter: {\r\n type: filter?.type ?? preset.filter.type,\r\n cutoff: filter?.cutoff ?? preset.filter.cutoff,\r\n resonance: filter?.resonance ?? preset.filter.resonance,\r\n },\r\n voices: {\r\n count: voices?.count ?? preset.voices.count,\r\n detune: voices?.detune ?? preset.voices.detune,\r\n spread: voices?.spread ?? preset.voices.spread,\r\n },\r\n };\r\n }, [type, oscillator, filter, voices]);\r\n\r\n return (\r\n <SynthContext.Provider value={config}>\r\n {children}\r\n </SynthContext.Provider>\r\n );\r\n}\r\n\r\nexport function useSynth(): SynthConfig {\r\n const ctx = useContext(SynthContext);\r\n return ctx ?? DEFAULT_SYNTH_CONFIG;\r\n}\r\n","import { type ReactNode, useEffect, useId } from \"react\";\r\nimport { useScheduleNote, useTrack } from \"../Track\";\r\nimport {\r\n ADSR_DEFAULTS,\r\n type ADSRProps,\r\n applyADSREnvelope,\r\n} from \"../../utils/envelope\";\r\nimport { noteToFrequency } from \"../../utils/notes\";\r\nimport { resolveCutoff } from \"../../utils/line\";\r\nimport type { NoteName } from \"../../types/music\";\r\nimport { type SynthOverrides, useSynth } from \"../Synth\";\r\n\r\ntype NoteProps =\r\n & ADSRProps\r\n & SynthOverrides\r\n & {\r\n /** Note name (e.g., \"A4\", \"C#3\") or frequency in Hz */\r\n note: NoteName | number;\r\n /** Amplitude 0-1 (default: 0.3) */\r\n amp?: number;\r\n /** Step index when inside a Sequence (injected by Sequence) */\r\n __stepIndex?: number;\r\n };\r\n\r\n/**\r\n * Note component - plays a note using Web Audio oscillator with ADSR envelope\r\n *\r\n * When used inside a Loop or Sequence, the note will be scheduled\r\n * with sample-accurate timing via the scheduler.\r\n *\r\n * The note duration is determined by the ADSR envelope:\r\n * total duration = attack + decay + sustain + release\r\n *\r\n * @example\r\n * <Note note=\"A4\" amp={0.5} attack={0.1} sustain={0.5} release={0.2} />\r\n * <Note note={440} oscillator=\"sawtooth\" attack={0.05} decay={0.1} sustain_level={0.7} />\r\n * <Note note=\"C4\" filter={{ cutoff: 800, resonance: 5 }} />\r\n * <Note note=\"E4\" voices={{ count: 3, detune: 10, spread: 0.5 }} />\r\n */\r\nexport function Note({\r\n note,\r\n amp = 0.3,\r\n oscillator,\r\n filter,\r\n voices,\r\n attack = ADSR_DEFAULTS.attack,\r\n attack_level = ADSR_DEFAULTS.attack_level,\r\n decay = ADSR_DEFAULTS.decay,\r\n decay_level,\r\n sustain = ADSR_DEFAULTS.sustain,\r\n sustain_level = ADSR_DEFAULTS.sustain_level,\r\n release = ADSR_DEFAULTS.release,\r\n __stepIndex,\r\n}: NoteProps): ReactNode {\r\n const uniqueId = useId();\r\n const { audioContext, scheduler } = useTrack();\r\n const scheduleNote = useScheduleNote();\r\n const synthConfig = useSynth();\r\n\r\n // Use prop values if specified, otherwise use synth config\r\n const oscillatorType = oscillator ?? synthConfig.oscillator;\r\n const filterType = filter?.type ?? synthConfig.filter.type;\r\n const filterCutoff = resolveCutoff(\r\n filter?.cutoff ?? synthConfig.filter.cutoff,\r\n __stepIndex ?? 0,\r\n );\r\n const filterResonance = filter?.resonance ?? synthConfig.filter.resonance;\r\n const voiceCount = voices?.count ?? synthConfig.voices.count;\r\n const voiceDetune = voices?.detune ?? synthConfig.voices.detune;\r\n const voiceSpread = voices?.spread ?? synthConfig.voices.spread;\r\n\r\n const frequency = typeof note === \"number\" ? note : noteToFrequency(note);\r\n const adsrProps = {\r\n attack,\r\n attack_level,\r\n decay,\r\n decay_level,\r\n sustain,\r\n sustain_level,\r\n release,\r\n };\r\n\r\n useEffect(() => {\r\n const playNote = (audioTime: number) => {\r\n const gainNode = audioContext.createGain();\r\n\r\n // Create filter if cutoff is below maximum (20000 Hz)\r\n if (filterCutoff < 20000) {\r\n const filter = audioContext.createBiquadFilter();\r\n filter.type = filterType;\r\n filter.frequency.value = filterCutoff;\r\n filter.Q.value = filterResonance;\r\n gainNode.connect(filter);\r\n filter.connect(audioContext.destination);\r\n } else {\r\n gainNode.connect(audioContext.destination);\r\n }\r\n\r\n const endTime = applyADSREnvelope(\r\n gainNode,\r\n audioTime,\r\n adsrProps,\r\n amp / voiceCount, // Normalize amplitude across voices\r\n (beats) => scheduler.beatsToSeconds(beats),\r\n );\r\n\r\n // Create oscillators for each voice (for unison/detune effect)\r\n for (let i = 0; i < voiceCount; i++) {\r\n const oscillator = audioContext.createOscillator();\r\n oscillator.type = oscillatorType;\r\n oscillator.frequency.value = frequency;\r\n\r\n // Apply detune spread across voices\r\n if (voiceCount > 1 && voiceDetune > 0) {\r\n // Spread detune evenly: -detune/2 to +detune/2\r\n const detuneOffset = (i / (voiceCount - 1) - 0.5) * voiceDetune;\r\n oscillator.detune.value = detuneOffset;\r\n }\r\n\r\n // Apply stereo spread if multiple voices\r\n if (voiceCount > 1 && voiceSpread > 0) {\r\n const panner = audioContext.createStereoPanner();\r\n const panValue = (i / (voiceCount - 1) - 0.5) * 2 * voiceSpread;\r\n panner.pan.value = panValue;\r\n oscillator.connect(panner);\r\n panner.connect(gainNode);\r\n } else {\r\n oscillator.connect(gainNode);\r\n }\r\n\r\n oscillator.start(audioTime);\r\n oscillator.stop(endTime + 0.01);\r\n }\r\n };\r\n\r\n scheduleNote.scheduleNote(uniqueId, playNote, __stepIndex);\r\n return () => {\r\n scheduleNote.unscheduleNote(uniqueId);\r\n };\r\n }, [\r\n note,\r\n frequency,\r\n amp,\r\n oscillatorType,\r\n filterCutoff,\r\n filterResonance,\r\n filterType,\r\n voiceCount,\r\n voiceDetune,\r\n voiceSpread,\r\n adsrProps,\r\n audioContext,\r\n scheduler,\r\n scheduleNote,\r\n __stepIndex,\r\n uniqueId,\r\n ]);\r\n\r\n return null;\r\n}\r\n","import { readFile } from \"fs/promises\";\r\nimport { fileURLToPath } from \"url\";\r\nimport { createRequire } from \"module\";\r\nimport { dirname, join } from \"path\";\r\nimport type { AudioContext as AudioContextType } from \"node-web-audio-api\";\r\n\r\nconst sampleCache = new Map<string, AudioBuffer>();\r\n\r\n// Resolve samples directory from the package location\r\nfunction getSamplesDir(): string {\r\n try {\r\n // Use createRequire to find the package location\r\n const require = createRequire(import.meta.url);\r\n const packageMain = require.resolve(\"@react-synth/synth\");\r\n const packageDir = dirname(packageMain);\r\n // In the published package, samples are at src/samples relative to package root\r\n // dist/index.js -> ../src/samples\r\n return join(packageDir, \"..\", \"src\", \"samples\");\r\n } catch {\r\n // Fallback: resolve relative to this file (works during development)\r\n const currentFile = fileURLToPath(import.meta.url);\r\n const currentDir = dirname(currentFile);\r\n return join(currentDir, \"..\", \"samples\");\r\n }\r\n}\r\n\r\nconst samplesDir = getSamplesDir();\r\n\r\nfunction getSamplePath(name: string): string {\r\n return join(samplesDir, `${name}.flac`);\r\n}\r\n\r\nexport async function loadSample(\r\n audioContext: AudioContextType,\r\n name: string,\r\n): Promise<AudioBuffer> {\r\n if (sampleCache.has(name)) {\r\n return sampleCache.get(name)!;\r\n }\r\n\r\n const path = getSamplePath(name);\r\n const fileData = await readFile(path);\r\n const audioBuffer = await audioContext.decodeAudioData(\r\n fileData.buffer as ArrayBuffer,\r\n );\r\n sampleCache.set(name, audioBuffer);\r\n return audioBuffer;\r\n}\r\n","import { type ReactNode, useEffect, useId } from \"react\";\r\nimport { useScheduleNote, useTrack } from \"../Track\";\r\nimport { loadSample } from \"../../audio/sampleLoader\";\r\nimport type { SampleName } from \"../../types/music\";\r\nimport type { CutoffType } from \"../Synth/types\";\r\nimport { resolveCutoff } from \"../../utils/line\";\r\n\r\ntype SampleProps = {\r\n /** Sample name (without extension, e.g., \"bd_haus\") */\r\n name: SampleName;\r\n /** Amplitude/volume (default: 1) */\r\n amp?: number;\r\n /**\r\n * Filter cutoff as MIDI note number or Line pattern (Sonic Pi compatible)\r\n *\r\n * Common values:\r\n * - 60 => ~262 Hz (C4)\r\n * - 80 => ~831 Hz\r\n * - 100 => ~2637 Hz\r\n * - 110 => ~4699 Hz\r\n * - 130 => ~20kHz (essentially no filtering)\r\n *\r\n * Can also be a Line pattern: { from: 60, to: 120, steps: 8 }\r\n */\r\n cutoff?: CutoffType;\r\n /** Playback rate multiplier (default: 1) */\r\n rate?: number;\r\n /** Stereo pan position from -1 (left) to 1 (right) (default: 0) */\r\n pan?: number;\r\n /** Step index when inside a Sequence (injected by Sequence) */\r\n __stepIndex?: number;\r\n};\r\n\r\n/**\r\n * Sample component - plays an audio sample file with optional effects\r\n *\r\n * @example\r\n * <Sample name=\"bd_haus\" amp={2} cutoff={100} />\r\n * <Sample name=\"drum_cymbal_closed\" amp={0.5} rate={1.5} pan={0.1} />\r\n */\r\nexport function Sample({\r\n name,\r\n amp = 1,\r\n cutoff,\r\n rate = 1,\r\n pan = 0,\r\n __stepIndex,\r\n}: SampleProps): ReactNode {\r\n const uniqueId = useId();\r\n const { audioContext } = useTrack();\r\n const scheduleNote = useScheduleNote();\r\n\r\n // Resolve cutoff using the same logic as Note/Chord components\r\n const filterCutoff = cutoff !== undefined\r\n ? resolveCutoff(cutoff, __stepIndex ?? 0)\r\n : 20000;\r\n\r\n useEffect(() => {\r\n let buffer: AudioBuffer | null = null;\r\n\r\n loadSample(audioContext, name).then((loaded) => {\r\n buffer = loaded;\r\n });\r\n\r\n const playSample = (audioTime: number) => {\r\n if (!buffer) return;\r\n\r\n const source = audioContext.createBufferSource();\r\n source.buffer = buffer;\r\n source.playbackRate.value = rate;\r\n\r\n // Build audio graph: source -> [filter] -> [panner] -> gain -> destination\r\n let currentNode: AudioNode = source;\r\n\r\n // Create filter if cutoff is below maximum (20000 Hz)\r\n if (filterCutoff < 20000) {\r\n const filter = audioContext.createBiquadFilter();\r\n filter.type = \"lowpass\";\r\n filter.frequency.value = filterCutoff;\r\n currentNode.connect(filter);\r\n currentNode = filter;\r\n }\r\n\r\n if (pan !== 0) {\r\n const panner = audioContext.createStereoPanner();\r\n panner.pan.value = pan;\r\n currentNode.connect(panner);\r\n currentNode = panner;\r\n }\r\n\r\n const gainNode = audioContext.createGain();\r\n gainNode.gain.value = amp;\r\n currentNode.connect(gainNode);\r\n gainNode.connect(audioContext.destination);\r\n\r\n source.start(audioTime);\r\n };\r\n\r\n scheduleNote.scheduleNote(uniqueId, playSample, __stepIndex);\r\n return () => {\r\n scheduleNote.unscheduleNote(uniqueId);\r\n };\r\n }, [\r\n audioContext,\r\n name,\r\n scheduleNote,\r\n uniqueId,\r\n __stepIndex,\r\n amp,\r\n filterCutoff,\r\n rate,\r\n pan,\r\n ]);\r\n\r\n return null;\r\n}\r\n","import { type ReactNode, useEffect, useId } from \"react\";\r\nimport { useScheduleNote, useTrack } from \"./Track\";\r\nimport {\r\n ADSR_DEFAULTS,\r\n type ADSRProps,\r\n applyADSREnvelope,\r\n} from \"../utils/envelope\";\r\nimport { noteToFrequency, resolveChordNotes } from \"../utils/notes\";\r\nimport type { NoteName } from \"../types/music\";\r\nimport { type SynthOverrides, useSynth } from \"./Synth\";\r\nimport { resolveCutoff } from \"../utils/line\";\r\n\r\ntype ChordProps =\r\n & ADSRProps\r\n & SynthOverrides\r\n & {\r\n /**\r\n * Chord specification - can be:\r\n * - A chord name string (e.g., \"Cmaj7\", \"Am\", \"F#m7\", \"Dm/F\")\r\n * - An array of note names (e.g., [\"A4\", \"C#3\", \"E4\"])\r\n * - An array of frequencies in Hz (e.g., [440, 550, 660])\r\n *\r\n * When using chord names, specify the octave with a colon (e.g., \"Cmaj7:4\" for octave 4)\r\n * Default octave is 3 if not specified.\r\n */\r\n notes: string | (NoteName | number)[];\r\n /** Amplitude 0-1 (default: 0.3) */\r\n amp?: number;\r\n /** Step index when inside a Sequence (injected by Sequence) */\r\n __stepIndex?: number;\r\n };\r\n\r\n/**\r\n * Chord component - plays multiple notes simultaneously using Web Audio oscillators\r\n *\r\n * When used inside a Loop or Sequence, the chord will be scheduled\r\n * with sample-accurate timing via the scheduler.\r\n *\r\n * The chord duration is determined by the ADSR envelope:\r\n * total duration = attack + decay + sustain + release\r\n *\r\n * @example\r\n * // Using chord names (powered by Tonal)\r\n * <Chord notes=\"Cmaj7\" amp={0.5} />\r\n * <Chord notes=\"Am:4\" oscillator=\"sawtooth\" /> // A minor in octave 4\r\n * <Chord notes=\"Dm7/F\" release={2} /> // D minor 7 with F bass\r\n *\r\n * // Using note arrays\r\n * <Chord notes={[\"a3\", \"c4\", \"e4\"]} amp={0.5} attack={0.1} sustain={2} release={0.5} />\r\n * <Chord notes={[440, 550, 660]} oscillator=\"sawtooth\" decay={0.2} sustain_level={0.7} />\r\n *\r\n * // With filter and voice overrides\r\n * <Chord notes=\"Em7\" filter={{ cutoff: 1000, resonance: 4 }} />\r\n * <Chord notes=\"Cmaj\" voices={{ count: 2, detune: 8 }} />\r\n */\r\nexport function Chord({\r\n notes,\r\n amp = 0.3,\r\n oscillator,\r\n filter,\r\n voices,\r\n attack = ADSR_DEFAULTS.attack,\r\n attack_level = ADSR_DEFAULTS.attack_level,\r\n decay = ADSR_DEFAULTS.decay,\r\n decay_level,\r\n sustain = ADSR_DEFAULTS.sustain,\r\n sustain_level = ADSR_DEFAULTS.sustain_level,\r\n release = ADSR_DEFAULTS.release,\r\n __stepIndex,\r\n}: ChordProps): ReactNode {\r\n const uniqueId = useId();\r\n const { audioContext, scheduler } = useTrack();\r\n const { scheduleNote, unscheduleNote } = useScheduleNote();\r\n const synthConfig = useSynth();\r\n\r\n // Use prop values if specified, otherwise use synth config\r\n const oscillatorType = oscillator ?? synthConfig.oscillator;\r\n const filterType = filter?.type ?? synthConfig.filter.type;\r\n const filterCutoff = resolveCutoff(\r\n filter?.cutoff ?? synthConfig.filter.cutoff,\r\n __stepIndex ?? 0,\r\n );\r\n const filterResonance = filter?.resonance ?? synthConfig.filter.resonance;\r\n const voiceCount = voices?.count ?? synthConfig.voices.count;\r\n const voiceDetune = voices?.detune ?? synthConfig.voices.detune;\r\n const voiceSpread = voices?.spread ?? synthConfig.voices.spread;\r\n\r\n const resolvedNotes = resolveChordNotes(notes);\r\n const frequencies = resolvedNotes.map((note) =>\r\n typeof note === \"number\" ? note : noteToFrequency(note)\r\n );\r\n const adsrProps = {\r\n attack,\r\n attack_level,\r\n decay,\r\n decay_level,\r\n sustain,\r\n sustain_level,\r\n release,\r\n };\r\n\r\n // Total number of oscillators = chord notes × voices per note\r\n const totalOscillators = frequencies.length * voiceCount;\r\n\r\n useEffect(() => {\r\n const playChord = (audioTime: number) => {\r\n const gainNode = audioContext.createGain();\r\n\r\n // Create filter if cutoff is below maximum (20000 Hz)\r\n if (filterCutoff < 20000) {\r\n const filter = audioContext.createBiquadFilter();\r\n filter.type = filterType;\r\n filter.frequency.value = filterCutoff;\r\n filter.Q.value = filterResonance;\r\n gainNode.connect(filter);\r\n filter.connect(audioContext.destination);\r\n } else {\r\n gainNode.connect(audioContext.destination);\r\n }\r\n\r\n const endTime = applyADSREnvelope(\r\n gainNode,\r\n audioTime,\r\n adsrProps,\r\n amp / totalOscillators, // Normalize amplitude across all oscillators\r\n (beats) => scheduler.beatsToSeconds(beats),\r\n );\r\n\r\n // Create oscillators for each chord note\r\n for (const frequency of frequencies) {\r\n // Create voices for each note (for unison/detune effect)\r\n for (let i = 0; i < voiceCount; i++) {\r\n const oscillator = audioContext.createOscillator();\r\n oscillator.type = oscillatorType;\r\n oscillator.frequency.value = frequency;\r\n\r\n // Apply detune spread across voices\r\n if (voiceCount > 1 && voiceDetune > 0) {\r\n const detuneOffset = (i / (voiceCount - 1) - 0.5) * voiceDetune;\r\n oscillator.detune.value = detuneOffset;\r\n }\r\n\r\n // Apply stereo spread if multiple voices\r\n if (voiceCount > 1 && voiceSpread > 0) {\r\n const panner = audioContext.createStereoPanner();\r\n const panValue = (i / (voiceCount - 1) - 0.5) * 2 * voiceSpread;\r\n panner.pan.value = panValue;\r\n oscillator.connect(panner);\r\n panner.connect(gainNode);\r\n } else {\r\n oscillator.connect(gainNode);\r\n }\r\n\r\n oscillator.start(audioTime);\r\n oscillator.stop(endTime + 0.01);\r\n }\r\n }\r\n };\r\n\r\n scheduleNote(uniqueId, playChord, __stepIndex);\r\n return () => {\r\n unscheduleNote(uniqueId);\r\n };\r\n }, [\r\n notes,\r\n frequencies,\r\n amp,\r\n oscillatorType,\r\n filterCutoff,\r\n filterResonance,\r\n filterType,\r\n voiceCount,\r\n voiceDetune,\r\n voiceSpread,\r\n totalOscillators,\r\n adsrProps,\r\n audioContext,\r\n scheduler,\r\n scheduleNote,\r\n unscheduleNote,\r\n __stepIndex,\r\n uniqueId,\r\n ]);\r\n\r\n return null;\r\n}\r\n","import React, {\r\n Children,\r\n cloneElement,\r\n isValidElement,\r\n type ReactNode,\r\n useEffect,\r\n useId,\r\n useMemo,\r\n useRef,\r\n} from \"react\";\r\nimport {\r\n ScheduleNoteContext,\r\n type ScheduleNoteContextValue,\r\n useScheduleNote,\r\n useTrack,\r\n} from \"./Track\";\r\nimport type { ScheduleCallback } from \"../audio/scheduler\";\r\n\r\ntype SequenceProps = {\r\n /** Time interval between each child in beats */\r\n interval: number;\r\n /** Children to play in sequence */\r\n children: ReactNode;\r\n /** Step index when nested inside another Sequence (injected by parent Sequence) */\r\n __stepIndex?: number;\r\n};\r\n\r\n/**\r\n * Sequence component - plays children one after another with precise timing\r\n *\r\n * @example\r\n * <Sequence interval={0.25}>\r\n * <Note note=\"C4\" />\r\n * <Note note=\"E4\" />\r\n * <Note note=\"G4\" />\r\n * </Sequence>\r\n */\r\nexport function Sequence({\r\n interval,\r\n children,\r\n __stepIndex,\r\n}: SequenceProps): ReactNode {\r\n const uniqueId = useId();\r\n const { scheduler } = useTrack();\r\n const { scheduleNote, unscheduleNote } = useScheduleNote();\r\n const childArray = Children.toArray(children);\r\n const totalSteps = childArray.length;\r\n\r\n // Store step callbacks (keyed by step index)\r\n const stepCallbacks = React.useRef<Map<number, ScheduleCallback>>(new Map());\r\n // Map from note ID to step index (for unscheduling)\r\n const idToStepIndex = useRef<Map<string, number>>(new Map());\r\n\r\n useEffect(() => {\r\n const sequenceCallback: ScheduleCallback = (audioTime, beatTime) => {\r\n for (let i = 0; i < totalSteps; i++) {\r\n const stepOffset = scheduler.beatsToSeconds(i * interval);\r\n const stepAudioTime = audioTime + stepOffset;\r\n const stepBeatTime = beatTime + i * interval;\r\n\r\n const callback = stepCallbacks.current.get(i);\r\n if (callback) {\r\n callback(stepAudioTime, stepBeatTime);\r\n }\r\n }\r\n };\r\n\r\n scheduleNote(`seq-${uniqueId}`, sequenceCallback, __stepIndex);\r\n\r\n return () => {\r\n unscheduleNote(`seq-${uniqueId}`);\r\n };\r\n }, [\r\n interval,\r\n totalSteps,\r\n scheduler,\r\n uniqueId,\r\n scheduleNote,\r\n unscheduleNote,\r\n __stepIndex,\r\n ]);\r\n\r\n // Scheduling context for Notes inside this Sequence\r\n const scheduleContextValue: ScheduleNoteContextValue = useMemo(\r\n () => ({\r\n scheduleNote: (noteId, callback, stepIndex) => {\r\n if (stepIndex !== undefined) {\r\n idToStepIndex.current.set(noteId, stepIndex);\r\n stepCallbacks.current.set(stepIndex, callback);\r\n }\r\n },\r\n unscheduleNote: (noteId) => {\r\n const stepIndex = idToStepIndex.current.get(noteId);\r\n if (stepIndex !== undefined) {\r\n stepCallbacks.current.delete(stepIndex);\r\n idToStepIndex.current.delete(noteId);\r\n }\r\n },\r\n }),\r\n [],\r\n );\r\n\r\n // Clone children with their step index\r\n const childrenWithIndex = childArray.map((child, index) => {\r\n if (isValidElement(child)) {\r\n return cloneElement(child, {\r\n key: `step-${index}`,\r\n __stepIndex: index,\r\n } as Record<string, unknown>);\r\n }\r\n return child;\r\n });\r\n\r\n return (\r\n <ScheduleNoteContext.Provider value={scheduleContextValue}>\r\n {childrenWithIndex}\r\n </ScheduleNoteContext.Provider>\r\n );\r\n}\r\n"],"names":["AudioContext","createContext","useRef","useEffect","useMemo","jsx","useContext","interval","fillStr","REGEX","cache","parse","pitchName","freq","note","asNote","asInterval","get","pitch","data_default","index","add","pcset","addAlias","props","getChordType","transposeNote","getType","Midi.midiToFreq","Note.freq","TonalChord.get","useId","filter","oscillator","require","createRequire","dirname","join","fileURLToPath","path","readFile","Children","isValidElement","cloneElement"],"mappings":"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","x_google_ignoreList":[4,5,6,7,8,9,10,11,12,13,14,15,16,17]}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/audio/scheduler.ts","../src/components/Track.tsx","../src/components/Loop.tsx","../src/utils/envelope.ts","../node_modules/@tonaljs/pitch/dist/index.mjs","../node_modules/@tonaljs/pitch-interval/dist/index.mjs","../node_modules/@tonaljs/pitch-note/dist/index.mjs","../node_modules/@tonaljs/pitch-distance/dist/index.mjs","../node_modules/@tonaljs/collection/dist/index.mjs","../node_modules/@tonaljs/pcset/dist/index.mjs","../node_modules/@tonaljs/chord-type/dist/index.mjs","../node_modules/@tonaljs/interval/dist/index.mjs","../node_modules/@tonaljs/scale-type/dist/index.mjs","../node_modules/@tonaljs/chord/dist/index.mjs","../node_modules/@tonaljs/duration-value/dist/index.mjs","../node_modules/@tonaljs/midi/dist/index.mjs","../node_modules/@tonaljs/note/dist/index.mjs","../node_modules/@tonaljs/mode/dist/index.mjs","../src/utils/notes.ts","../src/utils/line.ts","../src/components/Synth/presets.ts","../src/components/Synth/Synth.tsx","../src/components/Note/Note.tsx","../src/audio/sampleLoader.ts","../src/components/Sample/Sample.tsx","../src/components/Chord.tsx","../src/components/Sequence.tsx"],"sourcesContent":["import {\n AudioContext,\n type AudioContext as AudioContextType,\n} from \"node-web-audio-api\";\n\nexport type ScheduleCallback = (audioTime: number, beatTime: number) => void;\n\ntype ScheduledEvent = {\n id: string;\n nextBeatTime: number;\n intervalBeats: number;\n callback: ScheduleCallback;\n active: boolean;\n /** Timestamp when the loop was marked for removal (for grace period during HMR) */\n pendingRemoval?: number;\n};\n\nlet schedulerInstance: Scheduler | undefined;\nlet audioContextInstance: AudioContextType | undefined;\n\nexport class Scheduler {\n private context: AudioContextType;\n private _bpm: number;\n private startTime: number;\n private events: Map<string, ScheduledEvent> = new Map();\n private timerID: ReturnType<typeof setInterval> | null = null;\n private running = false;\n\n private readonly lookahead = 0.1;\n private readonly scheduleInterval = 25;\n /** Grace period before actually removing a loop - allows React HMR to re-add it */\n private readonly removalGracePeriod = 100;\n\n constructor(bpm: number) {\n if (!audioContextInstance) {\n audioContextInstance = new AudioContext();\n }\n this.context = audioContextInstance;\n this._bpm = bpm;\n this.startTime = this.context.currentTime;\n }\n\n // --- Public API ---\n\n get audioContext(): AudioContextType {\n return this.context;\n }\n\n get bpm(): number {\n return this._bpm;\n }\n\n set bpm(value: number) {\n this._bpm = value;\n }\n\n start(): void {\n if (this.running) return;\n\n this.startTime = this.context.currentTime;\n this.running = true;\n\n for (const event of this.events.values()) {\n if (event.intervalBeats > 0) {\n event.nextBeatTime = 0;\n event.active = true;\n }\n }\n\n this.timerID = setInterval(() => this.schedule(), this.scheduleInterval);\n }\n\n stop(): void {\n if (this.timerID) {\n clearInterval(this.timerID);\n this.timerID = null;\n }\n this.running = false;\n console.debug(\"[scheduler] stopped\");\n }\n\n clear(): void {\n this.events.clear();\n }\n\n addLoop(\n id: string,\n intervalBeats: number,\n callback: ScheduleCallback,\n startBeat?: number,\n ): void {\n const existing = this.events.get(id);\n\n // HMR optimization: if loop exists (even if pending removal), update in-place\n // This preserves timing across hot reloads\n if (existing && existing.intervalBeats === intervalBeats) {\n existing.callback = callback;\n existing.active = true;\n existing.pendingRemoval = undefined; // Cancel pending removal\n // console.debug(`[scheduler] loop \"${id}\" updated (HMR)`);\n return;\n }\n\n const currentBeat = this.getCurrentBeat();\n let nextBeat: number;\n\n if (startBeat !== undefined) {\n nextBeat = startBeat;\n } else {\n nextBeat = Math.ceil(currentBeat / intervalBeats) * intervalBeats;\n if (nextBeat <= currentBeat) {\n nextBeat += intervalBeats;\n }\n }\n\n this.events.delete(id);\n this.events.set(id, {\n id,\n nextBeatTime: nextBeat,\n intervalBeats,\n callback,\n active: true,\n });\n\n console.debug(\n `[scheduler] loop \"${id}\" added, interval=${intervalBeats} beats, start=${\n nextBeat.toFixed(2)\n }`,\n );\n }\n\n remove(id: string): void {\n const event = this.events.get(id);\n if (event) {\n // Don't remove immediately - mark for removal with grace period\n // This allows React's HMR unmount/remount cycle to re-add the loop\n // and preserve its timing\n event.pendingRemoval = Date.now();\n }\n }\n\n beatsToSeconds(beats: number): number {\n return (beats * 60) / this._bpm;\n }\n\n // --- Private ---\n\n private secondsToBeats(seconds: number): number {\n return (seconds * this._bpm) / 60;\n }\n\n private getCurrentBeat(): number {\n const elapsed = this.context.currentTime - this.startTime;\n return this.secondsToBeats(elapsed);\n }\n\n private beatToAudioTime(beatTime: number): number {\n return this.startTime + this.beatsToSeconds(beatTime);\n }\n\n private schedule(): void {\n const currentAudioTime = this.context.currentTime;\n const currentBeat = this.getCurrentBeat();\n const scheduleUntilBeat = currentBeat + this.secondsToBeats(this.lookahead);\n const now = Date.now();\n\n for (const event of this.events.values()) {\n // Skip events pending removal\n if (event.pendingRemoval !== undefined) continue;\n if (!event.active) continue;\n\n while (event.nextBeatTime < scheduleUntilBeat) {\n const audioTime = this.beatToAudioTime(event.nextBeatTime);\n\n if (audioTime >= currentAudioTime) {\n event.callback(audioTime, event.nextBeatTime);\n }\n\n if (event.intervalBeats > 0) {\n event.nextBeatTime += event.intervalBeats;\n } else {\n event.active = false;\n break;\n }\n }\n }\n\n // Clean up events\n for (const [id, event] of this.events) {\n if (!event.active && event.intervalBeats === 0) {\n this.events.delete(id);\n } else if (\n event.pendingRemoval !== undefined &&\n now - event.pendingRemoval > this.removalGracePeriod\n ) {\n this.events.delete(id);\n console.debug(`[scheduler] loop \"${id}\" removed`);\n }\n }\n }\n}\n\nexport function getScheduler(bpm: number): Scheduler {\n if (!schedulerInstance) {\n schedulerInstance = new Scheduler(bpm);\n } else {\n schedulerInstance.bpm = bpm;\n }\n return schedulerInstance;\n}\n\nexport function resetScheduler(bpm: number): Scheduler {\n if (schedulerInstance) {\n schedulerInstance.stop();\n schedulerInstance.clear();\n }\n schedulerInstance = new Scheduler(bpm);\n return schedulerInstance;\n}\n","import {\n type Context,\n createContext,\n type ReactNode,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport {\n getScheduler,\n type ScheduleCallback,\n type Scheduler,\n} from \"../audio/scheduler\";\nimport type { AudioContext as AudioContextType } from \"node-web-audio-api\";\n\nexport type ScheduleNoteContextValue = {\n /**\n * Schedule a note to be played.\n * @param id - Unique identifier for this note callback\n * @param callback - The audio callback to invoke at the scheduled time\n * @param stepIndex - Optional step index when inside a Sequence\n */\n scheduleNote: (\n id: string,\n callback: ScheduleCallback,\n stepIndex?: number,\n ) => void;\n\n /**\n * Unschedule a previously scheduled note.\n * @param id - The identifier used when scheduling\n */\n unscheduleNote: (id: string) => void;\n};\n\nexport const ScheduleNoteContext: Context<ScheduleNoteContextValue | null> =\n createContext<ScheduleNoteContextValue | null>(null);\n\ntype TrackContextValue = {\n audioContext: AudioContextType;\n scheduler: Scheduler;\n};\n\nconst TrackContext = createContext<TrackContextValue | null>(null);\n\ntype TrackProps = {\n bpm: number;\n children: ReactNode;\n};\n\n/**\n * Track component - wraps your song and provides timing context\n *\n * @example\n * <Track bpm={120}>\n * <Loop id=\"drums\" interval={1}>\n * <Note note=\"C4\" />\n * </Loop>\n * </Track>\n */\nexport function Track({ bpm, children }: TrackProps): ReactNode {\n const scheduler = useRef<Scheduler>(getScheduler(bpm));\n const audioContext = scheduler.current.audioContext;\n\n useEffect(() => {\n scheduler.current.start();\n }, [scheduler]);\n\n // Default scheduling: immediate playback (for standalone Notes)\n const scheduleContextValue: ScheduleNoteContextValue = useMemo(\n () => ({\n scheduleNote: (_id, callback) => {\n const now = audioContext.currentTime + 0.005;\n callback(now, 0);\n },\n unscheduleNote: () => {\n // Nothing to clean up for one-shot playback\n },\n }),\n [audioContext],\n );\n\n return (\n <TrackContext.Provider\n value={{\n audioContext,\n scheduler: scheduler.current,\n }}\n >\n <ScheduleNoteContext.Provider value={scheduleContextValue}>\n {children}\n </ScheduleNoteContext.Provider>\n </TrackContext.Provider>\n );\n}\n\nexport function useTrack(): TrackContextValue {\n const ctx = useContext(TrackContext);\n if (!ctx) {\n throw new Error(\"useTrack must be used inside a <Track> component\");\n }\n return ctx;\n}\n\nexport function useScheduleNote(): ScheduleNoteContextValue {\n const ctx = useContext(ScheduleNoteContext);\n if (!ctx) {\n throw new Error(\"useScheduleNote must be used inside a <Track> component\");\n }\n\n return ctx;\n}\n","import { type ReactNode, useEffect, useMemo, useRef } from \"react\";\nimport {\n ScheduleNoteContext,\n type ScheduleNoteContextValue,\n useTrack,\n} from \"./Track\";\nimport type { ScheduleCallback } from \"../audio/scheduler\";\n\ntype LoopProps = {\n /** Unique identifier for this loop */\n id: string;\n /** Interval in beats between each loop iteration */\n interval: number;\n /** Content to play on each loop */\n children: ReactNode;\n};\n\n/**\n * Loop component - plays its children repeatedly at the specified interval\n *\n * Children should use the useLoop() hook to register their audio callbacks,\n * which will be called with precise timing by the scheduler.\n *\n * @example\n * <Loop id=\"kick\" interval={1}>\n * <Note note=\"C2\" />\n * </Loop>\n */\nexport function Loop({\n id,\n interval,\n children,\n}: LoopProps): ReactNode {\n const { scheduler } = useTrack();\n const callbacksRef = useRef<Map<string, ScheduleCallback>>(new Map());\n\n useEffect(() => {\n const loopId = id;\n const callbacks = callbacksRef.current;\n\n const runAllCallbacks: ScheduleCallback = (audioTime, beatTime) => {\n for (const callback of callbacks.values()) {\n callback(audioTime, beatTime);\n }\n };\n\n scheduler.addLoop(loopId, interval, runAllCallbacks);\n\n return () => {\n scheduler.remove(loopId);\n };\n }, [id, interval, scheduler]);\n\n const scheduleContextValue: ScheduleNoteContextValue = useMemo(\n () => ({\n scheduleNote: (noteId, callback) => {\n callbacksRef.current.set(noteId, callback);\n },\n unscheduleNote: (noteId) => {\n callbacksRef.current.delete(noteId);\n },\n }),\n [],\n );\n\n return (\n <ScheduleNoteContext.Provider value={scheduleContextValue}>\n {children}\n </ScheduleNoteContext.Provider>\n );\n}\n","export type ADSRProps = {\n /** Attack time in beats - time from silence to attack_level (default: 0) */\n attack?: number;\n /** Peak amplitude at end of attack, multiplied by amp (default: 1) */\n attack_level?: number;\n /** Decay time in beats - time from attack_level to decay_level (default: 0) */\n decay?: number;\n /** Amplitude at end of decay, multiplied by amp (default: sustain_level) */\n decay_level?: number;\n /** Sustain time in beats - time at sustain_level (default: 0) */\n sustain?: number;\n /** Sustained amplitude level, multiplied by amp (default: 1) */\n sustain_level?: number;\n /** Release time in beats - time from sustain_level to silence (default: 1) */\n release?: number;\n};\n\nexport const ADSR_DEFAULTS = {\n attack: 0,\n attack_level: 1,\n decay: 0,\n sustain: 0,\n sustain_level: 1,\n release: 1,\n} as const;\n\nexport function applyADSREnvelope(\n gainNode: GainNode,\n audioTime: number,\n props: ADSRProps,\n amp: number,\n beatsToSeconds: (beats: number) => number,\n): number {\n // Extract props with defaults\n const attack = props.attack ?? ADSR_DEFAULTS.attack;\n const attack_level = props.attack_level ?? ADSR_DEFAULTS.attack_level;\n const decay = props.decay ?? ADSR_DEFAULTS.decay;\n const sustain = props.sustain ?? ADSR_DEFAULTS.sustain;\n const sustain_level = props.sustain_level ?? ADSR_DEFAULTS.sustain_level;\n const release = props.release ?? ADSR_DEFAULTS.release;\n const decay_level = props.decay_level ?? sustain_level;\n\n // Convert times from beats to seconds\n const attackSec = beatsToSeconds(attack);\n const decaySec = beatsToSeconds(decay);\n const sustainSec = beatsToSeconds(sustain);\n const releaseSec = beatsToSeconds(release);\n\n // Calculate amplitude values\n const attackAmp = attack_level * amp;\n const decayAmp = decay_level * amp;\n const sustainAmp = sustain_level * amp;\n\n // Calculate envelope time points\n const attackEnd = audioTime + attackSec;\n const decayEnd = attackEnd + decaySec;\n const sustainEnd = decayEnd + sustainSec;\n const releaseEnd = sustainEnd + releaseSec;\n\n // Start at silence\n gainNode.gain.setValueAtTime(0.001, audioTime);\n\n // Attack: ramp to attack_level\n if (attackSec > 0) {\n gainNode.gain.linearRampToValueAtTime(attackAmp, attackEnd);\n } else {\n gainNode.gain.setValueAtTime(attackAmp, audioTime);\n }\n\n // Decay: ramp to decay_level\n if (decaySec > 0) {\n gainNode.gain.linearRampToValueAtTime(decayAmp, decayEnd);\n } else {\n gainNode.gain.setValueAtTime(decayAmp, attackEnd);\n }\n\n // Sustain: ramp to sustain_level and hold\n if (sustainSec > 0) {\n gainNode.gain.linearRampToValueAtTime(sustainAmp, decayEnd + 0.001);\n gainNode.gain.setValueAtTime(sustainAmp, sustainEnd);\n } else {\n gainNode.gain.setValueAtTime(sustainAmp, decayEnd);\n }\n\n // Release: ramp to silence\n gainNode.gain.exponentialRampToValueAtTime(0.001, releaseEnd);\n\n return releaseEnd;\n}\n","// index.ts\nfunction isNamedPitch(src) {\n return src !== null && typeof src === \"object\" && \"name\" in src && typeof src.name === \"string\" ? true : false;\n}\nvar SIZES = [0, 2, 4, 5, 7, 9, 11];\nvar chroma = ({ step, alt }) => (SIZES[step] + alt + 120) % 12;\nvar height = ({ step, alt, oct, dir = 1 }) => dir * (SIZES[step] + alt + 12 * (oct === void 0 ? -100 : oct));\nvar midi = (pitch2) => {\n const h = height(pitch2);\n return pitch2.oct !== void 0 && h >= -12 && h <= 115 ? h + 12 : null;\n};\nfunction isPitch(pitch2) {\n return pitch2 !== null && typeof pitch2 === \"object\" && \"step\" in pitch2 && typeof pitch2.step === \"number\" && \"alt\" in pitch2 && typeof pitch2.alt === \"number\" && !isNaN(pitch2.step) && !isNaN(pitch2.alt) ? true : false;\n}\nvar FIFTHS = [0, 2, 4, -1, 1, 3, 5];\nvar STEPS_TO_OCTS = FIFTHS.map(\n (fifths) => Math.floor(fifths * 7 / 12)\n);\nfunction coordinates(pitch2) {\n const { step, alt, oct, dir = 1 } = pitch2;\n const f = FIFTHS[step] + 7 * alt;\n if (oct === void 0) {\n return [dir * f];\n }\n const o = oct - STEPS_TO_OCTS[step] - 4 * alt;\n return [dir * f, dir * o];\n}\nvar FIFTHS_TO_STEPS = [3, 0, 4, 1, 5, 2, 6];\nfunction pitch(coord) {\n const [f, o, dir] = coord;\n const step = FIFTHS_TO_STEPS[unaltered(f)];\n const alt = Math.floor((f + 1) / 7);\n if (o === void 0) {\n return { step, alt, dir };\n }\n const oct = o + 4 * alt + STEPS_TO_OCTS[step];\n return { step, alt, oct, dir };\n}\nfunction unaltered(f) {\n const i = (f + 1) % 7;\n return i < 0 ? 7 + i : i;\n}\nexport {\n chroma,\n coordinates,\n height,\n isNamedPitch,\n isPitch,\n midi,\n pitch\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport {\n coordinates,\n isNamedPitch,\n isPitch,\n pitch\n} from \"@tonaljs/pitch\";\nvar fillStr = (s, n) => Array(Math.abs(n) + 1).join(s);\nvar NoInterval = Object.freeze({\n empty: true,\n name: \"\",\n num: NaN,\n q: \"\",\n type: \"\",\n step: NaN,\n alt: NaN,\n dir: NaN,\n simple: NaN,\n semitones: NaN,\n chroma: NaN,\n coord: [],\n oct: NaN\n});\nvar INTERVAL_TONAL_REGEX = \"([-+]?\\\\d+)(d{1,4}|m|M|P|A{1,4})\";\nvar INTERVAL_SHORTHAND_REGEX = \"(AA|A|P|M|m|d|dd)([-+]?\\\\d+)\";\nvar REGEX = new RegExp(\n \"^\" + INTERVAL_TONAL_REGEX + \"|\" + INTERVAL_SHORTHAND_REGEX + \"$\"\n);\nfunction tokenizeInterval(str) {\n const m = REGEX.exec(`${str}`);\n if (m === null) {\n return [\"\", \"\"];\n }\n return m[1] ? [m[1], m[2]] : [m[4], m[3]];\n}\nvar cache = {};\nfunction interval(src) {\n return typeof src === \"string\" ? cache[src] || (cache[src] = parse(src)) : isPitch(src) ? interval(pitchName(src)) : isNamedPitch(src) ? interval(src.name) : NoInterval;\n}\nvar SIZES = [0, 2, 4, 5, 7, 9, 11];\nvar TYPES = \"PMMPPMM\";\nfunction parse(str) {\n const tokens = tokenizeInterval(str);\n if (tokens[0] === \"\") {\n return NoInterval;\n }\n const num = +tokens[0];\n const q = tokens[1];\n const step = (Math.abs(num) - 1) % 7;\n const t = TYPES[step];\n if (t === \"M\" && q === \"P\") {\n return NoInterval;\n }\n const type = t === \"M\" ? \"majorable\" : \"perfectable\";\n const name = \"\" + num + q;\n const dir = num < 0 ? -1 : 1;\n const simple = num === 8 || num === -8 ? num : dir * (step + 1);\n const alt = qToAlt(type, q);\n const oct = Math.floor((Math.abs(num) - 1) / 7);\n const semitones = dir * (SIZES[step] + alt + 12 * oct);\n const chroma = (dir * (SIZES[step] + alt) % 12 + 12) % 12;\n const coord = coordinates({ step, alt, oct, dir });\n return {\n empty: false,\n name,\n num,\n q,\n step,\n alt,\n dir,\n type,\n simple,\n semitones,\n chroma,\n coord,\n oct\n };\n}\nfunction coordToInterval(coord, forceDescending) {\n const [f, o = 0] = coord;\n const isDescending = f * 7 + o * 12 < 0;\n const ivl = forceDescending || isDescending ? [-f, -o, -1] : [f, o, 1];\n return interval(pitch(ivl));\n}\nfunction qToAlt(type, q) {\n return q === \"M\" && type === \"majorable\" || q === \"P\" && type === \"perfectable\" ? 0 : q === \"m\" && type === \"majorable\" ? -1 : /^A+$/.test(q) ? q.length : /^d+$/.test(q) ? -1 * (type === \"perfectable\" ? q.length : q.length + 1) : 0;\n}\nfunction pitchName(props) {\n const { step, alt, oct = 0, dir } = props;\n if (!dir) {\n return \"\";\n }\n const calcNum = step + 1 + 7 * oct;\n const num = calcNum === 0 ? step + 1 : calcNum;\n const d = dir < 0 ? \"-\" : \"\";\n const type = TYPES[step] === \"M\" ? \"majorable\" : \"perfectable\";\n const name = d + num + altToQ(type, alt);\n return name;\n}\nfunction altToQ(type, alt) {\n if (alt === 0) {\n return type === \"majorable\" ? \"M\" : \"P\";\n } else if (alt === -1 && type === \"majorable\") {\n return \"m\";\n } else if (alt > 0) {\n return fillStr(\"A\", alt);\n } else {\n return fillStr(\"d\", type === \"perfectable\" ? alt : alt + 1);\n }\n}\nexport {\n coordToInterval,\n interval,\n tokenizeInterval\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport {\n coordinates,\n isNamedPitch,\n isPitch,\n pitch\n} from \"@tonaljs/pitch\";\nvar fillStr = (s, n) => Array(Math.abs(n) + 1).join(s);\nvar NoNote = Object.freeze({\n empty: true,\n name: \"\",\n letter: \"\",\n acc: \"\",\n pc: \"\",\n step: NaN,\n alt: NaN,\n chroma: NaN,\n height: NaN,\n coord: [],\n midi: null,\n freq: null\n});\nvar cache = /* @__PURE__ */ new Map();\nvar stepToLetter = (step) => \"CDEFGAB\".charAt(step);\nvar altToAcc = (alt) => alt < 0 ? fillStr(\"b\", -alt) : fillStr(\"#\", alt);\nvar accToAlt = (acc) => acc[0] === \"b\" ? -acc.length : acc.length;\nfunction note(src) {\n const stringSrc = JSON.stringify(src);\n const cached = cache.get(stringSrc);\n if (cached) {\n return cached;\n }\n const value = typeof src === \"string\" ? parse(src) : isPitch(src) ? note(pitchName(src)) : isNamedPitch(src) ? note(src.name) : NoNote;\n cache.set(stringSrc, value);\n return value;\n}\nvar REGEX = /^([a-gA-G]?)(#{1,}|b{1,}|x{1,}|)(-?\\d*)\\s*(.*)$/;\nfunction tokenizeNote(str) {\n const m = REGEX.exec(str);\n return m ? [m[1].toUpperCase(), m[2].replace(/x/g, \"##\"), m[3], m[4]] : [\"\", \"\", \"\", \"\"];\n}\nfunction coordToNote(noteCoord) {\n return note(pitch(noteCoord));\n}\nvar mod = (n, m) => (n % m + m) % m;\nvar SEMI = [0, 2, 4, 5, 7, 9, 11];\nfunction parse(noteName) {\n const tokens = tokenizeNote(noteName);\n if (tokens[0] === \"\" || tokens[3] !== \"\") {\n return NoNote;\n }\n const letter = tokens[0];\n const acc = tokens[1];\n const octStr = tokens[2];\n const step = (letter.charCodeAt(0) + 3) % 7;\n const alt = accToAlt(acc);\n const oct = octStr.length ? +octStr : void 0;\n const coord = coordinates({ step, alt, oct });\n const name = letter + acc + octStr;\n const pc = letter + acc;\n const chroma = (SEMI[step] + alt + 120) % 12;\n const height = oct === void 0 ? mod(SEMI[step] + alt, 12) - 12 * 99 : SEMI[step] + alt + 12 * (oct + 1);\n const midi = height >= 0 && height <= 127 ? height : null;\n const freq = oct === void 0 ? null : Math.pow(2, (height - 69) / 12) * 440;\n return {\n empty: false,\n acc,\n alt,\n chroma,\n coord,\n freq,\n height,\n letter,\n midi,\n name,\n oct,\n pc,\n step\n };\n}\nfunction pitchName(props) {\n const { step, alt, oct } = props;\n const letter = stepToLetter(step);\n if (!letter) {\n return \"\";\n }\n const pc = letter + altToAcc(alt);\n return oct || oct === 0 ? pc + oct : pc;\n}\nexport {\n accToAlt,\n altToAcc,\n coordToNote,\n note,\n stepToLetter,\n tokenizeNote\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport {\n interval as asInterval,\n coordToInterval\n} from \"@tonaljs/pitch-interval\";\nimport {\n note as asNote,\n coordToNote\n} from \"@tonaljs/pitch-note\";\nfunction transpose(noteName, intervalName) {\n const note = asNote(noteName);\n const intervalCoord = Array.isArray(intervalName) ? intervalName : asInterval(intervalName).coord;\n if (note.empty || !intervalCoord || intervalCoord.length < 2) {\n return \"\";\n }\n const noteCoord = note.coord;\n const tr = noteCoord.length === 1 ? [noteCoord[0] + intervalCoord[0]] : [noteCoord[0] + intervalCoord[0], noteCoord[1] + intervalCoord[1]];\n return coordToNote(tr).name;\n}\nfunction tonicIntervalsTransposer(intervals, tonic) {\n const len = intervals.length;\n return (normalized) => {\n if (!tonic) return \"\";\n const index = normalized < 0 ? (len - -normalized % len) % len : normalized % len;\n const octaves = Math.floor(normalized / len);\n const root = transpose(tonic, [0, octaves]);\n return transpose(root, intervals[index]);\n };\n}\nfunction distance(fromNote, toNote) {\n const from = asNote(fromNote);\n const to = asNote(toNote);\n if (from.empty || to.empty) {\n return \"\";\n }\n const fcoord = from.coord;\n const tcoord = to.coord;\n const fifths = tcoord[0] - fcoord[0];\n const octs = fcoord.length === 2 && tcoord.length === 2 ? tcoord[1] - fcoord[1] : -Math.floor(fifths * 7 / 12);\n const forceDescending = to.height === from.height && to.midi !== null && from.oct === to.oct && from.step > to.step;\n return coordToInterval([fifths, octs], forceDescending).name;\n}\nexport {\n distance,\n tonicIntervalsTransposer,\n transpose\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nfunction ascR(b, n) {\n const a = [];\n for (; n--; a[n] = n + b) ;\n return a;\n}\nfunction descR(b, n) {\n const a = [];\n for (; n--; a[n] = b - n) ;\n return a;\n}\nfunction range(from, to) {\n return from < to ? ascR(from, to - from + 1) : descR(from, from - to + 1);\n}\nfunction rotate(times, arr) {\n const len = arr.length;\n const n = (times % len + len) % len;\n return arr.slice(n, len).concat(arr.slice(0, n));\n}\nfunction compact(arr) {\n return arr.filter((n) => n === 0 || n);\n}\nfunction shuffle(arr, rnd = Math.random) {\n let i;\n let t;\n let m = arr.length;\n while (m) {\n i = Math.floor(rnd() * m--);\n t = arr[m];\n arr[m] = arr[i];\n arr[i] = t;\n }\n return arr;\n}\nfunction permutations(arr) {\n if (arr.length === 0) {\n return [[]];\n }\n return permutations(arr.slice(1)).reduce((acc, perm) => {\n return acc.concat(\n arr.map((e, pos) => {\n const newPerm = perm.slice();\n newPerm.splice(pos, 0, arr[0]);\n return newPerm;\n })\n );\n }, []);\n}\nvar collection_default = {\n compact,\n permutations,\n range,\n rotate,\n shuffle\n};\nexport {\n compact,\n collection_default as default,\n permutations,\n range,\n rotate,\n shuffle\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport { compact, range, rotate } from \"@tonaljs/collection\";\nimport { transpose } from \"@tonaljs/pitch-distance\";\nimport { interval } from \"@tonaljs/pitch-interval\";\nimport { note } from \"@tonaljs/pitch-note\";\nvar EmptyPcset = {\n empty: true,\n name: \"\",\n setNum: 0,\n chroma: \"000000000000\",\n normalized: \"000000000000\",\n intervals: []\n};\nvar setNumToChroma = (num2) => Number(num2).toString(2).padStart(12, \"0\");\nvar chromaToNumber = (chroma2) => parseInt(chroma2, 2);\nvar REGEX = /^[01]{12}$/;\nfunction isChroma(set) {\n return REGEX.test(set);\n}\nvar isPcsetNum = (set) => typeof set === \"number\" && set >= 0 && set <= 4095;\nvar isPcset = (set) => set && isChroma(set.chroma);\nvar cache = { [EmptyPcset.chroma]: EmptyPcset };\nfunction get(src) {\n const chroma2 = isChroma(src) ? src : isPcsetNum(src) ? setNumToChroma(src) : Array.isArray(src) ? listToChroma(src) : isPcset(src) ? src.chroma : EmptyPcset.chroma;\n return cache[chroma2] = cache[chroma2] || chromaToPcset(chroma2);\n}\nvar pcset = get;\nvar chroma = (set) => get(set).chroma;\nvar intervals = (set) => get(set).intervals;\nvar num = (set) => get(set).setNum;\nvar IVLS = [\n \"1P\",\n \"2m\",\n \"2M\",\n \"3m\",\n \"3M\",\n \"4P\",\n \"5d\",\n \"5P\",\n \"6m\",\n \"6M\",\n \"7m\",\n \"7M\"\n];\nfunction chromaToIntervals(chroma2) {\n const intervals2 = [];\n for (let i = 0; i < 12; i++) {\n if (chroma2.charAt(i) === \"1\") intervals2.push(IVLS[i]);\n }\n return intervals2;\n}\nfunction notes(set) {\n return get(set).intervals.map((ivl) => transpose(\"C\", ivl));\n}\nfunction chromas() {\n return range(2048, 4095).map(setNumToChroma);\n}\nfunction modes(set, normalize = true) {\n const pcs = get(set);\n const binary = pcs.chroma.split(\"\");\n return compact(\n binary.map((_, i) => {\n const r = rotate(i, binary);\n return normalize && r[0] === \"0\" ? null : r.join(\"\");\n })\n );\n}\nfunction isEqual(s1, s2) {\n return get(s1).setNum === get(s2).setNum;\n}\nfunction isSubsetOf(set) {\n const s = get(set).setNum;\n return (notes2) => {\n const o = get(notes2).setNum;\n return s && s !== o && (o & s) === o;\n };\n}\nfunction isSupersetOf(set) {\n const s = get(set).setNum;\n return (notes2) => {\n const o = get(notes2).setNum;\n return s && s !== o && (o | s) === o;\n };\n}\nfunction isNoteIncludedIn(set) {\n const s = get(set);\n return (noteName) => {\n const n = note(noteName);\n return s && !n.empty && s.chroma.charAt(n.chroma) === \"1\";\n };\n}\nvar includes = isNoteIncludedIn;\nfunction filter(set) {\n const isIncluded = isNoteIncludedIn(set);\n return (notes2) => {\n return notes2.filter(isIncluded);\n };\n}\nvar pcset_default = {\n get,\n chroma,\n num,\n intervals,\n chromas,\n isSupersetOf,\n isSubsetOf,\n isNoteIncludedIn,\n isEqual,\n filter,\n modes,\n notes,\n // deprecated\n pcset\n};\nfunction chromaRotations(chroma2) {\n const binary = chroma2.split(\"\");\n return binary.map((_, i) => rotate(i, binary).join(\"\"));\n}\nfunction chromaToPcset(chroma2) {\n const setNum = chromaToNumber(chroma2);\n const normalizedNum = chromaRotations(chroma2).map(chromaToNumber).filter((n) => n >= 2048).sort()[0];\n const normalized = setNumToChroma(normalizedNum);\n const intervals2 = chromaToIntervals(chroma2);\n return {\n empty: false,\n name: \"\",\n setNum,\n chroma: chroma2,\n normalized,\n intervals: intervals2\n };\n}\nfunction listToChroma(set) {\n if (set.length === 0) {\n return EmptyPcset.chroma;\n }\n let pitch;\n const binary = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n for (let i = 0; i < set.length; i++) {\n pitch = note(set[i]);\n if (pitch.empty) pitch = interval(set[i]);\n if (!pitch.empty) binary[pitch.chroma] = 1;\n }\n return binary.join(\"\");\n}\nexport {\n EmptyPcset,\n chroma,\n chromas,\n pcset_default as default,\n filter,\n get,\n includes,\n intervals,\n isChroma,\n isEqual,\n isNoteIncludedIn,\n isSubsetOf,\n isSupersetOf,\n modes,\n notes,\n num,\n pcset\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport {\n EmptyPcset,\n get as pcset\n} from \"@tonaljs/pcset\";\n\n// data.ts\nvar CHORDS = [\n // ==Major==\n [\"1P 3M 5P\", \"major\", \"M ^ maj\"],\n [\"1P 3M 5P 7M\", \"major seventh\", \"maj7 \\u0394 ma7 M7 Maj7 ^7\"],\n [\"1P 3M 5P 7M 9M\", \"major ninth\", \"maj9 \\u03949 ^9\"],\n [\"1P 3M 5P 7M 9M 13M\", \"major thirteenth\", \"maj13 Maj13 ^13\"],\n [\"1P 3M 5P 6M\", \"sixth\", \"6 add6 add13 M6\"],\n [\"1P 3M 5P 6M 9M\", \"sixth added ninth\", \"6add9 6/9 69 M69\"],\n [\"1P 3M 6m 7M\", \"major seventh flat sixth\", \"M7b6 ^7b6\"],\n [\n \"1P 3M 5P 7M 11A\",\n \"major seventh sharp eleventh\",\n \"maj#4 \\u0394#4 \\u0394#11 M7#11 ^7#11 maj7#11\"\n ],\n // ==Minor==\n // '''Normal'''\n [\"1P 3m 5P\", \"minor\", \"m min -\"],\n [\"1P 3m 5P 7m\", \"minor seventh\", \"m7 min7 mi7 -7\"],\n [\n \"1P 3m 5P 7M\",\n \"minor/major seventh\",\n \"m/ma7 m/maj7 mM7 mMaj7 m/M7 -\\u03947 m\\u0394 -^7 -maj7\"\n ],\n [\"1P 3m 5P 6M\", \"minor sixth\", \"m6 -6\"],\n [\"1P 3m 5P 7m 9M\", \"minor ninth\", \"m9 -9\"],\n [\"1P 3m 5P 7M 9M\", \"minor/major ninth\", \"mM9 mMaj9 -^9\"],\n [\"1P 3m 5P 7m 9M 11P\", \"minor eleventh\", \"m11 -11\"],\n [\"1P 3m 5P 7m 9M 13M\", \"minor thirteenth\", \"m13 -13\"],\n // '''Diminished'''\n [\"1P 3m 5d\", \"diminished\", \"dim \\xB0 o\"],\n [\"1P 3m 5d 7d\", \"diminished seventh\", \"dim7 \\xB07 o7\"],\n [\"1P 3m 5d 7m\", \"half-diminished\", \"m7b5 \\xF8 -7b5 h7 h\"],\n // ==Dominant/Seventh==\n // '''Normal'''\n [\"1P 3M 5P 7m\", \"dominant seventh\", \"7 dom\"],\n [\"1P 3M 5P 7m 9M\", \"dominant ninth\", \"9\"],\n [\"1P 3M 5P 7m 9M 13M\", \"dominant thirteenth\", \"13\"],\n [\"1P 3M 5P 7m 11A\", \"lydian dominant seventh\", \"7#11 7#4\"],\n // '''Altered'''\n [\"1P 3M 5P 7m 9m\", \"dominant flat ninth\", \"7b9\"],\n [\"1P 3M 5P 7m 9A\", \"dominant sharp ninth\", \"7#9\"],\n [\"1P 3M 7m 9m\", \"altered\", \"alt7\"],\n // '''Suspended'''\n [\"1P 4P 5P\", \"suspended fourth\", \"sus4 sus\"],\n [\"1P 2M 5P\", \"suspended second\", \"sus2\"],\n [\"1P 4P 5P 7m\", \"suspended fourth seventh\", \"7sus4 7sus\"],\n [\"1P 5P 7m 9M 11P\", \"eleventh\", \"11\"],\n [\n \"1P 4P 5P 7m 9m\",\n \"suspended fourth flat ninth\",\n \"b9sus phryg 7b9sus 7b9sus4\"\n ],\n // ==Other==\n [\"1P 5P\", \"fifth\", \"5\"],\n [\"1P 3M 5A\", \"augmented\", \"aug + +5 ^#5\"],\n [\"1P 3m 5A\", \"minor augmented\", \"m#5 -#5 m+\"],\n [\"1P 3M 5A 7M\", \"augmented seventh\", \"maj7#5 maj7+5 +maj7 ^7#5\"],\n [\n \"1P 3M 5P 7M 9M 11A\",\n \"major sharp eleventh (lydian)\",\n \"maj9#11 \\u03949#11 ^9#11\"\n ],\n // ==Legacy==\n [\"1P 2M 4P 5P\", \"\", \"sus24 sus4add9\"],\n [\"1P 3M 5A 7M 9M\", \"\", \"maj9#5 Maj9#5\"],\n [\"1P 3M 5A 7m\", \"\", \"7#5 +7 7+ 7aug aug7\"],\n [\"1P 3M 5A 7m 9A\", \"\", \"7#5#9 7#9#5 7alt\"],\n [\"1P 3M 5A 7m 9M\", \"\", \"9#5 9+\"],\n [\"1P 3M 5A 7m 9M 11A\", \"\", \"9#5#11\"],\n [\"1P 3M 5A 7m 9m\", \"\", \"7#5b9 7b9#5\"],\n [\"1P 3M 5A 7m 9m 11A\", \"\", \"7#5b9#11\"],\n [\"1P 3M 5A 9A\", \"\", \"+add#9\"],\n [\"1P 3M 5A 9M\", \"\", \"M#5add9 +add9\"],\n [\"1P 3M 5P 6M 11A\", \"\", \"M6#11 M6b5 6#11 6b5\"],\n [\"1P 3M 5P 6M 7M 9M\", \"\", \"M7add13\"],\n [\"1P 3M 5P 6M 9M 11A\", \"\", \"69#11\"],\n [\"1P 3m 5P 6M 9M\", \"\", \"m69 -69\"],\n [\"1P 3M 5P 6m 7m\", \"\", \"7b6\"],\n [\"1P 3M 5P 7M 9A 11A\", \"\", \"maj7#9#11\"],\n [\"1P 3M 5P 7M 9M 11A 13M\", \"\", \"M13#11 maj13#11 M13+4 M13#4\"],\n [\"1P 3M 5P 7M 9m\", \"\", \"M7b9\"],\n [\"1P 3M 5P 7m 11A 13m\", \"\", \"7#11b13 7b5b13\"],\n [\"1P 3M 5P 7m 13M\", \"\", \"7add6 67 7add13\"],\n [\"1P 3M 5P 7m 9A 11A\", \"\", \"7#9#11 7b5#9 7#9b5\"],\n [\"1P 3M 5P 7m 9A 11A 13M\", \"\", \"13#9#11\"],\n [\"1P 3M 5P 7m 9A 11A 13m\", \"\", \"7#9#11b13\"],\n [\"1P 3M 5P 7m 9A 13M\", \"\", \"13#9\"],\n [\"1P 3M 5P 7m 9A 13m\", \"\", \"7#9b13\"],\n [\"1P 3M 5P 7m 9M 11A\", \"\", \"9#11 9+4 9#4\"],\n [\"1P 3M 5P 7m 9M 11A 13M\", \"\", \"13#11 13+4 13#4\"],\n [\"1P 3M 5P 7m 9M 11A 13m\", \"\", \"9#11b13 9b5b13\"],\n [\"1P 3M 5P 7m 9m 11A\", \"\", \"7b9#11 7b5b9 7b9b5\"],\n [\"1P 3M 5P 7m 9m 11A 13M\", \"\", \"13b9#11\"],\n [\"1P 3M 5P 7m 9m 11A 13m\", \"\", \"7b9b13#11 7b9#11b13 7b5b9b13\"],\n [\"1P 3M 5P 7m 9m 13M\", \"\", \"13b9\"],\n [\"1P 3M 5P 7m 9m 13m\", \"\", \"7b9b13\"],\n [\"1P 3M 5P 7m 9m 9A\", \"\", \"7b9#9\"],\n [\"1P 3M 5P 9M\", \"\", \"Madd9 2 add9 add2\"],\n [\"1P 3M 5P 9m\", \"\", \"Maddb9\"],\n [\"1P 3M 5d\", \"\", \"Mb5\"],\n [\"1P 3M 5d 6M 7m 9M\", \"\", \"13b5\"],\n [\"1P 3M 5d 7M\", \"\", \"M7b5\"],\n [\"1P 3M 5d 7M 9M\", \"\", \"M9b5\"],\n [\"1P 3M 5d 7m\", \"\", \"7b5\"],\n [\"1P 3M 5d 7m 9M\", \"\", \"9b5\"],\n [\"1P 3M 7m\", \"\", \"7no5\"],\n [\"1P 3M 7m 13m\", \"\", \"7b13\"],\n [\"1P 3M 7m 9M\", \"\", \"9no5\"],\n [\"1P 3M 7m 9M 13M\", \"\", \"13no5\"],\n [\"1P 3M 7m 9M 13m\", \"\", \"9b13\"],\n [\"1P 3m 4P 5P\", \"\", \"madd4\"],\n [\"1P 3m 5P 6m 7M\", \"\", \"mMaj7b6\"],\n [\"1P 3m 5P 6m 7M 9M\", \"\", \"mMaj9b6\"],\n [\"1P 3m 5P 7m 11P\", \"\", \"m7add11 m7add4\"],\n [\"1P 3m 5P 9M\", \"\", \"madd9\"],\n [\"1P 3m 5d 6M 7M\", \"\", \"o7M7\"],\n [\"1P 3m 5d 7M\", \"\", \"oM7\"],\n [\"1P 3m 6m 7M\", \"\", \"mb6M7\"],\n [\"1P 3m 6m 7m\", \"\", \"m7#5\"],\n [\"1P 3m 6m 7m 9M\", \"\", \"m9#5\"],\n [\"1P 3m 5A 7m 9M 11P\", \"\", \"m11A\"],\n [\"1P 3m 6m 9m\", \"\", \"mb6b9\"],\n [\"1P 2M 3m 5d 7m\", \"\", \"m9b5\"],\n [\"1P 4P 5A 7M\", \"\", \"M7#5sus4\"],\n [\"1P 4P 5A 7M 9M\", \"\", \"M9#5sus4\"],\n [\"1P 4P 5A 7m\", \"\", \"7#5sus4\"],\n [\"1P 4P 5P 7M\", \"\", \"M7sus4\"],\n [\"1P 4P 5P 7M 9M\", \"\", \"M9sus4\"],\n [\"1P 4P 5P 7m 9M\", \"\", \"9sus4 9sus\"],\n [\"1P 4P 5P 7m 9M 13M\", \"\", \"13sus4 13sus\"],\n [\"1P 4P 5P 7m 9m 13m\", \"\", \"7sus4b9b13 7b9b13sus4\"],\n [\"1P 4P 7m 10m\", \"\", \"4 quartal\"],\n [\"1P 5P 7m 9m 11P\", \"\", \"11b9\"]\n];\nvar data_default = CHORDS;\n\n// index.ts\nvar NoChordType = {\n ...EmptyPcset,\n name: \"\",\n quality: \"Unknown\",\n intervals: [],\n aliases: []\n};\nvar dictionary = [];\nvar index = {};\nfunction get(type) {\n return index[type] || NoChordType;\n}\nvar chordType = get;\nfunction names() {\n return dictionary.map((chord) => chord.name).filter((x) => x);\n}\nfunction symbols() {\n return dictionary.map((chord) => chord.aliases[0]).filter((x) => x);\n}\nfunction keys() {\n return Object.keys(index);\n}\nfunction all() {\n return dictionary.slice();\n}\nvar entries = all;\nfunction removeAll() {\n dictionary = [];\n index = {};\n}\nfunction add(intervals, aliases, fullName) {\n const quality = getQuality(intervals);\n const chord = {\n ...pcset(intervals),\n name: fullName || \"\",\n quality,\n intervals,\n aliases\n };\n dictionary.push(chord);\n if (chord.name) {\n index[chord.name] = chord;\n }\n index[chord.setNum] = chord;\n index[chord.chroma] = chord;\n chord.aliases.forEach((alias) => addAlias(chord, alias));\n}\nfunction addAlias(chord, alias) {\n index[alias] = chord;\n}\nfunction getQuality(intervals) {\n const has = (interval) => intervals.indexOf(interval) !== -1;\n return has(\"5A\") ? \"Augmented\" : has(\"3M\") ? \"Major\" : has(\"5d\") ? \"Diminished\" : has(\"3m\") ? \"Minor\" : \"Unknown\";\n}\ndata_default.forEach(\n ([ivls, fullName, names2]) => add(ivls.split(\" \"), names2.split(\" \"), fullName)\n);\ndictionary.sort((a, b) => a.setNum - b.setNum);\nvar chord_type_default = {\n names,\n symbols,\n get,\n all,\n add,\n removeAll,\n keys,\n // deprecated\n entries,\n chordType\n};\nexport {\n add,\n addAlias,\n all,\n chordType,\n chord_type_default as default,\n entries,\n get,\n keys,\n names,\n removeAll,\n symbols\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport { distance as dist } from \"@tonaljs/pitch-distance\";\nimport {\n coordToInterval,\n interval as props\n} from \"@tonaljs/pitch-interval\";\nfunction names() {\n return \"1P 2M 3M 4P 5P 6m 7m\".split(\" \");\n}\nvar get = props;\nvar name = (name2) => props(name2).name;\nvar semitones = (name2) => props(name2).semitones;\nvar quality = (name2) => props(name2).q;\nvar num = (name2) => props(name2).num;\nfunction simplify(name2) {\n const i = props(name2);\n return i.empty ? \"\" : i.simple + i.q;\n}\nfunction invert(name2) {\n const i = props(name2);\n if (i.empty) {\n return \"\";\n }\n const step = (7 - i.step) % 7;\n const alt = i.type === \"perfectable\" ? -i.alt : -(i.alt + 1);\n return props({ step, alt, oct: i.oct, dir: i.dir }).name;\n}\nvar IN = [1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7];\nvar IQ = \"P m M m M P d P m M m M\".split(\" \");\nfunction fromSemitones(semitones2) {\n const d = semitones2 < 0 ? -1 : 1;\n const n = Math.abs(semitones2);\n const c = n % 12;\n const o = Math.floor(n / 12);\n return d * (IN[c] + 7 * o) + IQ[c];\n}\nvar distance = dist;\nvar add = combinator((a, b) => [a[0] + b[0], a[1] + b[1]]);\nvar addTo = (interval) => (other) => add(interval, other);\nvar subtract = combinator((a, b) => [a[0] - b[0], a[1] - b[1]]);\nfunction transposeFifths(interval, fifths) {\n const ivl = get(interval);\n if (ivl.empty) return \"\";\n const [nFifths, nOcts, dir] = ivl.coord;\n return coordToInterval([nFifths + fifths, nOcts, dir]).name;\n}\nvar interval_default = {\n names,\n get,\n name,\n num,\n semitones,\n quality,\n fromSemitones,\n distance,\n invert,\n simplify,\n add,\n addTo,\n subtract,\n transposeFifths\n};\nfunction combinator(fn) {\n return (a, b) => {\n const coordA = props(a).coord;\n const coordB = props(b).coord;\n if (coordA && coordB) {\n const coord = fn(coordA, coordB);\n return coordToInterval(coord).name;\n }\n };\n}\nexport {\n add,\n addTo,\n interval_default as default,\n distance,\n fromSemitones,\n get,\n invert,\n name,\n names,\n num,\n quality,\n semitones,\n simplify,\n subtract,\n transposeFifths\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport {\n EmptyPcset,\n get as pcset\n} from \"@tonaljs/pcset\";\n\n// data.ts\nvar SCALES = [\n // Basic scales\n [\"1P 2M 3M 5P 6M\", \"major pentatonic\", \"pentatonic\"],\n [\"1P 2M 3M 4P 5P 6M 7M\", \"major\", \"ionian\"],\n [\"1P 2M 3m 4P 5P 6m 7m\", \"minor\", \"aeolian\"],\n // Jazz common scales\n [\"1P 2M 3m 3M 5P 6M\", \"major blues\"],\n [\"1P 3m 4P 5d 5P 7m\", \"minor blues\", \"blues\"],\n [\"1P 2M 3m 4P 5P 6M 7M\", \"melodic minor\"],\n [\"1P 2M 3m 4P 5P 6m 7M\", \"harmonic minor\"],\n [\"1P 2M 3M 4P 5P 6M 7m 7M\", \"bebop\"],\n [\"1P 2M 3m 4P 5d 6m 6M 7M\", \"diminished\", \"whole-half diminished\"],\n // Modes\n [\"1P 2M 3m 4P 5P 6M 7m\", \"dorian\"],\n [\"1P 2M 3M 4A 5P 6M 7M\", \"lydian\"],\n [\"1P 2M 3M 4P 5P 6M 7m\", \"mixolydian\", \"dominant\"],\n [\"1P 2m 3m 4P 5P 6m 7m\", \"phrygian\"],\n [\"1P 2m 3m 4P 5d 6m 7m\", \"locrian\"],\n // 5-note scales\n [\"1P 3M 4P 5P 7M\", \"ionian pentatonic\"],\n [\"1P 3M 4P 5P 7m\", \"mixolydian pentatonic\", \"indian\"],\n [\"1P 2M 4P 5P 6M\", \"ritusen\"],\n [\"1P 2M 4P 5P 7m\", \"egyptian\"],\n [\"1P 3M 4P 5d 7m\", \"neopolitan major pentatonic\"],\n [\"1P 3m 4P 5P 6m\", \"vietnamese 1\"],\n [\"1P 2m 3m 5P 6m\", \"pelog\"],\n [\"1P 2m 4P 5P 6m\", \"kumoijoshi\"],\n [\"1P 2M 3m 5P 6m\", \"hirajoshi\"],\n [\"1P 2m 4P 5d 7m\", \"iwato\"],\n [\"1P 2m 4P 5P 7m\", \"in-sen\"],\n [\"1P 3M 4A 5P 7M\", \"lydian pentatonic\", \"chinese\"],\n [\"1P 3m 4P 6m 7m\", \"malkos raga\"],\n [\"1P 3m 4P 5d 7m\", \"locrian pentatonic\", \"minor seven flat five pentatonic\"],\n [\"1P 3m 4P 5P 7m\", \"minor pentatonic\", \"vietnamese 2\"],\n [\"1P 3m 4P 5P 6M\", \"minor six pentatonic\"],\n [\"1P 2M 3m 5P 6M\", \"flat three pentatonic\", \"kumoi\"],\n [\"1P 2M 3M 5P 6m\", \"flat six pentatonic\"],\n [\"1P 2m 3M 5P 6M\", \"scriabin\"],\n [\"1P 3M 5d 6m 7m\", \"whole tone pentatonic\"],\n [\"1P 3M 4A 5A 7M\", \"lydian #5P pentatonic\"],\n [\"1P 3M 4A 5P 7m\", \"lydian dominant pentatonic\"],\n [\"1P 3m 4P 5P 7M\", \"minor #7M pentatonic\"],\n [\"1P 3m 4d 5d 7m\", \"super locrian pentatonic\"],\n // 6-note scales\n [\"1P 2M 3m 4P 5P 7M\", \"minor hexatonic\"],\n [\"1P 2A 3M 5P 5A 7M\", \"augmented\"],\n [\"1P 2M 4P 5P 6M 7m\", \"piongio\"],\n [\"1P 2m 3M 4A 6M 7m\", \"prometheus neopolitan\"],\n [\"1P 2M 3M 4A 6M 7m\", \"prometheus\"],\n [\"1P 2m 3M 5d 6m 7m\", \"mystery #1\"],\n [\"1P 2m 3M 4P 5A 6M\", \"six tone symmetric\"],\n [\"1P 2M 3M 4A 5A 6A\", \"whole tone\", \"messiaen's mode #1\"],\n [\"1P 2m 4P 4A 5P 7M\", \"messiaen's mode #5\"],\n // 7-note scales\n [\"1P 2M 3M 4P 5d 6m 7m\", \"locrian major\", \"arabian\"],\n [\"1P 2m 3M 4A 5P 6m 7M\", \"double harmonic lydian\"],\n [\n \"1P 2m 2A 3M 4A 6m 7m\",\n \"altered\",\n \"super locrian\",\n \"diminished whole tone\",\n \"pomeroy\"\n ],\n [\"1P 2M 3m 4P 5d 6m 7m\", \"locrian #2\", \"half-diminished\", \"aeolian b5\"],\n [\n \"1P 2M 3M 4P 5P 6m 7m\",\n \"mixolydian b6\",\n \"melodic minor fifth mode\",\n \"hindu\"\n ],\n [\"1P 2M 3M 4A 5P 6M 7m\", \"lydian dominant\", \"lydian b7\", \"overtone\"],\n [\"1P 2M 3M 4A 5A 6M 7M\", \"lydian augmented\"],\n [\n \"1P 2m 3m 4P 5P 6M 7m\",\n \"dorian b2\",\n \"phrygian #6\",\n \"melodic minor second mode\"\n ],\n [\n \"1P 2m 3m 4d 5d 6m 7d\",\n \"ultralocrian\",\n \"superlocrian bb7\",\n \"superlocrian diminished\"\n ],\n [\"1P 2m 3m 4P 5d 6M 7m\", \"locrian 6\", \"locrian natural 6\", \"locrian sharp 6\"],\n [\"1P 2A 3M 4P 5P 5A 7M\", \"augmented heptatonic\"],\n // Source https://en.wikipedia.org/wiki/Ukrainian_Dorian_scale\n [\n \"1P 2M 3m 4A 5P 6M 7m\",\n \"dorian #4\",\n \"ukrainian dorian\",\n \"romanian minor\",\n \"altered dorian\"\n ],\n [\"1P 2M 3m 4A 5P 6M 7M\", \"lydian diminished\"],\n [\"1P 2M 3M 4A 5A 7m 7M\", \"leading whole tone\"],\n [\"1P 2M 3M 4A 5P 6m 7m\", \"lydian minor\"],\n [\"1P 2m 3M 4P 5P 6m 7m\", \"phrygian dominant\", \"spanish\", \"phrygian major\"],\n [\"1P 2m 3m 4P 5P 6m 7M\", \"balinese\"],\n [\"1P 2m 3m 4P 5P 6M 7M\", \"neopolitan major\"],\n [\"1P 2M 3M 4P 5P 6m 7M\", \"harmonic major\"],\n [\"1P 2m 3M 4P 5P 6m 7M\", \"double harmonic major\", \"gypsy\"],\n [\"1P 2M 3m 4A 5P 6m 7M\", \"hungarian minor\"],\n [\"1P 2A 3M 4A 5P 6M 7m\", \"hungarian major\"],\n [\"1P 2m 3M 4P 5d 6M 7m\", \"oriental\"],\n [\"1P 2m 3m 3M 4A 5P 7m\", \"flamenco\"],\n [\"1P 2m 3m 4A 5P 6m 7M\", \"todi raga\"],\n [\"1P 2m 3M 4P 5d 6m 7M\", \"persian\"],\n [\"1P 2m 3M 5d 6m 7m 7M\", \"enigmatic\"],\n [\n \"1P 2M 3M 4P 5A 6M 7M\",\n \"major augmented\",\n \"major #5\",\n \"ionian augmented\",\n \"ionian #5\"\n ],\n [\"1P 2A 3M 4A 5P 6M 7M\", \"lydian #9\"],\n // 8-note scales\n [\"1P 2m 2M 4P 4A 5P 6m 7M\", \"messiaen's mode #4\"],\n [\"1P 2m 3M 4P 4A 5P 6m 7M\", \"purvi raga\"],\n [\"1P 2m 3m 3M 4P 5P 6m 7m\", \"spanish heptatonic\"],\n [\"1P 2M 3m 3M 4P 5P 6M 7m\", \"bebop minor\"],\n [\"1P 2M 3M 4P 5P 5A 6M 7M\", \"bebop major\"],\n [\"1P 2m 3m 4P 5d 5P 6m 7m\", \"bebop locrian\"],\n [\"1P 2M 3m 4P 5P 6m 7m 7M\", \"minor bebop\"],\n [\"1P 2M 3M 4P 5d 5P 6M 7M\", \"ichikosucho\"],\n [\"1P 2M 3m 4P 5P 6m 6M 7M\", \"minor six diminished\"],\n [\n \"1P 2m 3m 3M 4A 5P 6M 7m\",\n \"half-whole diminished\",\n \"dominant diminished\",\n \"messiaen's mode #2\"\n ],\n [\"1P 3m 3M 4P 5P 6M 7m 7M\", \"kafi raga\"],\n [\"1P 2M 3M 4P 4A 5A 6A 7M\", \"messiaen's mode #6\"],\n // 9-note scales\n [\"1P 2M 3m 3M 4P 5d 5P 6M 7m\", \"composite blues\"],\n [\"1P 2M 3m 3M 4A 5P 6m 7m 7M\", \"messiaen's mode #3\"],\n // 10-note scales\n [\"1P 2m 2M 3m 4P 4A 5P 6m 6M 7M\", \"messiaen's mode #7\"],\n // 12-note scales\n [\"1P 2m 2M 3m 3M 4P 5d 5P 6m 6M 7m 7M\", \"chromatic\"]\n];\nvar data_default = SCALES;\n\n// index.ts\nvar NoScaleType = {\n ...EmptyPcset,\n intervals: [],\n aliases: []\n};\nvar dictionary = [];\nvar index = {};\nfunction names() {\n return dictionary.map((scale) => scale.name);\n}\nfunction get(type) {\n return index[type] || NoScaleType;\n}\nvar scaleType = get;\nfunction all() {\n return dictionary.slice();\n}\nvar entries = all;\nfunction keys() {\n return Object.keys(index);\n}\nfunction removeAll() {\n dictionary = [];\n index = {};\n}\nfunction add(intervals, name, aliases = []) {\n const scale = { ...pcset(intervals), name, intervals, aliases };\n dictionary.push(scale);\n index[scale.name] = scale;\n index[scale.setNum] = scale;\n index[scale.chroma] = scale;\n scale.aliases.forEach((alias) => addAlias(scale, alias));\n return scale;\n}\nfunction addAlias(scale, alias) {\n index[alias] = scale;\n}\ndata_default.forEach(\n ([ivls, name, ...aliases]) => add(ivls.split(\" \"), name, aliases)\n);\nvar scale_type_default = {\n names,\n get,\n all,\n add,\n removeAll,\n keys,\n // deprecated\n entries,\n scaleType\n};\nexport {\n NoScaleType,\n add,\n addAlias,\n all,\n scale_type_default as default,\n entries,\n get,\n keys,\n names,\n removeAll,\n scaleType\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport { detect } from \"@tonaljs/chord-detect\";\nimport {\n all as chordTypes,\n get as getChordType\n} from \"@tonaljs/chord-type\";\nimport { subtract } from \"@tonaljs/interval\";\nimport { isSubsetOf, isSupersetOf } from \"@tonaljs/pcset\";\nimport {\n distance,\n tonicIntervalsTransposer,\n transpose as transposeNote\n} from \"@tonaljs/pitch-distance\";\nimport { note, tokenizeNote } from \"@tonaljs/pitch-note\";\nimport { all as scaleTypes } from \"@tonaljs/scale-type\";\nimport { detect as detect2 } from \"@tonaljs/chord-detect\";\nvar NoChord = {\n empty: true,\n name: \"\",\n symbol: \"\",\n root: \"\",\n bass: \"\",\n rootDegree: 0,\n type: \"\",\n tonic: null,\n setNum: NaN,\n quality: \"Unknown\",\n chroma: \"\",\n normalized: \"\",\n aliases: [],\n notes: [],\n intervals: []\n};\nfunction tokenize(name) {\n const [letter, acc, oct, type] = tokenizeNote(name);\n if (letter === \"\") {\n return tokenizeBass(\"\", name);\n } else if (letter === \"A\" && type === \"ug\") {\n return tokenizeBass(\"\", \"aug\");\n } else {\n return tokenizeBass(letter + acc, oct + type);\n }\n}\nfunction tokenizeBass(note2, chord2) {\n const split = chord2.split(\"/\");\n if (split.length === 1) {\n return [note2, split[0], \"\"];\n }\n const [letter, acc, oct, type] = tokenizeNote(split[1]);\n if (letter !== \"\" && oct === \"\" && type === \"\") {\n return [note2, split[0], letter + acc];\n } else {\n return [note2, chord2, \"\"];\n }\n}\nfunction get(src) {\n if (Array.isArray(src)) {\n return getChord(src[1] || \"\", src[0], src[2]);\n } else if (src === \"\") {\n return NoChord;\n } else {\n const [tonic, type, bass] = tokenize(src);\n const chord2 = getChord(type, tonic, bass);\n return chord2.empty ? getChord(src) : chord2;\n }\n}\nfunction getChord(typeName, optionalTonic, optionalBass) {\n const type = getChordType(typeName);\n const tonic = note(optionalTonic || \"\");\n const bass = note(optionalBass || \"\");\n if (type.empty || optionalTonic && tonic.empty || optionalBass && bass.empty) {\n return NoChord;\n }\n const bassInterval = distance(tonic.pc, bass.pc);\n const bassIndex = type.intervals.indexOf(bassInterval);\n const hasRoot = bassIndex >= 0;\n const root = hasRoot ? bass : note(\"\");\n const rootDegree = bassIndex === -1 ? NaN : bassIndex + 1;\n const hasBass = bass.pc && bass.pc !== tonic.pc;\n const intervals = Array.from(type.intervals);\n if (hasRoot) {\n for (let i = 1; i < rootDegree; i++) {\n const num = intervals[0][0];\n const quality = intervals[0][1];\n const newNum = parseInt(num, 10) + 7;\n intervals.push(`${newNum}${quality}`);\n intervals.shift();\n }\n } else if (hasBass) {\n const ivl = subtract(distance(tonic.pc, bass.pc), \"8P\");\n if (ivl) intervals.unshift(ivl);\n }\n const notes2 = tonic.empty ? [] : intervals.map((i) => transposeNote(tonic.pc, i));\n typeName = type.aliases.indexOf(typeName) !== -1 ? typeName : type.aliases[0];\n const symbol = `${tonic.empty ? \"\" : tonic.pc}${typeName}${hasRoot && rootDegree > 1 ? \"/\" + root.pc : hasBass ? \"/\" + bass.pc : \"\"}`;\n const name = `${optionalTonic ? tonic.pc + \" \" : \"\"}${type.name}${hasRoot && rootDegree > 1 ? \" over \" + root.pc : hasBass ? \" over \" + bass.pc : \"\"}`;\n return {\n ...type,\n name,\n symbol,\n tonic: tonic.pc,\n type: type.name,\n root: root.pc,\n bass: hasBass ? bass.pc : \"\",\n intervals,\n rootDegree,\n notes: notes2\n };\n}\nvar chord = get;\nfunction transpose(chordName, interval) {\n const [tonic, type, bass] = tokenize(chordName);\n if (!tonic) {\n return chordName;\n }\n const tr = transposeNote(bass, interval);\n const slash = tr ? \"/\" + tr : \"\";\n return transposeNote(tonic, interval) + type + slash;\n}\nfunction chordScales(name) {\n const s = get(name);\n const isChordIncluded = isSupersetOf(s.chroma);\n return scaleTypes().filter((scale) => isChordIncluded(scale.chroma)).map((scale) => scale.name);\n}\nfunction extended(chordName) {\n const s = get(chordName);\n const isSuperset = isSupersetOf(s.chroma);\n return chordTypes().filter((chord2) => isSuperset(chord2.chroma)).map((chord2) => s.tonic + chord2.aliases[0]);\n}\nfunction reduced(chordName) {\n const s = get(chordName);\n const isSubset = isSubsetOf(s.chroma);\n return chordTypes().filter((chord2) => isSubset(chord2.chroma)).map((chord2) => s.tonic + chord2.aliases[0]);\n}\nfunction notes(chordName, tonic) {\n const chord2 = get(chordName);\n const note2 = tonic || chord2.tonic;\n if (!note2 || chord2.empty) return [];\n return chord2.intervals.map((ivl) => transposeNote(note2, ivl));\n}\nfunction degrees(chordName, tonic) {\n const chord2 = get(chordName);\n const note2 = tonic || chord2.tonic;\n const transpose2 = tonicIntervalsTransposer(chord2.intervals, note2);\n return (degree) => degree ? transpose2(degree > 0 ? degree - 1 : degree) : \"\";\n}\nfunction steps(chordName, tonic) {\n const chord2 = get(chordName);\n const note2 = tonic || chord2.tonic;\n return tonicIntervalsTransposer(chord2.intervals, note2);\n}\nvar chord_default = {\n getChord,\n get,\n detect,\n chordScales,\n extended,\n reduced,\n tokenize,\n transpose,\n degrees,\n steps,\n notes,\n chord\n};\nexport {\n chord,\n chordScales,\n chord_default as default,\n degrees,\n detect2 as detect,\n extended,\n get,\n getChord,\n notes,\n reduced,\n steps,\n tokenize,\n transpose\n};\n//# sourceMappingURL=index.mjs.map","// data.ts\nvar DATA = [\n [\n 0.125,\n \"dl\",\n [\"large\", \"duplex longa\", \"maxima\", \"octuple\", \"octuple whole\"]\n ],\n [0.25, \"l\", [\"long\", \"longa\"]],\n [0.5, \"d\", [\"double whole\", \"double\", \"breve\"]],\n [1, \"w\", [\"whole\", \"semibreve\"]],\n [2, \"h\", [\"half\", \"minim\"]],\n [4, \"q\", [\"quarter\", \"crotchet\"]],\n [8, \"e\", [\"eighth\", \"quaver\"]],\n [16, \"s\", [\"sixteenth\", \"semiquaver\"]],\n [32, \"t\", [\"thirty-second\", \"demisemiquaver\"]],\n [64, \"sf\", [\"sixty-fourth\", \"hemidemisemiquaver\"]],\n [128, \"h\", [\"hundred twenty-eighth\"]],\n [256, \"th\", [\"two hundred fifty-sixth\"]]\n];\nvar data_default = DATA;\n\n// index.ts\nvar VALUES = [];\ndata_default.forEach(\n ([denominator, shorthand, names2]) => add(denominator, shorthand, names2)\n);\nvar NoDuration = {\n empty: true,\n name: \"\",\n value: 0,\n fraction: [0, 0],\n shorthand: \"\",\n dots: \"\",\n names: []\n};\nfunction names() {\n return VALUES.reduce((names2, duration) => {\n duration.names.forEach((name) => names2.push(name));\n return names2;\n }, []);\n}\nfunction shorthands() {\n return VALUES.map((dur) => dur.shorthand);\n}\nvar REGEX = /^([^.]+)(\\.*)$/;\nfunction get(name) {\n const [_, simple, dots] = REGEX.exec(name) || [];\n const base = VALUES.find(\n (dur) => dur.shorthand === simple || dur.names.includes(simple)\n );\n if (!base) {\n return NoDuration;\n }\n const fraction2 = calcDots(base.fraction, dots.length);\n const value2 = fraction2[0] / fraction2[1];\n return { ...base, name, dots, value: value2, fraction: fraction2 };\n}\nvar value = (name) => get(name).value;\nvar fraction = (name) => get(name).fraction;\nvar duration_value_default = { names, shorthands, get, value, fraction };\nfunction add(denominator, shorthand, names2) {\n VALUES.push({\n empty: false,\n dots: \"\",\n name: \"\",\n value: 1 / denominator,\n fraction: denominator < 1 ? [1 / denominator, 1] : [1, denominator],\n shorthand,\n names: names2\n });\n}\nfunction calcDots(fraction2, dots) {\n const pow = Math.pow(2, dots);\n let numerator = fraction2[0] * pow;\n let denominator = fraction2[1] * pow;\n const base = numerator;\n for (let i = 0; i < dots; i++) {\n numerator += base / Math.pow(2, i + 1);\n }\n while (numerator % 2 === 0 && denominator % 2 === 0) {\n numerator /= 2;\n denominator /= 2;\n }\n return [numerator, denominator];\n}\nexport {\n duration_value_default as default,\n fraction,\n get,\n names,\n shorthands,\n value\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport { note as props } from \"@tonaljs/pitch-note\";\nfunction isMidi(arg) {\n return +arg >= 0 && +arg <= 127;\n}\nfunction toMidi(note) {\n if (isMidi(note)) {\n return +note;\n }\n const n = props(note);\n return n.empty ? null : n.midi;\n}\nfunction midiToFreq(midi, tuning = 440) {\n return Math.pow(2, (midi - 69) / 12) * tuning;\n}\nvar L2 = Math.log(2);\nvar L440 = Math.log(440);\nfunction freqToMidi(freq) {\n const v = 12 * (Math.log(freq) - L440) / L2 + 69;\n return Math.round(v * 100) / 100;\n}\nvar SHARPS = \"C C# D D# E F F# G G# A A# B\".split(\" \");\nvar FLATS = \"C Db D Eb E F Gb G Ab A Bb B\".split(\" \");\nfunction midiToNoteName(midi, options = {}) {\n if (isNaN(midi) || midi === -Infinity || midi === Infinity) return \"\";\n midi = Math.round(midi);\n const pcs = options.sharps === true ? SHARPS : FLATS;\n const pc = pcs[midi % 12];\n if (options.pitchClass) {\n return pc;\n }\n const o = Math.floor(midi / 12) - 1;\n return pc + o;\n}\nfunction chroma(midi) {\n return midi % 12;\n}\nfunction pcsetFromChroma(chroma2) {\n return chroma2.split(\"\").reduce((pcset2, val, index) => {\n if (index < 12 && val === \"1\") pcset2.push(index);\n return pcset2;\n }, []);\n}\nfunction pcsetFromMidi(midi) {\n return midi.map(chroma).sort((a, b) => a - b).filter((n, i, a) => i === 0 || n !== a[i - 1]);\n}\nfunction pcset(notes) {\n return Array.isArray(notes) ? pcsetFromMidi(notes) : pcsetFromChroma(notes);\n}\nfunction pcsetNearest(notes) {\n const set = pcset(notes);\n return (midi) => {\n const ch = chroma(midi);\n for (let i = 0; i < 12; i++) {\n if (set.includes(ch + i)) return midi + i;\n if (set.includes(ch - i)) return midi - i;\n }\n return void 0;\n };\n}\nfunction pcsetSteps(notes, tonic) {\n const set = pcset(notes);\n const len = set.length;\n return (step) => {\n const index = step < 0 ? (len - -step % len) % len : step % len;\n const octaves = Math.floor(step / len);\n return set[index] + octaves * 12 + tonic;\n };\n}\nfunction pcsetDegrees(notes, tonic) {\n const steps = pcsetSteps(notes, tonic);\n return (degree) => {\n if (degree === 0) return void 0;\n return steps(degree > 0 ? degree - 1 : degree);\n };\n}\nvar index_default = {\n chroma,\n freqToMidi,\n isMidi,\n midiToFreq,\n midiToNoteName,\n pcsetNearest,\n pcset,\n pcsetDegrees,\n pcsetSteps,\n toMidi\n};\nexport {\n chroma,\n index_default as default,\n freqToMidi,\n isMidi,\n midiToFreq,\n midiToNoteName,\n pcset,\n pcsetDegrees,\n pcsetNearest,\n pcsetSteps,\n toMidi\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport { freqToMidi, midiToNoteName } from \"@tonaljs/midi\";\nimport { distance as _dist, transpose as _tr } from \"@tonaljs/pitch-distance\";\nimport {\n note as props\n} from \"@tonaljs/pitch-note\";\nvar NAMES = [\"C\", \"D\", \"E\", \"F\", \"G\", \"A\", \"B\"];\nvar toName = (n) => n.name;\nvar onlyNotes = (array) => array.map(props).filter((n) => !n.empty);\nfunction names(array) {\n if (array === void 0) {\n return NAMES.slice();\n } else if (!Array.isArray(array)) {\n return [];\n } else {\n return onlyNotes(array).map(toName);\n }\n}\nvar get = props;\nvar name = (note) => get(note).name;\nvar pitchClass = (note) => get(note).pc;\nvar accidentals = (note) => get(note).acc;\nvar octave = (note) => get(note).oct;\nvar midi = (note) => get(note).midi;\nvar freq = (note) => get(note).freq;\nvar chroma = (note) => get(note).chroma;\nfunction fromMidi(midi2) {\n return midiToNoteName(midi2);\n}\nfunction fromFreq(freq2) {\n return midiToNoteName(freqToMidi(freq2));\n}\nfunction fromFreqSharps(freq2) {\n return midiToNoteName(freqToMidi(freq2), { sharps: true });\n}\nfunction fromMidiSharps(midi2) {\n return midiToNoteName(midi2, { sharps: true });\n}\nvar distance = _dist;\nvar transpose = _tr;\nvar tr = _tr;\nvar transposeBy = (interval) => (note) => transpose(note, interval);\nvar trBy = transposeBy;\nvar transposeFrom = (note) => (interval) => transpose(note, interval);\nvar trFrom = transposeFrom;\nfunction transposeFifths(noteName, fifths) {\n return transpose(noteName, [fifths, 0]);\n}\nvar trFifths = transposeFifths;\nfunction transposeOctaves(noteName, octaves) {\n return transpose(noteName, [0, octaves]);\n}\nvar ascending = (a, b) => a.height - b.height;\nvar descending = (a, b) => b.height - a.height;\nfunction sortedNames(notes, comparator) {\n comparator = comparator || ascending;\n return onlyNotes(notes).sort(comparator).map(toName);\n}\nfunction sortedUniqNames(notes) {\n return sortedNames(notes, ascending).filter(\n (n, i, a) => i === 0 || n !== a[i - 1]\n );\n}\nvar simplify = (noteName) => {\n const note = get(noteName);\n if (note.empty) {\n return \"\";\n }\n return midiToNoteName(note.midi || note.chroma, {\n sharps: note.alt > 0,\n pitchClass: note.midi === null\n });\n};\nfunction enharmonic(noteName, destName) {\n const src = get(noteName);\n if (src.empty) {\n return \"\";\n }\n const dest = get(\n destName || midiToNoteName(src.midi || src.chroma, {\n sharps: src.alt < 0,\n pitchClass: true\n })\n );\n if (dest.empty || dest.chroma !== src.chroma) {\n return \"\";\n }\n if (src.oct === void 0) {\n return dest.pc;\n }\n const srcChroma = src.chroma - src.alt;\n const destChroma = dest.chroma - dest.alt;\n const destOctOffset = srcChroma > 11 || destChroma < 0 ? -1 : srcChroma < 0 || destChroma > 11 ? 1 : 0;\n const destOct = src.oct + destOctOffset;\n return dest.pc + destOct;\n}\nvar index_default = {\n names,\n get,\n name,\n pitchClass,\n accidentals,\n octave,\n midi,\n ascending,\n descending,\n distance,\n sortedNames,\n sortedUniqNames,\n fromMidi,\n fromMidiSharps,\n freq,\n fromFreq,\n fromFreqSharps,\n chroma,\n transpose,\n tr,\n transposeBy,\n trBy,\n transposeFrom,\n trFrom,\n transposeFifths,\n transposeOctaves,\n trFifths,\n simplify,\n enharmonic\n};\nexport {\n accidentals,\n ascending,\n chroma,\n index_default as default,\n descending,\n distance,\n enharmonic,\n freq,\n fromFreq,\n fromFreqSharps,\n fromMidi,\n fromMidiSharps,\n get,\n midi,\n name,\n names,\n octave,\n pitchClass,\n simplify,\n sortedNames,\n sortedUniqNames,\n tr,\n trBy,\n trFifths,\n trFrom,\n transpose,\n transposeBy,\n transposeFifths,\n transposeFrom,\n transposeOctaves\n};\n//# sourceMappingURL=index.mjs.map","// index.ts\nimport { rotate } from \"@tonaljs/collection\";\nimport { simplify, transposeFifths } from \"@tonaljs/interval\";\nimport { EmptyPcset } from \"@tonaljs/pcset\";\nimport { transpose } from \"@tonaljs/pitch-distance\";\nimport { get as getType } from \"@tonaljs/scale-type\";\nvar MODES = [\n [0, 2773, 0, \"ionian\", \"\", \"Maj7\", \"major\"],\n [1, 2902, 2, \"dorian\", \"m\", \"m7\"],\n [2, 3418, 4, \"phrygian\", \"m\", \"m7\"],\n [3, 2741, -1, \"lydian\", \"\", \"Maj7\"],\n [4, 2774, 1, \"mixolydian\", \"\", \"7\"],\n [5, 2906, 3, \"aeolian\", \"m\", \"m7\", \"minor\"],\n [6, 3434, 5, \"locrian\", \"dim\", \"m7b5\"]\n];\nvar NoMode = {\n ...EmptyPcset,\n name: \"\",\n alt: 0,\n modeNum: NaN,\n triad: \"\",\n seventh: \"\",\n aliases: []\n};\nvar modes = MODES.map(toMode);\nvar index = {};\nmodes.forEach((mode2) => {\n index[mode2.name] = mode2;\n mode2.aliases.forEach((alias) => {\n index[alias] = mode2;\n });\n});\nfunction get(name) {\n return typeof name === \"string\" ? index[name.toLowerCase()] || NoMode : name && name.name ? get(name.name) : NoMode;\n}\nvar mode = get;\nfunction all() {\n return modes.slice();\n}\nvar entries = all;\nfunction names() {\n return modes.map((mode2) => mode2.name);\n}\nfunction toMode(mode2) {\n const [modeNum, setNum, alt, name, triad, seventh, alias] = mode2;\n const aliases = alias ? [alias] : [];\n const chroma = Number(setNum).toString(2);\n const intervals = getType(name).intervals;\n return {\n empty: false,\n intervals,\n modeNum,\n chroma,\n normalized: chroma,\n name,\n setNum,\n alt,\n triad,\n seventh,\n aliases\n };\n}\nfunction notes(modeName, tonic) {\n return get(modeName).intervals.map((ivl) => transpose(tonic, ivl));\n}\nfunction chords(chords2) {\n return (modeName, tonic) => {\n const mode2 = get(modeName);\n if (mode2.empty) return [];\n const triads2 = rotate(mode2.modeNum, chords2);\n const tonics = mode2.intervals.map((i) => transpose(tonic, i));\n return triads2.map((triad, i) => tonics[i] + triad);\n };\n}\nvar triads = chords(MODES.map((x) => x[4]));\nvar seventhChords = chords(MODES.map((x) => x[5]));\nfunction distance(destination, source) {\n const from = get(source);\n const to = get(destination);\n if (from.empty || to.empty) return \"\";\n return simplify(transposeFifths(\"1P\", to.alt - from.alt));\n}\nfunction relativeTonic(destination, source, tonic) {\n return transpose(tonic, distance(destination, source));\n}\nvar mode_default = {\n get,\n names,\n all,\n distance,\n relativeTonic,\n notes,\n triads,\n seventhChords,\n // deprecated\n entries,\n mode\n};\nexport {\n all,\n mode_default as default,\n distance,\n entries,\n get,\n mode,\n names,\n notes,\n relativeTonic,\n seventhChords,\n triads\n};\n//# sourceMappingURL=index.mjs.map","import { Midi, Note } from \"tonal\";\nimport { Chord as TonalChord } from \"tonal\";\nimport type { NoteName } from \"../types/music\";\n\nexport function midiToFrequency(midi: number): number {\n return Midi.midiToFreq(midi);\n}\n\nexport function noteToFrequency(note: NoteName | string): number {\n const freq = Note.freq(note);\n if (freq === null) {\n console.warn(`Invalid note: ${note}, defaulting to A4 (440Hz)`);\n return 440;\n }\n return freq;\n}\n\nexport function resolveChordNotes(\n notes: string | (string | number)[],\n): (string | number)[] {\n // If already an array, return as-is\n if (Array.isArray(notes)) {\n return notes;\n }\n\n // Parse chord name with optional octave (e.g., \"Cmaj7:4\")\n const [chordName, octaveStr] = notes.split(\":\");\n const octave = octaveStr ? parseInt(octaveStr, 10) : 3;\n\n // Get chord notes from Tonal\n const chord = TonalChord.get(chordName);\n\n if (!chord.notes.length) {\n console.warn(`Unknown chord: ${chordName}, defaulting to root note`);\n return [chordName + octave];\n }\n\n // Add octave to each note, handling octave wrapping for notes above the root\n const rootPc = chord.notes[0];\n const noteOrder = [\"C\", \"D\", \"E\", \"F\", \"G\", \"A\", \"B\"];\n const rootIndex = noteOrder.findIndex((n) => rootPc.startsWith(n));\n\n return chord.notes.map((note) => {\n const noteIndex = noteOrder.findIndex((n) => note.startsWith(n));\n // If note is lower in the scale than root, it's in the next octave\n const noteOctave = noteIndex < rootIndex ? octave + 1 : octave;\n return note + noteOctave;\n });\n}\n","import type { CutoffType } from \"../components/Synth/types\";\nimport { midiToFrequency } from \"./notes\";\n\n/** Generate an array of linearly interpolated values */\nexport function line(start: number, end: number, steps: number): number[] {\n if (steps < 1) {\n throw new Error(\"Line must have at least 1 step\");\n }\n\n const increment = (end - start) / steps;\n return Array.from({ length: steps }, (_, i) => start + increment * i);\n}\n\n/** Mirror an array: [1,2,3] → [1,2,3,3,2,1] */\nexport function mirror(values: number[]): number[] {\n return [...values, ...values.toReversed()];\n}\n\nexport function resolveCutoff(\n cutoff: CutoffType,\n stepIndex: number,\n): number {\n if (typeof cutoff === \"number\") {\n return midiToFrequency(cutoff);\n }\n\n const values = line(cutoff.from, cutoff.to, cutoff.steps);\n const sequence = cutoff.mirror ? mirror(values) : values;\n const effectiveStep = cutoff.step ?? stepIndex;\n\n return midiToFrequency(sequence[effectiveStep % sequence.length]);\n}\n","import type { SynthConfig, SynthType } from \"./types\";\n\nexport const SYNTH_PRESETS: Record<SynthType, SynthConfig> = {\n /**\n * Pure sine wave - clean, fundamental tone\n */\n sine: {\n oscillator: \"sine\",\n filter: { type: \"lowpass\", cutoff: 135.08, resonance: 1 },\n voices: { count: 1, detune: 0, spread: 0 },\n },\n\n /**\n * Sawtooth wave - bright, harmonically rich\n */\n saw: {\n oscillator: \"sawtooth\",\n filter: { type: \"lowpass\", cutoff: 135.08, resonance: 1 },\n voices: { count: 1, detune: 0, spread: 0 },\n },\n\n /**\n * Square wave - hollow, clarinet-like\n */\n square: {\n oscillator: \"square\",\n filter: { type: \"lowpass\", cutoff: 135.08, resonance: 1 },\n voices: { count: 1, detune: 0, spread: 0 },\n },\n\n /**\n * Triangle wave - soft, flute-like\n */\n tri: {\n oscillator: \"triangle\",\n filter: { type: \"lowpass\", cutoff: 135.08, resonance: 1 },\n voices: { count: 1, detune: 0, spread: 0 },\n },\n\n /**\n * Prophet - Sequential Circuits Prophet-5 inspired\n * Warm analog sound with detuned voices and resonant filter\n * Great for leads and pads\n */\n prophet: {\n oscillator: \"sawtooth\",\n filter: { type: \"lowpass\", cutoff: 102.23, resonance: 4 },\n voices: { count: 3, detune: 12, spread: 0.5 },\n },\n\n /**\n * Hollow - Ethereal pad sound\n * Filtered square wave with soft resonance\n * Good for atmospheric backgrounds\n */\n hollow: {\n oscillator: \"square\",\n filter: { type: \"bandpass\", cutoff: 86.37, resonance: 2 },\n voices: { count: 2, detune: 8, spread: 0.7 },\n },\n\n /**\n * Dark Ambience - Deep atmospheric pad\n * Low-passed sawtooth with multiple detuned voices\n */\n dark_ambience: {\n oscillator: \"sawtooth\",\n filter: { type: \"lowpass\", cutoff: 79.35, resonance: 3 },\n voices: { count: 4, detune: 15, spread: 0.8 },\n },\n\n /**\n * Bass - Punchy bass sound\n * Filtered sawtooth with slight detune for thickness\n */\n bass: {\n oscillator: \"sawtooth\",\n filter: { type: \"lowpass\", cutoff: 74.37, resonance: 5 },\n voices: { count: 2, detune: 5, spread: 0.2 },\n },\n\n /**\n * Pluck - Bright plucked string sound\n * Square wave with high cutoff for attack brightness\n */\n pluck: {\n oscillator: \"square\",\n filter: { type: \"lowpass\", cutoff: 111.08, resonance: 2 },\n voices: { count: 2, detune: 6, spread: 0.3 },\n },\n};\n\nexport function getSynthPreset(type: SynthType): SynthConfig {\n return SYNTH_PRESETS[type];\n}\n\nexport const DEFAULT_SYNTH_CONFIG: SynthConfig = SYNTH_PRESETS.sine;\n","import { createContext, type ReactNode, useContext, useMemo } from \"react\";\nimport type { SynthConfig, SynthOverrides, SynthType } from \"./types\";\nimport { DEFAULT_SYNTH_CONFIG, getSynthPreset } from \"./presets\";\n\nconst SynthContext = createContext<SynthConfig | null>(null);\n\ntype SynthProps = SynthOverrides & {\n type: SynthType;\n children: React.ReactNode;\n};\n\n/**\n * Synth component - defines the synthesizer for child Note/Chord components\n *\n * @example\n * // Using a preset synth type\n * <Synth type=\"prophet\">\n * <Note note=\"C4\" />\n * </Synth>\n *\n * @example\n * // Overriding preset parameters with nested structure\n * <Synth type=\"prophet\" filter={{ cutoff: 2000, resonance: 6 }}>\n * <Chord notes=\"Am7\" />\n * </Synth>\n *\n * @example\n * // Creating thick unison sound\n * <Synth type=\"saw\" voices={{ count: 4, detune: 15, spread: 0.8 }}>\n * <Sequence interval={0.25}>\n * <Note note=\"A3\" />\n * <Note note=\"C4\" />\n * </Sequence>\n * </Synth>\n */\nexport function Synth({\n type,\n oscillator,\n filter,\n voices,\n children,\n}: SynthProps): ReactNode {\n // Build configuration by starting with preset and applying overrides\n const config = useMemo<SynthConfig>(() => {\n const preset = getSynthPreset(type);\n\n return {\n oscillator: oscillator ?? preset.oscillator,\n filter: {\n type: filter?.type ?? preset.filter.type,\n cutoff: filter?.cutoff ?? preset.filter.cutoff,\n resonance: filter?.resonance ?? preset.filter.resonance,\n },\n voices: {\n count: voices?.count ?? preset.voices.count,\n detune: voices?.detune ?? preset.voices.detune,\n spread: voices?.spread ?? preset.voices.spread,\n },\n };\n }, [type, oscillator, filter, voices]);\n\n return (\n <SynthContext.Provider value={config}>\n {children}\n </SynthContext.Provider>\n );\n}\n\nexport function useSynth(): SynthConfig {\n const ctx = useContext(SynthContext);\n return ctx ?? DEFAULT_SYNTH_CONFIG;\n}\n","import { type ReactNode, useEffect, useId } from \"react\";\nimport { useScheduleNote, useTrack } from \"../Track\";\nimport {\n ADSR_DEFAULTS,\n type ADSRProps,\n applyADSREnvelope,\n} from \"../../utils/envelope\";\nimport { noteToFrequency } from \"../../utils/notes\";\nimport { resolveCutoff } from \"../../utils/line\";\nimport type { NoteName } from \"../../types/music\";\nimport { type SynthOverrides, useSynth } from \"../Synth\";\n\ntype NoteProps =\n & ADSRProps\n & SynthOverrides\n & {\n /** Note name (e.g., \"A4\", \"C#3\") or frequency in Hz */\n note: NoteName | number;\n /** Amplitude 0-1 (default: 0.3) */\n amp?: number;\n /** Step index when inside a Sequence (injected by Sequence) */\n __stepIndex?: number;\n };\n\n/**\n * Note component - plays a note using Web Audio oscillator with ADSR envelope\n *\n * When used inside a Loop or Sequence, the note will be scheduled\n * with sample-accurate timing via the scheduler.\n *\n * The note duration is determined by the ADSR envelope:\n * total duration = attack + decay + sustain + release\n *\n * @example\n * <Note note=\"A4\" amp={0.5} attack={0.1} sustain={0.5} release={0.2} />\n * <Note note={440} oscillator=\"sawtooth\" attack={0.05} decay={0.1} sustain_level={0.7} />\n * <Note note=\"C4\" filter={{ cutoff: 800, resonance: 5 }} />\n * <Note note=\"E4\" voices={{ count: 3, detune: 10, spread: 0.5 }} />\n */\nexport function Note({\n note,\n amp = 0.3,\n oscillator,\n filter,\n voices,\n attack = ADSR_DEFAULTS.attack,\n attack_level = ADSR_DEFAULTS.attack_level,\n decay = ADSR_DEFAULTS.decay,\n decay_level,\n sustain = ADSR_DEFAULTS.sustain,\n sustain_level = ADSR_DEFAULTS.sustain_level,\n release = ADSR_DEFAULTS.release,\n __stepIndex,\n}: NoteProps): ReactNode {\n const uniqueId = useId();\n const { audioContext, scheduler } = useTrack();\n const scheduleNote = useScheduleNote();\n const synthConfig = useSynth();\n\n // Use prop values if specified, otherwise use synth config\n const oscillatorType = oscillator ?? synthConfig.oscillator;\n const filterType = filter?.type ?? synthConfig.filter.type;\n const filterCutoff = resolveCutoff(\n filter?.cutoff ?? synthConfig.filter.cutoff,\n __stepIndex ?? 0,\n );\n const filterResonance = filter?.resonance ?? synthConfig.filter.resonance;\n const voiceCount = voices?.count ?? synthConfig.voices.count;\n const voiceDetune = voices?.detune ?? synthConfig.voices.detune;\n const voiceSpread = voices?.spread ?? synthConfig.voices.spread;\n\n const frequency = typeof note === \"number\" ? note : noteToFrequency(note);\n const adsrProps = {\n attack,\n attack_level,\n decay,\n decay_level,\n sustain,\n sustain_level,\n release,\n };\n\n useEffect(() => {\n const playNote = (audioTime: number) => {\n const gainNode = audioContext.createGain();\n\n // Create filter if cutoff is below maximum (20000 Hz)\n if (filterCutoff < 20000) {\n const filter = audioContext.createBiquadFilter();\n filter.type = filterType;\n filter.frequency.value = filterCutoff;\n filter.Q.value = filterResonance;\n gainNode.connect(filter);\n filter.connect(audioContext.destination);\n } else {\n gainNode.connect(audioContext.destination);\n }\n\n const endTime = applyADSREnvelope(\n gainNode,\n audioTime,\n adsrProps,\n amp / voiceCount, // Normalize amplitude across voices\n (beats) => scheduler.beatsToSeconds(beats),\n );\n\n // Create oscillators for each voice (for unison/detune effect)\n for (let i = 0; i < voiceCount; i++) {\n const oscillator = audioContext.createOscillator();\n oscillator.type = oscillatorType;\n oscillator.frequency.value = frequency;\n\n // Apply detune spread across voices\n if (voiceCount > 1 && voiceDetune > 0) {\n // Spread detune evenly: -detune/2 to +detune/2\n const detuneOffset = (i / (voiceCount - 1) - 0.5) * voiceDetune;\n oscillator.detune.value = detuneOffset;\n }\n\n // Apply stereo spread if multiple voices\n if (voiceCount > 1 && voiceSpread > 0) {\n const panner = audioContext.createStereoPanner();\n const panValue = (i / (voiceCount - 1) - 0.5) * 2 * voiceSpread;\n panner.pan.value = panValue;\n oscillator.connect(panner);\n panner.connect(gainNode);\n } else {\n oscillator.connect(gainNode);\n }\n\n oscillator.start(audioTime);\n oscillator.stop(endTime + 0.01);\n }\n };\n\n scheduleNote.scheduleNote(uniqueId, playNote, __stepIndex);\n return () => {\n scheduleNote.unscheduleNote(uniqueId);\n };\n }, [\n note,\n frequency,\n amp,\n oscillatorType,\n filterCutoff,\n filterResonance,\n filterType,\n voiceCount,\n voiceDetune,\n voiceSpread,\n adsrProps,\n audioContext,\n scheduler,\n scheduleNote,\n __stepIndex,\n uniqueId,\n ]);\n\n return null;\n}\n","import { readFile } from \"fs/promises\";\nimport { fileURLToPath } from \"url\";\nimport { createRequire } from \"module\";\nimport { dirname, join } from \"path\";\nimport type { AudioContext as AudioContextType } from \"node-web-audio-api\";\n\nconst sampleCache = new Map<string, AudioBuffer>();\n\n// Resolve samples directory from the package location\nfunction getSamplesDir(): string {\n try {\n // Use createRequire to find the package location\n const require = createRequire(import.meta.url);\n const packageMain = require.resolve(\"@react-synth/synth\");\n const packageDir = dirname(packageMain);\n // In the published package, samples are at src/samples relative to package root\n // dist/index.js -> ../src/samples\n return join(packageDir, \"..\", \"src\", \"samples\");\n } catch {\n // Fallback: resolve relative to this file (works during development)\n const currentFile = fileURLToPath(import.meta.url);\n const currentDir = dirname(currentFile);\n return join(currentDir, \"..\", \"samples\");\n }\n}\n\nconst samplesDir = getSamplesDir();\n\nfunction getSamplePath(name: string): string {\n return join(samplesDir, `${name}.flac`);\n}\n\nexport async function loadSample(\n audioContext: AudioContextType,\n name: string,\n): Promise<AudioBuffer> {\n if (sampleCache.has(name)) {\n return sampleCache.get(name)!;\n }\n\n const path = getSamplePath(name);\n const fileData = await readFile(path);\n const audioBuffer = await audioContext.decodeAudioData(\n fileData.buffer as ArrayBuffer,\n );\n sampleCache.set(name, audioBuffer);\n return audioBuffer;\n}\n","import { type ReactNode, useEffect, useId } from \"react\";\nimport { useScheduleNote, useTrack } from \"../Track\";\nimport { loadSample } from \"../../audio/sampleLoader\";\nimport type { SampleName } from \"../../types/music\";\nimport type { CutoffType } from \"../Synth/types\";\nimport { resolveCutoff } from \"../../utils/line\";\n\ntype SampleProps = {\n /** Sample name (without extension, e.g., \"bd_haus\") */\n name: SampleName;\n /** Amplitude/volume (default: 1) */\n amp?: number;\n /**\n * Filter cutoff as MIDI note number or Line pattern (Sonic Pi compatible)\n *\n * Common values:\n * - 60 => ~262 Hz (C4)\n * - 80 => ~831 Hz\n * - 100 => ~2637 Hz\n * - 110 => ~4699 Hz\n * - 130 => ~20kHz (essentially no filtering)\n *\n * Can also be a Line pattern: { from: 60, to: 120, steps: 8 }\n */\n cutoff?: CutoffType;\n /** Playback rate multiplier (default: 1) */\n rate?: number;\n /** Stereo pan position from -1 (left) to 1 (right) (default: 0) */\n pan?: number;\n /** Step index when inside a Sequence (injected by Sequence) */\n __stepIndex?: number;\n};\n\n/**\n * Sample component - plays an audio sample file with optional effects\n *\n * @example\n * <Sample name=\"bd_haus\" amp={2} cutoff={100} />\n * <Sample name=\"drum_cymbal_closed\" amp={0.5} rate={1.5} pan={0.1} />\n */\nexport function Sample({\n name,\n amp = 1,\n cutoff,\n rate = 1,\n pan = 0,\n __stepIndex,\n}: SampleProps): ReactNode {\n const uniqueId = useId();\n const { audioContext } = useTrack();\n const scheduleNote = useScheduleNote();\n\n // Resolve cutoff using the same logic as Note/Chord components\n const filterCutoff = cutoff !== undefined\n ? resolveCutoff(cutoff, __stepIndex ?? 0)\n : 20000;\n\n useEffect(() => {\n let buffer: AudioBuffer | null = null;\n\n loadSample(audioContext, name).then((loaded) => {\n buffer = loaded;\n });\n\n const playSample = (audioTime: number) => {\n if (!buffer) return;\n\n const source = audioContext.createBufferSource();\n source.buffer = buffer;\n source.playbackRate.value = rate;\n\n // Build audio graph: source -> [filter] -> [panner] -> gain -> destination\n let currentNode: AudioNode = source;\n\n // Create filter if cutoff is below maximum (20000 Hz)\n if (filterCutoff < 20000) {\n const filter = audioContext.createBiquadFilter();\n filter.type = \"lowpass\";\n filter.frequency.value = filterCutoff;\n currentNode.connect(filter);\n currentNode = filter;\n }\n\n if (pan !== 0) {\n const panner = audioContext.createStereoPanner();\n panner.pan.value = pan;\n currentNode.connect(panner);\n currentNode = panner;\n }\n\n const gainNode = audioContext.createGain();\n gainNode.gain.value = amp;\n currentNode.connect(gainNode);\n gainNode.connect(audioContext.destination);\n\n source.start(audioTime);\n };\n\n scheduleNote.scheduleNote(uniqueId, playSample, __stepIndex);\n return () => {\n scheduleNote.unscheduleNote(uniqueId);\n };\n }, [\n audioContext,\n name,\n scheduleNote,\n uniqueId,\n __stepIndex,\n amp,\n filterCutoff,\n rate,\n pan,\n ]);\n\n return null;\n}\n","import { type ReactNode, useEffect, useId } from \"react\";\nimport { useScheduleNote, useTrack } from \"./Track\";\nimport {\n ADSR_DEFAULTS,\n type ADSRProps,\n applyADSREnvelope,\n} from \"../utils/envelope\";\nimport { noteToFrequency, resolveChordNotes } from \"../utils/notes\";\nimport type { NoteName } from \"../types/music\";\nimport { type SynthOverrides, useSynth } from \"./Synth\";\nimport { resolveCutoff } from \"../utils/line\";\n\ntype ChordProps =\n & ADSRProps\n & SynthOverrides\n & {\n /**\n * Chord specification - can be:\n * - A chord name string (e.g., \"Cmaj7\", \"Am\", \"F#m7\", \"Dm/F\")\n * - An array of note names (e.g., [\"A4\", \"C#3\", \"E4\"])\n * - An array of frequencies in Hz (e.g., [440, 550, 660])\n *\n * When using chord names, specify the octave with a colon (e.g., \"Cmaj7:4\" for octave 4)\n * Default octave is 3 if not specified.\n */\n notes: string | (NoteName | number)[];\n /** Amplitude 0-1 (default: 0.3) */\n amp?: number;\n /** Step index when inside a Sequence (injected by Sequence) */\n __stepIndex?: number;\n };\n\n/**\n * Chord component - plays multiple notes simultaneously using Web Audio oscillators\n *\n * When used inside a Loop or Sequence, the chord will be scheduled\n * with sample-accurate timing via the scheduler.\n *\n * The chord duration is determined by the ADSR envelope:\n * total duration = attack + decay + sustain + release\n *\n * @example\n * // Using chord names (powered by Tonal)\n * <Chord notes=\"Cmaj7\" amp={0.5} />\n * <Chord notes=\"Am:4\" oscillator=\"sawtooth\" /> // A minor in octave 4\n * <Chord notes=\"Dm7/F\" release={2} /> // D minor 7 with F bass\n *\n * // Using note arrays\n * <Chord notes={[\"a3\", \"c4\", \"e4\"]} amp={0.5} attack={0.1} sustain={2} release={0.5} />\n * <Chord notes={[440, 550, 660]} oscillator=\"sawtooth\" decay={0.2} sustain_level={0.7} />\n *\n * // With filter and voice overrides\n * <Chord notes=\"Em7\" filter={{ cutoff: 1000, resonance: 4 }} />\n * <Chord notes=\"Cmaj\" voices={{ count: 2, detune: 8 }} />\n */\nexport function Chord({\n notes,\n amp = 0.3,\n oscillator,\n filter,\n voices,\n attack = ADSR_DEFAULTS.attack,\n attack_level = ADSR_DEFAULTS.attack_level,\n decay = ADSR_DEFAULTS.decay,\n decay_level,\n sustain = ADSR_DEFAULTS.sustain,\n sustain_level = ADSR_DEFAULTS.sustain_level,\n release = ADSR_DEFAULTS.release,\n __stepIndex,\n}: ChordProps): ReactNode {\n const uniqueId = useId();\n const { audioContext, scheduler } = useTrack();\n const { scheduleNote, unscheduleNote } = useScheduleNote();\n const synthConfig = useSynth();\n\n // Use prop values if specified, otherwise use synth config\n const oscillatorType = oscillator ?? synthConfig.oscillator;\n const filterType = filter?.type ?? synthConfig.filter.type;\n const filterCutoff = resolveCutoff(\n filter?.cutoff ?? synthConfig.filter.cutoff,\n __stepIndex ?? 0,\n );\n const filterResonance = filter?.resonance ?? synthConfig.filter.resonance;\n const voiceCount = voices?.count ?? synthConfig.voices.count;\n const voiceDetune = voices?.detune ?? synthConfig.voices.detune;\n const voiceSpread = voices?.spread ?? synthConfig.voices.spread;\n\n const resolvedNotes = resolveChordNotes(notes);\n const frequencies = resolvedNotes.map((note) =>\n typeof note === \"number\" ? note : noteToFrequency(note)\n );\n const adsrProps = {\n attack,\n attack_level,\n decay,\n decay_level,\n sustain,\n sustain_level,\n release,\n };\n\n // Total number of oscillators = chord notes × voices per note\n const totalOscillators = frequencies.length * voiceCount;\n\n useEffect(() => {\n const playChord = (audioTime: number) => {\n const gainNode = audioContext.createGain();\n\n // Create filter if cutoff is below maximum (20000 Hz)\n if (filterCutoff < 20000) {\n const filter = audioContext.createBiquadFilter();\n filter.type = filterType;\n filter.frequency.value = filterCutoff;\n filter.Q.value = filterResonance;\n gainNode.connect(filter);\n filter.connect(audioContext.destination);\n } else {\n gainNode.connect(audioContext.destination);\n }\n\n const endTime = applyADSREnvelope(\n gainNode,\n audioTime,\n adsrProps,\n amp / totalOscillators, // Normalize amplitude across all oscillators\n (beats) => scheduler.beatsToSeconds(beats),\n );\n\n // Create oscillators for each chord note\n for (const frequency of frequencies) {\n // Create voices for each note (for unison/detune effect)\n for (let i = 0; i < voiceCount; i++) {\n const oscillator = audioContext.createOscillator();\n oscillator.type = oscillatorType;\n oscillator.frequency.value = frequency;\n\n // Apply detune spread across voices\n if (voiceCount > 1 && voiceDetune > 0) {\n const detuneOffset = (i / (voiceCount - 1) - 0.5) * voiceDetune;\n oscillator.detune.value = detuneOffset;\n }\n\n // Apply stereo spread if multiple voices\n if (voiceCount > 1 && voiceSpread > 0) {\n const panner = audioContext.createStereoPanner();\n const panValue = (i / (voiceCount - 1) - 0.5) * 2 * voiceSpread;\n panner.pan.value = panValue;\n oscillator.connect(panner);\n panner.connect(gainNode);\n } else {\n oscillator.connect(gainNode);\n }\n\n oscillator.start(audioTime);\n oscillator.stop(endTime + 0.01);\n }\n }\n };\n\n scheduleNote(uniqueId, playChord, __stepIndex);\n return () => {\n unscheduleNote(uniqueId);\n };\n }, [\n notes,\n frequencies,\n amp,\n oscillatorType,\n filterCutoff,\n filterResonance,\n filterType,\n voiceCount,\n voiceDetune,\n voiceSpread,\n totalOscillators,\n adsrProps,\n audioContext,\n scheduler,\n scheduleNote,\n unscheduleNote,\n __stepIndex,\n uniqueId,\n ]);\n\n return null;\n}\n","import React, {\n Children,\n cloneElement,\n isValidElement,\n type ReactNode,\n useEffect,\n useId,\n useMemo,\n useRef,\n} from \"react\";\nimport {\n ScheduleNoteContext,\n type ScheduleNoteContextValue,\n useScheduleNote,\n useTrack,\n} from \"./Track\";\nimport type { ScheduleCallback } from \"../audio/scheduler\";\n\ntype SequenceProps = {\n /** Time interval between each child in beats */\n interval: number;\n /** Children to play in sequence */\n children: ReactNode;\n /** Step index when nested inside another Sequence (injected by parent Sequence) */\n __stepIndex?: number;\n};\n\n/**\n * Sequence component - plays children one after another with precise timing\n *\n * @example\n * <Sequence interval={0.25}>\n * <Note note=\"C4\" />\n * <Note note=\"E4\" />\n * <Note note=\"G4\" />\n * </Sequence>\n */\nexport function Sequence({\n interval,\n children,\n __stepIndex,\n}: SequenceProps): ReactNode {\n const uniqueId = useId();\n const { scheduler } = useTrack();\n const { scheduleNote, unscheduleNote } = useScheduleNote();\n const childArray = Children.toArray(children);\n const totalSteps = childArray.length;\n\n // Store step callbacks (keyed by step index)\n const stepCallbacks = React.useRef<Map<number, ScheduleCallback>>(new Map());\n // Map from note ID to step index (for unscheduling)\n const idToStepIndex = useRef<Map<string, number>>(new Map());\n\n useEffect(() => {\n const sequenceCallback: ScheduleCallback = (audioTime, beatTime) => {\n for (let i = 0; i < totalSteps; i++) {\n const stepOffset = scheduler.beatsToSeconds(i * interval);\n const stepAudioTime = audioTime + stepOffset;\n const stepBeatTime = beatTime + i * interval;\n\n const callback = stepCallbacks.current.get(i);\n if (callback) {\n callback(stepAudioTime, stepBeatTime);\n }\n }\n };\n\n scheduleNote(`seq-${uniqueId}`, sequenceCallback, __stepIndex);\n\n return () => {\n unscheduleNote(`seq-${uniqueId}`);\n };\n }, [\n interval,\n totalSteps,\n scheduler,\n uniqueId,\n scheduleNote,\n unscheduleNote,\n __stepIndex,\n ]);\n\n // Scheduling context for Notes inside this Sequence\n const scheduleContextValue: ScheduleNoteContextValue = useMemo(\n () => ({\n scheduleNote: (noteId, callback, stepIndex) => {\n if (stepIndex !== undefined) {\n idToStepIndex.current.set(noteId, stepIndex);\n stepCallbacks.current.set(stepIndex, callback);\n }\n },\n unscheduleNote: (noteId) => {\n const stepIndex = idToStepIndex.current.get(noteId);\n if (stepIndex !== undefined) {\n stepCallbacks.current.delete(stepIndex);\n idToStepIndex.current.delete(noteId);\n }\n },\n }),\n [],\n );\n\n // Clone children with their step index\n const childrenWithIndex = childArray.map((child, index) => {\n if (isValidElement(child)) {\n return cloneElement(child, {\n key: `step-${index}`,\n __stepIndex: index,\n } as Record<string, unknown>);\n }\n return child;\n });\n\n return (\n <ScheduleNoteContext.Provider value={scheduleContextValue}>\n {childrenWithIndex}\n </ScheduleNoteContext.Provider>\n );\n}\n"],"names":["AudioContext","createContext","useRef","useEffect","useMemo","jsx","useContext","interval","fillStr","REGEX","cache","parse","pitchName","freq","note","asNote","asInterval","get","pitch","data_default","index","add","pcset","addAlias","props","getChordType","transposeNote","getType","Midi.midiToFreq","Note.freq","TonalChord.get","useId","filter","oscillator","require","createRequire","dirname","join","fileURLToPath","path","readFile","Children","isValidElement","cloneElement"],"mappings":"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","x_google_ignoreList":[4,5,6,7,8,9,10,11,12,13,14,15,16,17]}
|