@hlysine/piano
Version:
Web Audio instrument using Salamander Grand Piano samples
33 lines (27 loc) • 888 B
text/typescript
// import * as Tone from '../node_modules/tone/Tone'
import { Frequency, intervalToFrequencyRatio, ToneAudioBuffer, ToneBufferSource } from 'tone'
export function noteToMidi(note: string): number {
return Frequency(note).toMidi()
}
export function midiToNote(midi: number): string {
const frequency = Frequency(midi, 'midi')
const ret = frequency.toNote()
return ret
}
function midiToFrequencyRatio(midi: number): [number, number] {
const mod = midi % 3
if (mod === 1) {
return [midi - 1, intervalToFrequencyRatio(1)]
} else if (mod === 2) {
// @ts-ignore
return [midi + 1, intervalToFrequencyRatio(-1)]
} else {
return [midi, 1]
}
}
function createSource(buffer: ToneAudioBuffer | AudioBuffer): ToneBufferSource {
return new ToneBufferSource(buffer)
}
export function randomBetween(low: number, high: number): number {
return Math.random() * (high - low) + low
}