furnace/src/engine/macroInt.cpp

221 lines
5.3 KiB
C++
Raw Normal View History

2022-02-15 03:12:20 +00:00
/**
* Furnace Tracker - multi-system chiptune tracker
* Copyright (C) 2021-2022 tildearrow and contributors
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "macroInt.h"
#include "instrument.h"
2022-04-10 05:01:55 +00:00
void DivMacroStruct::doMacro(DivInstrumentMacro& source, bool released) {
2022-04-10 23:07:30 +00:00
if (finished) {
finished=false;
}
2022-04-10 05:01:55 +00:00
if (had!=has) {
finished=true;
}
2022-04-10 05:01:55 +00:00
had=has;
if (has) {
val=source.val[pos++];
if (source.rel>=0 && pos>source.rel && !released) {
if (source.loop<source.len && source.loop>=0 && source.loop<source.rel) {
pos=source.loop;
} else {
pos--;
}
}
if (pos>=source.len) {
if (source.loop<source.len && source.loop>=0 && (source.loop>=source.rel || source.rel>=source.len)) {
pos=source.loop;
} else {
has=false;
}
}
}
}
void DivMacroInt::next() {
if (ins==NULL) return;
2022-04-10 21:52:03 +00:00
// run macros
// TODO: potentially get rid of list to avoid allocations
2022-04-10 23:07:30 +00:00
for (size_t i=0; i<macroListLen; i++) {
if (macroList[i]!=NULL && macroSource[i]!=NULL) {
macroList[i]->doMacro(*macroSource[i],released);
2022-04-10 05:01:55 +00:00
}
}
}
void DivMacroInt::release() {
released=true;
}
2022-04-10 23:07:30 +00:00
#define ADD_MACRO(m,s) \
macroList[macroListLen]=&m; \
macroSource[macroListLen++]=&s;
void DivMacroInt::init(DivInstrument* which) {
ins=which;
// initialize
2022-04-10 23:07:30 +00:00
for (size_t i=0; i<macroListLen; i++) {
if (macroList[i]!=NULL) macroList[i]->init();
}
2022-04-10 23:07:30 +00:00
macroListLen=0;
released=false;
if (ins==NULL) return;
2022-04-10 05:01:55 +00:00
// prepare common macro
if (ins->std.volMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(vol,ins->std.volMacro);
2022-04-10 05:01:55 +00:00
}
if (ins->std.arpMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(arp,ins->std.arpMacro);
2022-04-10 05:01:55 +00:00
}
if (ins->std.dutyMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(duty,ins->std.dutyMacro);
2022-04-10 05:01:55 +00:00
}
if (ins->std.waveMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(wave,ins->std.waveMacro);
2022-04-10 05:01:55 +00:00
}
if (ins->std.pitchMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(pitch,ins->std.pitchMacro);
2022-04-10 05:01:55 +00:00
}
if (ins->std.ex1Macro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(ex1,ins->std.ex1Macro);
2022-04-10 05:01:55 +00:00
}
if (ins->std.ex2Macro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(ex2,ins->std.ex2Macro);
2022-04-10 05:01:55 +00:00
}
if (ins->std.ex3Macro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(ex3,ins->std.ex3Macro);
2022-04-10 05:01:55 +00:00
}
if (ins->std.algMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(alg,ins->std.algMacro);
2022-04-10 05:01:55 +00:00
}
if (ins->std.fbMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(fb,ins->std.fbMacro);
2022-04-10 05:01:55 +00:00
}
if (ins->std.fmsMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(fms,ins->std.fmsMacro);
2022-04-10 05:01:55 +00:00
}
if (ins->std.amsMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(ams,ins->std.amsMacro);
2022-04-10 05:01:55 +00:00
}
2021-05-16 17:47:05 +00:00
2022-04-10 05:01:55 +00:00
if (ins->std.panLMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(panL,ins->std.panLMacro);
}
2022-04-10 05:01:55 +00:00
if (ins->std.panRMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(panR,ins->std.panRMacro);
2022-04-10 05:01:55 +00:00
}
if (ins->std.phaseResetMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(phaseReset,ins->std.phaseResetMacro);
2022-04-10 05:01:55 +00:00
}
if (ins->std.ex4Macro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(ex4,ins->std.ex4Macro);
2022-04-10 05:01:55 +00:00
}
if (ins->std.ex5Macro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(ex5,ins->std.ex5Macro);
2022-04-10 05:01:55 +00:00
}
if (ins->std.ex6Macro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(ex6,ins->std.ex6Macro);
2022-04-10 05:01:55 +00:00
}
if (ins->std.ex7Macro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(ex7,ins->std.ex7Macro);
2022-04-10 05:01:55 +00:00
}
if (ins->std.ex8Macro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(ex8,ins->std.ex8Macro);
2021-05-16 17:47:05 +00:00
}
2022-04-10 05:01:55 +00:00
// prepare FM operator macros
for (int i=0; i<4; i++) {
DivInstrumentSTD::OpMacro& m=ins->std.opMacros[i];
IntOp& o=op[i];
2022-04-10 05:01:55 +00:00
if (m.amMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.am,m.amMacro);
}
2022-04-10 05:01:55 +00:00
if (m.arMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.ar,m.arMacro);
}
2022-04-10 05:01:55 +00:00
if (m.drMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.dr,m.drMacro);
}
2022-04-10 05:01:55 +00:00
if (m.multMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.mult,m.multMacro);
}
2022-04-10 05:01:55 +00:00
if (m.rrMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.rr,m.rrMacro);
}
2022-04-10 05:01:55 +00:00
if (m.slMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.sl,m.slMacro);
}
2022-04-10 05:01:55 +00:00
if (m.tlMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.tl,m.tlMacro);
}
2022-04-10 05:01:55 +00:00
if (m.dt2Macro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.dt2,m.dt2Macro);
}
2022-04-10 05:01:55 +00:00
if (m.rsMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.rs,m.rsMacro);
}
2022-04-10 05:01:55 +00:00
if (m.dtMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.dt,m.dtMacro);
}
2022-04-10 05:01:55 +00:00
if (m.d2rMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.d2r,m.d2rMacro);
}
2022-04-10 05:01:55 +00:00
if (m.ssgMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.ssg,m.ssgMacro);
}
2022-04-10 05:01:55 +00:00
if (m.damMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.dam,m.damMacro);
2022-04-10 05:01:55 +00:00
}
if (m.dvbMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.dvb,m.dvbMacro);
}
2022-04-10 05:01:55 +00:00
if (m.egtMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.egt,m.egtMacro);
}
2022-04-10 05:01:55 +00:00
if (m.kslMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.ksl,m.kslMacro);
}
2022-04-10 05:01:55 +00:00
if (m.susMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.sus,m.susMacro);
}
2022-04-10 05:01:55 +00:00
if (m.vibMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.vib,m.vibMacro);
}
2022-04-10 05:01:55 +00:00
if (m.wsMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.ws,m.wsMacro);
}
2022-04-10 05:01:55 +00:00
if (m.ksrMacro.len>0) {
2022-04-10 23:07:30 +00:00
ADD_MACRO(o.ksr,m.ksrMacro);
}
2022-04-10 05:01:55 +00:00
}
2022-04-10 23:07:30 +00:00
for (size_t i=0; i<macroListLen; i++) {
macroList[i]->prepare(*macroSource[i]);
}
}
void DivMacroInt::notifyInsDeletion(DivInstrument* which) {
if (ins==which) {
init(NULL);
}
}