add freq support to sampler

This commit is contained in:
Felix Roos 2022-12-12 20:41:09 +01:00
parent 8b22c2e04f
commit df73ce8a60
5 changed files with 43 additions and 8 deletions

View file

@ -10,6 +10,7 @@ import {
tokenizeNote,
toMidi,
fromMidi,
freqToMidi,
_mod,
compose,
getFrequency,
@ -94,6 +95,12 @@ describe('fromMidi', () => {
expect(fromMidi(57)).toEqual(220);
});
});
describe('freqToMidi', () => {
it('should turn frequency into midi', () => {
expect(freqToMidi(440)).toEqual(69);
expect(freqToMidi(220)).toEqual(57);
});
});
describe('getFrequency', () => {
const happify = (val, context = {}) => pure(val).firstCycle()[0].setContext(context);
it('should turn note into frequency', () => {

View file

@ -31,6 +31,31 @@ export const fromMidi = (n) => {
return Math.pow(2, (n - 69) / 12) * 440;
};
export const freqToMidi = (freq) => {
return (12 * Math.log(freq / 440)) / Math.LN2 + 69;
};
export const valueToMidi = (value, fallbackValue) => {
if (typeof value !== 'object') {
throw new Error('Hap.getMidi: expected object value');
}
let { freq, note, n } = value;
note = note ?? n;
if (typeof freq === 'number') {
return freqToMidi(freq);
}
if (typeof note === 'string') {
return toMidi(note);
}
if (typeof note === 'number') {
return note;
}
if (!fallbackValue) {
throw new Error('Hap.getMidi: expected freq or n / note to be set');
}
return fallbackValue;
};
/**
* @deprecated does not appear to be referenced or invoked anywhere in the codebase
*/