midiNoteToFreqIntSpc = (note) => {
const memOctFreq = 0x10;
const memFreqTable = 0x20;
const memNoteMultiply = 0x00;
const memResult = 0x02;
const baseOct = 5;
var s = SPC.createState();
s = SPC.write16(s, memOctFreq, FreqBaseNote);
s = FreqMultiplyTable.reduce(
(s, fm, i) => SPC.write16(s, memFreqTable + i * 2, fm),
s
);
s = SPC.ldy(s, 0);
s = SPC.lda(s, note);
s = SPC.ldx(s, 12);
s = SPC.div(s);
s = SPC.sec(s);
s = SPC.sbc(s, baseOct);
if (SPC.bne(s)) {
if (SPC.bmi(s)) {
do {
s = SPC.clc(s);
s = SPC.rorAddr(s, addrOctFreq + 1);
s = SPC.rorAddr(s, addrOctFreq);
s = SPC.inc(s);
} while (SPC.bne(s));
} else {
do {
s = SPC.clc(s);
s = SPC.rolAddr(s, addrOctFreq);
s = SPC.rolAddr(s, addrOctFreq + 1);
s = SPC.dec(s);
} while (SPC.bne(s));
}
}
s = SPC.tya(s);
s = SPC.asl(s);
s = SPC.tax(s);
s = SPC.ldaAddrX(s, memFreqTable + 1);
s = SPC.staAddr(s, memNoteMultiply + 1);
s = SPC.ldaAddrX(s, memFreqTable);
s = SPC.staAddr(s, memNoteMultiply);
s = SPC.ldyAddr(s, memOctFreq);
s = SPC.mul(s);
s = SPC.tya(s);
s = SPC.ldy(s, 0);
s = SPC.styaAddr(s, memResult);
s = SPC.ldyAddr(s, memOctFreq);
s = SPC.ldaAddr(s, memNoteMultiply + 1);
s = SPC.mul(s);
s = SPC.addw(s, memResult);
s = SPC.styaAddr(s, memResult);
s = SPC.ldyAddr(s, memOctFreq + 1);
s = SPC.ldaAddr(s, memNoteMultiply);
s = SPC.mul(s);
s = SPC.addw(s, memResult);
s = SPC.styaAddr(s, memResult);
s = SPC.ldyAddr(s, memOctFreq + 1);
s = SPC.ldaAddr(s, memNoteMultiply + 1);
s = SPC.mul(s);
s = SPC.tay(s);
s = SPC.lda(s, 0);
s = SPC.addw(s, memResult);
s = SPC.styaAddr(s, memResult);
return SPC.read16(s, memResult);
}