Merge pull request #1000 from eefano/scale-accidentals
accidentals in scale degrees
This commit is contained in:
commit
f1d491d52e
1 changed files with 21 additions and 4 deletions
|
|
@ -186,18 +186,35 @@ export const scale = register('scale', function (scale, pat) {
|
||||||
// legacy..
|
// legacy..
|
||||||
return pure(step);
|
return pure(step);
|
||||||
}
|
}
|
||||||
const asNumber = Number(step);
|
let asNumber = Number(step);
|
||||||
|
let semitones = 0;
|
||||||
if (isNaN(asNumber)) {
|
if (isNaN(asNumber)) {
|
||||||
logger(`[tonal] invalid scale step "${step}", expected number`, 'error');
|
step = String(step);
|
||||||
return silence;
|
if (!/^[-+]?\d+(#*|b*){1}$/.test(step)) {
|
||||||
|
logger(
|
||||||
|
`[tonal] invalid scale step "${step}", expected number or integer with optional # b suffixes`,
|
||||||
|
'error',
|
||||||
|
);
|
||||||
|
return silence;
|
||||||
|
}
|
||||||
|
const isharp = step.indexOf('#');
|
||||||
|
if (isharp >= 0) {
|
||||||
|
asNumber = Number(step.substring(0, isharp));
|
||||||
|
semitones = step.length - isharp;
|
||||||
|
} else {
|
||||||
|
const iflat = step.indexOf('b');
|
||||||
|
asNumber = Number(step.substring(0, iflat));
|
||||||
|
semitones = iflat - step.length;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
let note;
|
let note;
|
||||||
if (value.anchor) {
|
if (isObject && value.anchor) {
|
||||||
note = stepInNamedScale(asNumber, scale, value.anchor);
|
note = stepInNamedScale(asNumber, scale, value.anchor);
|
||||||
} else {
|
} else {
|
||||||
note = scaleStep(asNumber, scale);
|
note = scaleStep(asNumber, scale);
|
||||||
}
|
}
|
||||||
|
if (semitones != 0) note = Note.transpose(note, Interval.fromSemitones(semitones));
|
||||||
value = pure(isObject ? { ...value, note } : note);
|
value = pure(isObject ? { ...value, note } : note);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger(`[tonal] ${err.message}`, 'error');
|
logger(`[tonal] ${err.message}`, 'error');
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue