annotate win95kggui/dep/ft2play/pmp_main.c @ 133:0d8eabdd12ab default tip

create: write H:MM:SS timestamps, add option to fill with gaussian-blur instead of black many albums are longer than one hour so writing H:MM:SS is a necessity. if anything there will just be verbose info that isn't important for my use-case. however the gaussian-blur is simply broken. It works, and it plays locally just fine, but YouTube in particular elongates the video to fit the full width. I'm not entirely sure why it does this, but it makes it useless and ugly.
author Paper <paper@tflc.us>
date Sat, 03 Jan 2026 20:25:38 -0500
parents 8e4ee43d3b81
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
126
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1 /* - main XM replayer -
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
2 **
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
3 ** NOTE: Effect handling is slightly different because
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
4 ** I've removed the channel muting logic.
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
5 ** Muted channels would only process *some* effects, but
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
6 ** since we can't mute channels, we don't care about this.
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
7 **
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
8 ** In FT2, the only way to mute a channel is through the
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
9 ** tracker itself, so this is not really needed in a replayer.
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
10 */
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
11
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
12 #include <stdio.h>
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
13 #include <stdint.h>
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
14 #include <stdbool.h>
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
15 #include "pmplay.h"
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
16 #include "pmp_mix.h"
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
17 #include "snd_masm.h"
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
18 #include "tables.h"
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
19
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
20 #define MAX_FRQ 32000
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
21 #define MAX_NOTES (10*12*16+16)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
22
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
23 static tonTyp nilPatternLine[32]; // 8bb: used for non-allocated (empty) patterns
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
24
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
25 typedef void (*volKolEfxRoutine)(stmTyp *ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
26 typedef void (*volKolEfxRoutine2)(stmTyp *ch, uint8_t *volKol);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
27 typedef void (*efxRoutine)(stmTyp *ch, uint8_t param);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
28
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
29 static void retrigVolume(stmTyp *ch)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
30 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
31 ch->realVol = ch->oldVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
32 ch->outVol = ch->oldVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
33 ch->outPan = ch->oldPan;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
34 ch->status |= IS_Vol + IS_Pan + IS_QuickVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
35 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
36
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
37 static void retrigEnvelopeVibrato(stmTyp *ch)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
38 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
39 // 8bb: reset vibrato position
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
40 if (!(ch->waveCtrl & 0x04))
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
41 ch->vibPos = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
42
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
43 /*
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
44 ** 8bb:
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
45 ** In FT2.00 .. FT2.09, if the sixth bit of "ch->waveCtrl" is set
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
46 ** (from effect E7x where x is $4..$7 or $C..$F) and you trigger a note,
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
47 ** the replayer interrupt will freeze / lock up. This is because of a
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
48 ** label bug in the original code, causing it to jump back to itself
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
49 ** indefinitely.
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
50 */
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
51
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
52 // 8bb: safely reset tremolo position
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
53 if (!(ch->waveCtrl & 0x40))
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
54 ch->tremPos = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
55
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
56 ch->retrigCnt = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
57 ch->tremorPos = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
58
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
59 ch->envSustainActive = true;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
60
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
61 instrTyp *ins = ch->instrSeg;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
62
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
63 if (ins->envVTyp & ENV_ENABLED)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
64 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
65 ch->envVCnt = 65535;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
66 ch->envVPos = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
67 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
68
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
69 if (ins->envPTyp & ENV_ENABLED)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
70 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
71 ch->envPCnt = 65535;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
72 ch->envPPos = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
73 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
74
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
75 ch->fadeOutSpeed = ins->fadeOut; // 8bb: ranges 0..4095 (FT2 doesn't check if it's higher than 4095!)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
76
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
77 // 8bb: final fadeout range is in fact 0..32768, and not 0..65536 like the XM format doc says
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
78 ch->fadeOutAmp = 32768;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
79
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
80 if (ins->vibDepth > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
81 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
82 ch->eVibPos = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
83
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
84 if (ins->vibSweep > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
85 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
86 ch->eVibAmp = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
87 ch->eVibSweep = (ins->vibDepth << 8) / ins->vibSweep;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
88 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
89 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
90 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
91 ch->eVibAmp = ins->vibDepth << 8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
92 ch->eVibSweep = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
93 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
94 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
95 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
96
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
97 static void keyOff(stmTyp *ch)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
98 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
99 instrTyp *ins = ch->instrSeg;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
100
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
101 if (!(ins->envPTyp & ENV_ENABLED)) // 8bb: probably an FT2 bug
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
102 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
103 if (ch->envPCnt >= (uint16_t)ins->envPP[ch->envPPos][0])
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
104 ch->envPCnt = ins->envPP[ch->envPPos][0]-1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
105 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
106
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
107 if (ins->envVTyp & ENV_ENABLED)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
108 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
109 if (ch->envVCnt >= (uint16_t)ins->envVP[ch->envVPos][0])
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
110 ch->envVCnt = ins->envVP[ch->envVPos][0]-1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
111 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
112 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
113 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
114 ch->realVol = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
115 ch->outVol = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
116 ch->status |= IS_Vol + IS_QuickVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
117 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
118
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
119 ch->envSustainActive = false;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
120 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
121
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
122 uint32_t getFrequenceValue(uint16_t period) // 8bb: converts period to 16.16fp resampling delta
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
123 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
124 uint32_t delta;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
125
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
126 if (period == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
127 return 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
128
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
129 if (linearFrqTab)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
130 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
131 const uint16_t invPeriod = (12 * 192 * 4) - period; // 8bb: this intentionally underflows uint16_t to be accurate to FT2
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
132
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
133 const uint32_t quotient = invPeriod / 768;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
134 const uint32_t remainder = invPeriod % 768;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
135
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
136 const int32_t octShift = 14 - quotient;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
137
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
138 delta = (uint32_t)(((int64_t)logTab[remainder] * (int32_t)frequenceMulFactor) >> 24);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
139 delta >>= (octShift & 31); // 8bb: added needed 32-bit bitshift mask
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
140 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
141 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
142 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
143 delta = frequenceDivFactor / (uint32_t)period;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
144 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
145
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
146 return delta;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
147 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
148
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
149 static void startTone(uint8_t ton, uint8_t effTyp, uint8_t eff, stmTyp *ch)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
150 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
151 if (ton == NOTE_KEYOFF)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
152 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
153 keyOff(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
154 return;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
155 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
156
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
157 // 8bb: if we came from Rxy (retrig), we didn't check note (Ton) yet
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
158 if (ton == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
159 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
160 ton = ch->tonNr;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
161 if (ton == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
162 return; // 8bb: if still no note, return
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
163 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
164
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
165 ch->tonNr = ton;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
166
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
167 instrTyp *ins = instr[ch->instrNr];
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
168 if (ins == NULL)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
169 ins = instr[0];
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
170
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
171 ch->instrSeg = ins;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
172 ch->mute = ins->mute;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
173
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
174 uint8_t smp = ins->ta[ton-1] & 0xF; // 8bb: added for safety
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
175 ch->sampleNr = smp;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
176
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
177 sampleTyp *s = &ins->samp[smp];
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
178 ch->relTonNr = s->relTon;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
179
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
180 ton += ch->relTonNr;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
181 if (ton >= 10*12)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
182 return;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
183
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
184 ch->oldVol = s->vol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
185 ch->oldPan = s->pan;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
186
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
187 if (effTyp == 0x0E && (eff & 0xF0) == 0x50) // 8bb: EFx - Set Finetune
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
188 ch->fineTune = ((eff & 0x0F) << 4) - 128;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
189 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
190 ch->fineTune = s->fine;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
191
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
192 if (ton != 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
193 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
194 const uint16_t tmpTon = ((ton-1) << 4) + (((int8_t)ch->fineTune >> 3) + 16); // 8bb: 0..1935
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
195 if (tmpTon < MAX_NOTES) // 8bb: tmpTon is *always* below MAX_NOTES here, this check is not needed
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
196 ch->outPeriod = ch->realPeriod = note2Period[tmpTon];
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
197 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
198
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
199 ch->status |= IS_Period + IS_Vol + IS_Pan + IS_NyTon + IS_QuickVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
200
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
201 if (effTyp == 9) // 8bb: 9xx - Set Sample Offset
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
202 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
203 if (eff)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
204 ch->smpOffset = ch->eff;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
205
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
206 ch->smpStartPos = ch->smpOffset << 8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
207 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
208 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
209 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
210 ch->smpStartPos = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
211 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
212
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
213 P_StartTone(s, ch->smpStartPos);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
214 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
215
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
216 static void volume(stmTyp *ch, uint8_t param); // 8bb: volume slide
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
217 static void vibrato2(stmTyp *ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
218 static void tonePorta(stmTyp *ch, uint8_t param);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
219
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
220 static void dummy(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
221 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
222 return;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
223
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
224 (void)ch;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
225 (void)param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
226 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
227
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
228 static void finePortaUp(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
229 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
230 if (param == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
231 param = ch->fPortaUpSpeed;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
232
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
233 ch->fPortaUpSpeed = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
234
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
235 ch->realPeriod -= param << 2;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
236 if ((int16_t)ch->realPeriod < 1)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
237 ch->realPeriod = 1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
238
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
239 ch->outPeriod = ch->realPeriod;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
240 ch->status |= IS_Period;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
241 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
242
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
243 static void finePortaDown(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
244 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
245 if (param == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
246 param = ch->fPortaDownSpeed;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
247
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
248 ch->fPortaDownSpeed = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
249
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
250 ch->realPeriod += param << 2;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
251 if ((int16_t)ch->realPeriod > MAX_FRQ-1) // 8bb: FT2 bug, should've been unsigned comparison!
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
252 ch->realPeriod = MAX_FRQ-1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
253
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
254 ch->outPeriod = ch->realPeriod;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
255 ch->status |= IS_Period;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
256 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
257
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
258 static void setGlissCtrl(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
259 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
260 ch->glissFunk = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
261 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
262
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
263 static void setVibratoCtrl(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
264 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
265 ch->waveCtrl = (ch->waveCtrl & 0xF0) | param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
266 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
267
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
268 static void jumpLoop(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
269 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
270 if (param == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
271 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
272 ch->pattPos = song.pattPos & 0xFF;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
273 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
274 else if (ch->loopCnt == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
275 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
276 ch->loopCnt = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
277
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
278 song.pBreakPos = ch->pattPos;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
279 song.pBreakFlag = true;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
280 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
281 else if (--ch->loopCnt > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
282 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
283 song.pBreakPos = ch->pattPos;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
284 song.pBreakFlag = true;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
285 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
286 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
287
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
288 static void setTremoloCtrl(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
289 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
290 ch->waveCtrl = (param << 4) | (ch->waveCtrl & 0x0F);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
291 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
292
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
293 static void volFineUp(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
294 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
295 if (param == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
296 param = ch->fVolSlideUpSpeed;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
297
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
298 ch->fVolSlideUpSpeed = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
299
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
300 ch->realVol += param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
301 if (ch->realVol > 64)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
302 ch->realVol = 64;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
303
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
304 ch->outVol = ch->realVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
305 ch->status |= IS_Vol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
306 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
307
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
308 static void volFineDown(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
309 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
310 if (param == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
311 param = ch->fVolSlideDownSpeed;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
312
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
313 ch->fVolSlideDownSpeed = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
314
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
315 ch->realVol -= param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
316 if ((int8_t)ch->realVol < 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
317 ch->realVol = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
318
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
319 ch->outVol = ch->realVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
320 ch->status |= IS_Vol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
321 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
322
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
323 static void noteCut0(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
324 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
325 if (param == 0) // 8bb: only a parameter of zero is handled here
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
326 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
327 ch->realVol = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
328 ch->outVol = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
329 ch->status |= IS_Vol + IS_QuickVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
330 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
331 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
332
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
333 static void pattDelay(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
334 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
335 if (song.pattDelTime2 == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
336 song.pattDelTime = param + 1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
337
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
338 (void)ch;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
339 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
340
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
341 static const efxRoutine EJumpTab_TickZero[16] =
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
342 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
343 dummy, // 0
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
344 finePortaUp, // 1
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
345 finePortaDown, // 2
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
346 setGlissCtrl, // 3
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
347 setVibratoCtrl, // 4
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
348 dummy, // 5
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
349 jumpLoop, // 6
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
350 setTremoloCtrl, // 7
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
351 dummy, // 8
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
352 dummy, // 9
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
353 volFineUp, // A
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
354 volFineDown, // B
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
355 noteCut0, // C
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
356 dummy, // D
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
357 pattDelay, // E
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
358 dummy // F
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
359 };
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
360
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
361 static void E_Effects_TickZero(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
362 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
363 EJumpTab_TickZero[param >> 4](ch, param & 0x0F);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
364 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
365
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
366 static void posJump(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
367 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
368 song.songPos = (int16_t)param - 1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
369 song.pBreakPos = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
370 song.posJumpFlag = true;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
371
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
372 (void)ch;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
373 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
374
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
375 static void pattBreak(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
376 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
377 song.posJumpFlag = true;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
378
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
379 param = ((param >> 4) * 10) + (param & 0x0F);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
380 if (param <= 63)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
381 song.pBreakPos = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
382 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
383 song.pBreakPos = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
384
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
385 (void)ch;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
386 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
387
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
388 static void setSpeed(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
389 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
390 if (param >= 32)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
391 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
392 song.speed = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
393 P_SetSpeed(song.speed);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
394 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
395 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
396 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
397 song.timer = song.tempo = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
398 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
399
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
400 (void)ch;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
401 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
402
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
403 static void setGlobaVol(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
404 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
405 if (param > 64)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
406 param = 64;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
407
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
408 song.globVol = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
409
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
410 stmTyp *c = stm;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
411 for (int32_t i = 0; i < song.antChn; i++, c++) // 8bb: this updates the volume for all voices
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
412 c->status |= IS_Vol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
413
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
414 (void)ch;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
415 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
416
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
417 static void setEnvelopePos(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
418 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
419 int8_t envPos;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
420 bool envUpdate;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
421 int16_t newEnvPos;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
422
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
423 instrTyp *ins = ch->instrSeg;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
424
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
425 // *** VOLUME ENVELOPE ***
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
426 if (ins->envVTyp & ENV_ENABLED)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
427 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
428 ch->envVCnt = param - 1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
429
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
430 envPos = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
431 envUpdate = true;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
432 newEnvPos = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
433
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
434 if (ins->envVPAnt > 1)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
435 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
436 envPos++;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
437 for (int32_t i = 0; i < ins->envVPAnt-1; i++)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
438 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
439 if (newEnvPos < ins->envVP[envPos][0])
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
440 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
441 envPos--;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
442
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
443 newEnvPos -= ins->envVP[envPos][0];
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
444 if (newEnvPos == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
445 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
446 envUpdate = false;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
447 break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
448 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
449
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
450 if (ins->envVP[envPos+1][0] <= ins->envVP[envPos][0])
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
451 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
452 envUpdate = true;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
453 break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
454 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
455
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
456 ch->envVIPValue = ((ins->envVP[envPos+1][1] - ins->envVP[envPos][1]) & 0xFF) << 8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
457 ch->envVIPValue /= (ins->envVP[envPos+1][0] - ins->envVP[envPos][0]);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
458
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
459 ch->envVAmp = (ch->envVIPValue * (newEnvPos - 1)) + ((ins->envVP[envPos][1] & 0xFF) << 8);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
460
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
461 envPos++;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
462
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
463 envUpdate = false;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
464 break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
465 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
466
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
467 envPos++;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
468 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
469
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
470 if (envUpdate)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
471 envPos--;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
472 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
473
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
474 if (envUpdate)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
475 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
476 ch->envVIPValue = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
477 ch->envVAmp = (ins->envVP[envPos][1] & 0xFF) << 8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
478 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
479
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
480 if (envPos >= ins->envVPAnt)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
481 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
482 envPos = ins->envVPAnt - 1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
483 if (envPos < 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
484 envPos = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
485 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
486
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
487 ch->envVPos = envPos;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
488 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
489
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
490 // *** PANNING ENVELOPE ***
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
491 if (ins->envVTyp & ENV_SUSTAIN) // 8bb: FT2 bug? (should probably have been "ins->envPTyp & ENV_ENABLED")
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
492 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
493 ch->envPCnt = param - 1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
494
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
495 envPos = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
496 envUpdate = true;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
497 newEnvPos = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
498
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
499 if (ins->envPPAnt > 1)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
500 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
501 envPos++;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
502 for (int32_t i = 0; i < ins->envPPAnt-1; i++)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
503 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
504 if (newEnvPos < ins->envPP[envPos][0])
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
505 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
506 envPos--;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
507
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
508 newEnvPos -= ins->envPP[envPos][0];
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
509 if (newEnvPos == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
510 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
511 envUpdate = false;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
512 break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
513 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
514
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
515 if (ins->envPP[envPos + 1][0] <= ins->envPP[envPos][0])
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
516 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
517 envUpdate = true;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
518 break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
519 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
520
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
521 ch->envPIPValue = ((ins->envPP[envPos+1][1] - ins->envPP[envPos][1]) & 0xFF) << 8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
522 ch->envPIPValue /= (ins->envPP[envPos+1][0] - ins->envPP[envPos][0]);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
523
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
524 ch->envPAmp = (ch->envPIPValue * (newEnvPos - 1)) + ((ins->envPP[envPos][1] & 0xFF) << 8);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
525
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
526 envPos++;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
527
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
528 envUpdate = false;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
529 break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
530 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
531
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
532 envPos++;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
533 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
534
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
535 if (envUpdate)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
536 envPos--;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
537 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
538
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
539 if (envUpdate)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
540 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
541 ch->envPIPValue = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
542 ch->envPAmp = (ins->envPP[envPos][1] & 0xFF) << 8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
543 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
544
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
545 if (envPos >= ins->envPPAnt)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
546 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
547 envPos = ins->envPPAnt - 1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
548 if (envPos < 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
549 envPos = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
550 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
551
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
552 ch->envPPos = envPos;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
553 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
554 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
555
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
556 /* -- tick-zero volume column effects --
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
557 ** 2nd parameter is used for a volume column quirk with the Rxy command (multiretrig)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
558 */
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
559
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
560 static void v_SetVibSpeed(stmTyp *ch, uint8_t *volKol)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
561 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
562 *volKol = (ch->volKolVol & 0x0F) << 2;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
563 if (*volKol != 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
564 ch->vibSpeed = *volKol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
565 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
566
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
567 static void v_Volume(stmTyp *ch, uint8_t *volKol)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
568 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
569 *volKol -= 16;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
570 if (*volKol > 64) // 8bb: no idea why FT2 has this check, this can't happen...
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
571 *volKol = 64;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
572
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
573 ch->outVol = ch->realVol = *volKol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
574 ch->status |= IS_Vol + IS_QuickVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
575 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
576
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
577 static void v_FineSlideDown(stmTyp *ch, uint8_t *volKol)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
578 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
579 *volKol = (uint8_t)(0 - (ch->volKolVol & 0x0F)) + ch->realVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
580 if ((int8_t)*volKol < 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
581 *volKol = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
582
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
583 ch->outVol = ch->realVol = *volKol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
584 ch->status |= IS_Vol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
585 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
586
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
587 static void v_FineSlideUp(stmTyp *ch, uint8_t *volKol)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
588 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
589 *volKol = (ch->volKolVol & 0x0F) + ch->realVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
590 if (*volKol > 64)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
591 *volKol = 64;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
592
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
593 ch->outVol = ch->realVol = *volKol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
594 ch->status |= IS_Vol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
595 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
596
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
597 static void v_SetPan(stmTyp *ch, uint8_t *volKol)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
598 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
599 *volKol <<= 4;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
600
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
601 ch->outPan = *volKol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
602 ch->status |= IS_Pan;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
603 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
604
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
605 // -- non-tick-zero volume column effects --
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
606
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
607 static void v_SlideDown(stmTyp *ch)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
608 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
609 uint8_t newVol = (uint8_t)(0 - (ch->volKolVol & 0x0F)) + ch->realVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
610 if ((int8_t)newVol < 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
611 newVol = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
612
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
613 ch->outVol = ch->realVol = newVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
614 ch->status |= IS_Vol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
615 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
616
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
617 static void v_SlideUp(stmTyp *ch)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
618 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
619 uint8_t newVol = (ch->volKolVol & 0x0F) + ch->realVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
620 if (newVol > 64)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
621 newVol = 64;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
622
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
623 ch->outVol = ch->realVol = newVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
624 ch->status |= IS_Vol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
625 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
626
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
627 static void v_Vibrato(stmTyp *ch)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
628 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
629 const uint8_t param = ch->volKolVol & 0xF;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
630 if (param > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
631 ch->vibDepth = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
632
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
633 vibrato2(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
634 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
635
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
636 static void v_PanSlideLeft(stmTyp *ch)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
637 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
638 uint16_t tmp16 = (uint8_t)(0 - (ch->volKolVol & 0x0F)) + ch->outPan;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
639 if (tmp16 < 256) // 8bb: includes an FT2 bug: pan-slide-left of 0 = set pan to 0
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
640 tmp16 = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
641
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
642 ch->outPan = (uint8_t)tmp16;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
643 ch->status |= IS_Pan;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
644 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
645
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
646 static void v_PanSlideRight(stmTyp *ch)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
647 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
648 uint16_t tmp16 = (ch->volKolVol & 0x0F) + ch->outPan;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
649 if (tmp16 > 255)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
650 tmp16 = 255;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
651
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
652 ch->outPan = (uint8_t)tmp16;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
653 ch->status |= IS_Pan;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
654 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
655
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
656 static void v_TonePorta(stmTyp *ch)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
657 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
658 tonePorta(ch, 0); // 8bb: the last parameter is actually not used in tonePorta()
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
659 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
660
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
661 static void v_dummy(stmTyp *ch)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
662 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
663 (void)ch;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
664 return;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
665 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
666
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
667 static void v_dummy2(stmTyp *ch, uint8_t *volKol)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
668 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
669 (void)ch;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
670 (void)volKol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
671 return;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
672 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
673
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
674 static const volKolEfxRoutine VJumpTab_TickNonZero[16] =
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
675 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
676 v_dummy, v_dummy, v_dummy, v_dummy,
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
677 v_dummy, v_dummy, v_SlideDown, v_SlideUp,
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
678 v_dummy, v_dummy, v_dummy, v_Vibrato,
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
679 v_dummy, v_PanSlideLeft, v_PanSlideRight, v_TonePorta
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
680 };
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
681
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
682 static const volKolEfxRoutine2 VJumpTab_TickZero[16] =
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
683 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
684 v_dummy2, v_Volume, v_Volume, v_Volume,
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
685 v_Volume, v_Volume, v_dummy2, v_dummy2,
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
686 v_FineSlideDown, v_FineSlideUp, v_SetVibSpeed, v_dummy2,
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
687 v_SetPan, v_dummy2, v_dummy2, v_dummy2
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
688 };
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
689
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
690 static void setPan(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
691 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
692 ch->outPan = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
693 ch->status |= IS_Pan;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
694 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
695
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
696 static void setVol(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
697 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
698 if (param > 64)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
699 param = 64;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
700
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
701 ch->outVol = ch->realVol = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
702 ch->status |= IS_Vol + IS_QuickVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
703 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
704
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
705 static void xFinePorta(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
706 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
707 const uint8_t type = param >> 4;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
708 param &= 0x0F;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
709
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
710 if (type == 0x1) // extra fine porta up
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
711 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
712 if (param == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
713 param = ch->ePortaUpSpeed;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
714
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
715 ch->ePortaUpSpeed = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
716
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
717 uint16_t newPeriod = ch->realPeriod;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
718
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
719 newPeriod -= param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
720 if ((int16_t)newPeriod < 1)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
721 newPeriod = 1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
722
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
723 ch->outPeriod = ch->realPeriod = newPeriod;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
724 ch->status |= IS_Period;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
725 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
726 else if (type == 0x2) // extra fine porta down
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
727 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
728 if (param == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
729 param = ch->ePortaDownSpeed;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
730
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
731 ch->ePortaDownSpeed = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
732
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
733 uint16_t newPeriod = ch->realPeriod;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
734
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
735 newPeriod += param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
736 if ((int16_t)newPeriod > MAX_FRQ-1) // 8bb: FT2 bug, should've been unsigned comparison!
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
737 newPeriod = MAX_FRQ-1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
738
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
739 ch->outPeriod = ch->realPeriod = newPeriod;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
740 ch->status |= IS_Period;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
741 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
742 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
743
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
744 static void doMultiRetrig(stmTyp *ch, uint8_t param) // 8bb: "param" is never used (needed for efx jumptable structure)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
745 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
746 uint8_t cnt = ch->retrigCnt + 1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
747 if (cnt < ch->retrigSpeed)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
748 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
749 ch->retrigCnt = cnt;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
750 return;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
751 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
752
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
753 ch->retrigCnt = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
754
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
755 int16_t vol = ch->realVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
756 switch (ch->retrigVol)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
757 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
758 case 0x1: vol -= 1; break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
759 case 0x2: vol -= 2; break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
760 case 0x3: vol -= 4; break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
761 case 0x4: vol -= 8; break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
762 case 0x5: vol -= 16; break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
763 case 0x6: vol = (vol >> 1) + (vol >> 3) + (vol >> 4); break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
764 case 0x7: vol >>= 1; break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
765 case 0x8: break; // 8bb: does not change the volume
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
766 case 0x9: vol += 1; break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
767 case 0xA: vol += 2; break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
768 case 0xB: vol += 4; break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
769 case 0xC: vol += 8; break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
770 case 0xD: vol += 16; break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
771 case 0xE: vol = (vol >> 1) + vol; break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
772 case 0xF: vol += vol; break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
773 default: break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
774 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
775 vol = CLAMP(vol, 0, 64);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
776
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
777 ch->realVol = (uint8_t)vol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
778 ch->outVol = ch->realVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
779
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
780 if (ch->volKolVol >= 0x10 && ch->volKolVol <= 0x50) // 8bb: Set Volume (volume column)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
781 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
782 ch->outVol = ch->volKolVol - 0x10;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
783 ch->realVol = ch->outVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
784 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
785 else if (ch->volKolVol >= 0xC0 && ch->volKolVol <= 0xCF) // 8bb: Set Panning (volume column)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
786 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
787 ch->outPan = (ch->volKolVol & 0x0F) << 4;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
788 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
789
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
790 startTone(0, 0, 0, ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
791
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
792 (void)param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
793 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
794
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
795 static void multiRetrig(stmTyp *ch, uint8_t param, uint8_t volumeColumnData)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
796 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
797 uint8_t tmpParam;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
798
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
799 tmpParam = param & 0x0F;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
800 if (tmpParam == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
801 tmpParam = ch->retrigSpeed;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
802
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
803 ch->retrigSpeed = tmpParam;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
804
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
805 tmpParam = param >> 4;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
806 if (tmpParam == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
807 tmpParam = ch->retrigVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
808
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
809 ch->retrigVol = tmpParam;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
810
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
811 if (volumeColumnData == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
812 doMultiRetrig(ch, 0); // 8bb: the second parameter is never used (needed for efx jumptable structure)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
813 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
814
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
815 static const efxRoutine JumpTab_TickZero[36] =
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
816 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
817 dummy, // 0
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
818 dummy, // 1
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
819 dummy, // 2
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
820 dummy, // 3
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
821 dummy, // 4
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
822 dummy, // 5
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
823 dummy, // 6
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
824 dummy, // 7
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
825 setPan, // 8
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
826 dummy, // 9
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
827 dummy, // A
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
828 posJump, // B
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
829 setVol, // C
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
830 pattBreak, // D
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
831 E_Effects_TickZero, // E
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
832 setSpeed, // F
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
833 setGlobaVol, // G
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
834 dummy, // H
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
835 dummy, // I
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
836 dummy, // J
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
837 dummy, // K
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
838 setEnvelopePos, // L
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
839 dummy, // M
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
840 dummy, // N
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
841 dummy, // O
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
842 dummy, // P
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
843 dummy, // Q
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
844 dummy, // R
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
845 dummy, // S
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
846 dummy, // T
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
847 dummy, // U
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
848 dummy, // V
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
849 dummy, // W
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
850 xFinePorta, // X
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
851 dummy, // Y
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
852 dummy // Z
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
853 };
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
854
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
855 static void checkEffects(stmTyp *ch) // tick0 effect handling
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
856 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
857 // volume column effects
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
858 uint8_t newVolKol = ch->volKolVol; // 8bb: manipulated by vol. column effects, then used for multiretrig check (FT2 quirk)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
859 VJumpTab_TickZero[ch->volKolVol >> 4](ch, &newVolKol);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
860
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
861 // normal effects
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
862 const uint8_t param = ch->eff;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
863
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
864 if ((ch->effTyp == 0 && param == 0) || ch->effTyp > 35)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
865 return;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
866
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
867 // 8bb: this one has to be done here instead of in the jumptable, as it needs the "newVolKol" parameter (FT2 quirk)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
868 if (ch->effTyp == 27) // 8bb: Rxy - Multi Retrig
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
869 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
870 multiRetrig(ch, param, newVolKol);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
871 return;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
872 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
873
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
874 JumpTab_TickZero[ch->effTyp](ch, ch->eff);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
875 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
876
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
877 static void fixTonePorta(stmTyp *ch, const tonTyp *p, uint8_t inst)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
878 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
879 if (p->ton > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
880 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
881 if (p->ton == NOTE_KEYOFF)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
882 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
883 keyOff(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
884 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
885 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
886 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
887 const uint16_t portaTmp = (((p->ton-1) + ch->relTonNr) << 4) + (((int8_t)ch->fineTune >> 3) + 16);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
888 if (portaTmp < MAX_NOTES)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
889 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
890 ch->wantPeriod = note2Period[portaTmp];
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
891
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
892 if (ch->wantPeriod == ch->realPeriod)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
893 ch->portaDir = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
894 else if (ch->wantPeriod > ch->realPeriod)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
895 ch->portaDir = 1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
896 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
897 ch->portaDir = 2;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
898 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
899 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
900 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
901
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
902 if (inst > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
903 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
904 retrigVolume(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
905
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
906 if (p->ton != NOTE_KEYOFF)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
907 retrigEnvelopeVibrato(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
908 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
909 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
910
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
911 static void getNewNote(stmTyp *ch, const tonTyp *p)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
912 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
913 ch->volKolVol = p->vol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
914
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
915 if (ch->effTyp == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
916 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
917 if (ch->eff != 0) // 8bb: we have an arpeggio (0xy) running, set period back
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
918 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
919 ch->outPeriod = ch->realPeriod;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
920 ch->status |= IS_Period;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
921 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
922 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
923 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
924 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
925 // 8bb: if we have a vibrato (4xy/6xy) on previous row (ch) that ends at current row (p), set period back
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
926 if ((ch->effTyp == 4 || ch->effTyp == 6) && (p->effTyp != 4 && p->effTyp != 6))
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
927 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
928 ch->outPeriod = ch->realPeriod;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
929 ch->status |= IS_Period;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
930 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
931 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
932
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
933 ch->effTyp = p->effTyp;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
934 ch->eff = p->eff;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
935 ch->tonTyp = (p->instr << 8) | p->ton;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
936
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
937 // 8bb: 'inst' var is used for later if-checks
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
938 uint8_t inst = p->instr;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
939 if (inst > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
940 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
941 if (inst <= 128)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
942 ch->instrNr = inst;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
943 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
944 inst = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
945 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
946
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
947 bool checkEfx = true;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
948 if (p->effTyp == 0x0E) // 8bb: check for EDx (Note Delay) and E90 (Retrigger Note)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
949 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
950 if (p->eff >= 0xD1 && p->eff <= 0xDF) // 8bb: ED1..EDF (Note Delay)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
951 return;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
952 else if (p->eff == 0x90) // 8bb: E90 (Retrigger Note)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
953 checkEfx = false;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
954 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
955
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
956 if (checkEfx)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
957 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
958 if ((ch->volKolVol & 0xF0) == 0xF0) // 8bb: Portamento (volume column)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
959 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
960 const uint8_t volKolParam = ch->volKolVol & 0x0F;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
961 if (volKolParam > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
962 ch->portaSpeed = volKolParam << 6;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
963
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
964 fixTonePorta(ch, p, inst);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
965 checkEffects(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
966 return;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
967 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
968
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
969 if (p->effTyp == 3 || p->effTyp == 5) // 8bb: Portamento (3xx/5xx)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
970 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
971 if (p->effTyp != 5 && p->eff != 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
972 ch->portaSpeed = p->eff << 2;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
973
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
974 fixTonePorta(ch, p, inst);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
975 checkEffects(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
976 return;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
977 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
978
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
979 if (p->effTyp == 0x14 && p->eff == 0) // 8bb: K00 (Key Off - only handle tick 0 here)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
980 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
981 keyOff(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
982
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
983 if (inst)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
984 retrigVolume(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
985
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
986 checkEffects(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
987 return;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
988 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
989
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
990 if (p->ton == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
991 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
992 if (inst > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
993 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
994 retrigVolume(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
995 retrigEnvelopeVibrato(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
996 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
997
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
998 checkEffects(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
999 return;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1000 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1001 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1002
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1003 if (p->ton == NOTE_KEYOFF)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1004 keyOff(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1005 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1006 startTone(p->ton, p->effTyp, p->eff, ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1007
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1008 if (inst > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1009 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1010 retrigVolume(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1011 if (p->ton != NOTE_KEYOFF)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1012 retrigEnvelopeVibrato(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1013 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1014
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1015 checkEffects(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1016 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1017
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1018 static void fixaEnvelopeVibrato(stmTyp *ch)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1019 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1020 bool envInterpolateFlag, envDidInterpolate;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1021 uint8_t envPos;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1022 int16_t autoVibVal;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1023 uint16_t autoVibAmp, envVal;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1024 uint32_t vol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1025
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1026 instrTyp *ins = ch->instrSeg;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1027
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1028 // *** FADEOUT ***
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1029 if (!ch->envSustainActive)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1030 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1031 ch->status |= IS_Vol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1032
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1033 if (ch->fadeOutAmp >= ch->fadeOutSpeed)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1034 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1035 ch->fadeOutAmp -= ch->fadeOutSpeed;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1036 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1037 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1038 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1039 ch->fadeOutAmp = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1040 ch->fadeOutSpeed = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1041 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1042 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1043
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1044 if (!ch->mute)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1045 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1046 // *** VOLUME ENVELOPE ***
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1047 envVal = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1048 if (ins->envVTyp & ENV_ENABLED)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1049 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1050 envDidInterpolate = false;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1051 envPos = ch->envVPos;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1052
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1053 if (++ch->envVCnt == ins->envVP[envPos][0])
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1054 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1055 ch->envVAmp = ins->envVP[envPos][1] << 8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1056
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1057 envPos++;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1058 if (ins->envVTyp & ENV_LOOP)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1059 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1060 envPos--;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1061
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1062 if (envPos == ins->envVRepE)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1063 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1064 if (!(ins->envVTyp & ENV_SUSTAIN) || envPos != ins->envVSust || ch->envSustainActive)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1065 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1066 envPos = ins->envVRepS;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1067
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1068 ch->envVCnt = ins->envVP[envPos][0];
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1069 ch->envVAmp = ins->envVP[envPos][1] << 8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1070 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1071 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1072
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1073 envPos++;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1074 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1075
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1076 if (envPos < ins->envVPAnt)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1077 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1078 envInterpolateFlag = true;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1079 if ((ins->envVTyp & ENV_SUSTAIN) && ch->envSustainActive)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1080 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1081 if (envPos-1 == ins->envVSust)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1082 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1083 envPos--;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1084 ch->envVIPValue = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1085 envInterpolateFlag = false;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1086 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1087 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1088
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1089 if (envInterpolateFlag)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1090 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1091 ch->envVPos = envPos;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1092
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1093 ch->envVIPValue = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1094 if (ins->envVP[envPos][0] > ins->envVP[envPos-1][0])
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1095 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1096 ch->envVIPValue = (ins->envVP[envPos][1] - ins->envVP[envPos-1][1]) << 8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1097 ch->envVIPValue /= (ins->envVP[envPos][0] - ins->envVP[envPos-1][0]);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1098
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1099 envVal = ch->envVAmp;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1100 envDidInterpolate = true;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1101 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1102 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1103 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1104 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1105 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1106 ch->envVIPValue = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1107 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1108 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1109
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1110 if (!envDidInterpolate)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1111 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1112 ch->envVAmp += ch->envVIPValue;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1113
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1114 envVal = ch->envVAmp;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1115 if (envVal > 64*256)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1116 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1117 if (envVal > 128*256)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1118 envVal = 64*256;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1119 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1120 envVal = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1121
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1122 ch->envVIPValue = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1123 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1124 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1125
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1126 envVal >>= 8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1127
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1128 vol = (envVal * ch->outVol * ch->fadeOutAmp) >> (16+2);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1129 vol = (vol * song.globVol) >> 7;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1130
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1131 ch->status |= IS_Vol; // 8bb: this updates vol on every tick (because vol envelope is enabled)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1132 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1133 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1134 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1135 vol = ((ch->outVol << 4) * ch->fadeOutAmp) >> 16;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1136 vol = (vol * song.globVol) >> 7;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1137 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1138
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1139 ch->finalVol = (uint16_t)vol; // 0..256
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1140 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1141 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1142 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1143 ch->finalVol = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1144 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1145
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1146 // *** PANNING ENVELOPE ***
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1147
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1148 envVal = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1149 if (ins->envPTyp & ENV_ENABLED)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1150 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1151 envDidInterpolate = false;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1152 envPos = ch->envPPos;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1153
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1154 if (++ch->envPCnt == ins->envPP[envPos][0])
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1155 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1156 ch->envPAmp = ins->envPP[envPos][1] << 8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1157
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1158 envPos++;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1159 if (ins->envPTyp & ENV_LOOP)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1160 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1161 envPos--;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1162
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1163 if (envPos == ins->envPRepE)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1164 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1165 if (!(ins->envPTyp & ENV_SUSTAIN) || envPos != ins->envPSust || ch->envSustainActive)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1166 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1167 envPos = ins->envPRepS;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1168
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1169 ch->envPCnt = ins->envPP[envPos][0];
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1170 ch->envPAmp = ins->envPP[envPos][1] << 8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1171 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1172 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1173
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1174 envPos++;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1175 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1176
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1177 if (envPos < ins->envPPAnt)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1178 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1179 envInterpolateFlag = true;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1180 if ((ins->envPTyp & ENV_SUSTAIN) && ch->envSustainActive)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1181 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1182 if (envPos-1 == ins->envPSust)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1183 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1184 envPos--;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1185 ch->envPIPValue = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1186 envInterpolateFlag = false;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1187 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1188 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1189
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1190 if (envInterpolateFlag)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1191 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1192 ch->envPPos = envPos;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1193
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1194 ch->envPIPValue = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1195 if (ins->envPP[envPos][0] > ins->envPP[envPos-1][0])
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1196 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1197 ch->envPIPValue = (ins->envPP[envPos][1] - ins->envPP[envPos-1][1]) << 8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1198 ch->envPIPValue /= (ins->envPP[envPos][0] - ins->envPP[envPos-1][0]);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1199
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1200 envVal = ch->envPAmp;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1201 envDidInterpolate = true;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1202 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1203 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1204 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1205 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1206 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1207 ch->envPIPValue = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1208 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1209 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1210
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1211 if (!envDidInterpolate)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1212 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1213 ch->envPAmp += ch->envPIPValue;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1214
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1215 envVal = ch->envPAmp;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1216 if (envVal > 64*256)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1217 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1218 if (envVal > 128*256)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1219 envVal = 64*256;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1220 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1221 envVal = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1222
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1223 ch->envPIPValue = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1224 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1225 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1226
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1227 int16_t panTmp = ch->outPan - 128;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1228 if (panTmp > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1229 panTmp = 0 - panTmp;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1230 panTmp += 128;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1231
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1232 panTmp <<= 3;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1233 envVal -= 32*256;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1234
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1235 ch->finalPan = ch->outPan + (uint8_t)(((int16_t)envVal * panTmp) >> 16);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1236 ch->status |= IS_Pan;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1237 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1238 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1239 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1240 ch->finalPan = ch->outPan;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1241 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1242
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1243 // *** AUTO VIBRATO ***
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1244 if (ins->vibDepth > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1245 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1246 if (ch->eVibSweep > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1247 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1248 autoVibAmp = ch->eVibSweep;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1249 if (ch->envSustainActive)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1250 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1251 autoVibAmp += ch->eVibAmp;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1252 if ((autoVibAmp >> 8) > ins->vibDepth)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1253 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1254 autoVibAmp = ins->vibDepth << 8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1255 ch->eVibSweep = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1256 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1257
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1258 ch->eVibAmp = autoVibAmp;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1259 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1260 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1261 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1262 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1263 autoVibAmp = ch->eVibAmp;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1264 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1265
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1266 ch->eVibPos += ins->vibRate;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1267
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1268 if (ins->vibTyp == 1) autoVibVal = (ch->eVibPos > 127) ? 64 : -64; // square
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1269 else if (ins->vibTyp == 2) autoVibVal = (((ch->eVibPos >> 1) + 64) & 127) - 64; // ramp up
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1270 else if (ins->vibTyp == 3) autoVibVal = ((-(ch->eVibPos >> 1) + 64) & 127) - 64; // ramp down
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1271 else autoVibVal = vibSineTab[ch->eVibPos]; // sine
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1272
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1273 autoVibVal <<= 2;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1274 uint16_t tmpPeriod = (autoVibVal * (int16_t)autoVibAmp) >> 16;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1275
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1276 tmpPeriod += ch->outPeriod;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1277 if (tmpPeriod >= MAX_FRQ)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1278 tmpPeriod = 0; // 8bb: yes, FT2 does this (!)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1279
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1280 ch->finalPeriod = tmpPeriod;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1281 ch->status |= IS_Period;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1282 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1283 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1284 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1285 ch->finalPeriod = ch->outPeriod;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1286 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1287 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1288
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1289 // 8bb: converts period to note number, for arpeggio and portamento (in semitone-slide mode)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1290 static uint16_t relocateTon(uint16_t period, uint8_t arpNote, stmTyp *ch)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1291 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1292 int32_t tmpPeriod;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1293
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1294 const int32_t fineTune = ((int8_t)ch->fineTune >> 3) + 16;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1295
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1296 /* 8bb: FT2 bug, should've been 10*12*16. Notes above B-7 (95) will have issues.
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1297 ** You can only achieve such high notes by having a high relative note value
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1298 ** in the sample.
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1299 */
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1300 int32_t hiPeriod = 8*12*16;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1301
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1302 int32_t loPeriod = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1303
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1304 for (int32_t i = 0; i < 8; i++)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1305 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1306 tmpPeriod = (((loPeriod + hiPeriod) >> 1) & ~15) + fineTune;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1307
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1308 int32_t lookUp = tmpPeriod - 8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1309 if (lookUp < 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1310 lookUp = 0; // 8bb: safety fix (C-0 w/ ftune <= -65). This buggy read seems to return 0 in FT2 (TODO: verify)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1311
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1312 if (period >= note2Period[lookUp])
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1313 hiPeriod = (tmpPeriod - fineTune) & ~15;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1314 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1315 loPeriod = (tmpPeriod - fineTune) & ~15;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1316 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1317
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1318 tmpPeriod = loPeriod + fineTune + (arpNote << 4);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1319 if (tmpPeriod >= (8*12*16+15)-1) // 8bb: FT2 bug, should've been 10*12*16+16 (also notice the +2 difference)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1320 tmpPeriod = (8*12*16+16)-1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1321
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1322 return note2Period[tmpPeriod];
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1323 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1324
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1325 static void vibrato2(stmTyp *ch)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1326 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1327 uint8_t tmpVib = (ch->vibPos >> 2) & 0x1F;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1328
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1329 switch (ch->waveCtrl & 3)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1330 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1331 // 0: sine
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1332 case 0: tmpVib = vibTab[tmpVib]; break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1333
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1334 // 1: ramp
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1335 case 1:
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1336 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1337 tmpVib <<= 3;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1338 if ((int8_t)ch->vibPos < 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1339 tmpVib = ~tmpVib;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1340 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1341 break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1342
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1343 // 2/3: square
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1344 default: tmpVib = 255; break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1345 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1346
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1347 tmpVib = (tmpVib * ch->vibDepth) >> 5;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1348
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1349 if ((int8_t)ch->vibPos < 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1350 ch->outPeriod = ch->realPeriod - tmpVib;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1351 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1352 ch->outPeriod = ch->realPeriod + tmpVib;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1353
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1354 ch->status |= IS_Period;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1355 ch->vibPos += ch->vibSpeed;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1356 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1357
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1358 static void arp(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1359 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1360 /* 8bb: The original arpTab table only supports 16 ticks, so it can and will overflow.
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1361 ** I have added overflown values to the table so that we can handle up to 256 ticks.
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1362 ** The added overflow entries are accurate to the overflow-read in FT2.08/FT2.09.
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1363 */
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1364 const uint8_t tick = arpTab[song.timer & 0xFF];
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1365
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1366 if (tick == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1367 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1368 ch->outPeriod = ch->realPeriod;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1369 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1370 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1371 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1372 const uint8_t note = (tick == 1) ? (param >> 4) : (param & 0x0F);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1373 ch->outPeriod = relocateTon(ch->realPeriod, note, ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1374 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1375
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1376 ch->status |= IS_Period;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1377 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1378
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1379 static void portaUp(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1380 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1381 if (param == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1382 param = ch->portaUpSpeed;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1383
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1384 ch->portaUpSpeed = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1385
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1386 ch->realPeriod -= param << 2;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1387 if ((int16_t)ch->realPeriod < 1)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1388 ch->realPeriod = 1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1389
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1390 ch->outPeriod = ch->realPeriod;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1391 ch->status |= IS_Period;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1392 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1393
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1394 static void portaDown(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1395 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1396 if (param == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1397 param = ch->portaDownSpeed;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1398
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1399 ch->portaDownSpeed = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1400
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1401 ch->realPeriod += param << 2;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1402 if ((int16_t)ch->realPeriod > MAX_FRQ-1) // 8bb: FT2 bug, should've been unsigned comparison!
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1403 ch->realPeriod = MAX_FRQ-1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1404
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1405 ch->outPeriod = ch->realPeriod;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1406 ch->status |= IS_Period;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1407 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1408
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1409 static void tonePorta(stmTyp *ch, uint8_t param) // 8bb: param is a placeholder (not used)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1410 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1411 if (ch->portaDir == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1412 return;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1413
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1414 if (ch->portaDir > 1)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1415 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1416 ch->realPeriod -= ch->portaSpeed;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1417 if ((int16_t)ch->realPeriod <= (int16_t)ch->wantPeriod)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1418 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1419 ch->portaDir = 1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1420 ch->realPeriod = ch->wantPeriod;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1421 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1422 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1423 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1424 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1425 ch->realPeriod += ch->portaSpeed;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1426 if (ch->realPeriod >= ch->wantPeriod)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1427 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1428 ch->portaDir = 1;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1429 ch->realPeriod = ch->wantPeriod;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1430 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1431 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1432
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1433 if (ch->glissFunk) // 8bb: semitone-slide flag
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1434 ch->outPeriod = relocateTon(ch->realPeriod, 0, ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1435 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1436 ch->outPeriod = ch->realPeriod;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1437
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1438 ch->status |= IS_Period;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1439
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1440 (void)param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1441 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1442
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1443 static void vibrato(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1444 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1445 uint8_t tmp8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1446
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1447 if (ch->eff > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1448 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1449 tmp8 = param & 0x0F;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1450 if (tmp8 > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1451 ch->vibDepth = tmp8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1452
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1453 tmp8 = (param & 0xF0) >> 2;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1454 if (tmp8 > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1455 ch->vibSpeed = tmp8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1456 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1457
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1458 vibrato2(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1459 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1460
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1461 static void tonePlusVol(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1462 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1463 tonePorta(ch, 0); // 8bb: the last parameter is not used in tonePorta()
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1464 volume(ch, param);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1465
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1466 (void)param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1467 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1468
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1469 static void vibratoPlusVol(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1470 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1471 vibrato2(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1472 volume(ch, param);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1473
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1474 (void)param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1475 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1476
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1477 static void tremolo(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1478 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1479 uint8_t tmp8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1480 int16_t tremVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1481
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1482 const uint8_t tmpEff = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1483 if (tmpEff > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1484 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1485 tmp8 = tmpEff & 0x0F;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1486 if (tmp8 > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1487 ch->tremDepth = tmp8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1488
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1489 tmp8 = (tmpEff & 0xF0) >> 2;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1490 if (tmp8 > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1491 ch->tremSpeed = tmp8;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1492 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1493
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1494 uint8_t tmpTrem = (ch->tremPos >> 2) & 0x1F;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1495 switch ((ch->waveCtrl >> 4) & 3)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1496 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1497 // 0: sine
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1498 case 0: tmpTrem = vibTab[tmpTrem]; break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1499
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1500 // 1: ramp
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1501 case 1:
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1502 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1503 tmpTrem <<= 3;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1504 if ((int8_t)ch->vibPos < 0) // 8bb: FT2 bug, should've been ch->tremPos
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1505 tmpTrem = ~tmpTrem;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1506 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1507 break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1508
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1509 // 2/3: square
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1510 default: tmpTrem = 255; break;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1511 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1512 tmpTrem = (tmpTrem * ch->tremDepth) >> 6;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1513
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1514 if ((int8_t)ch->tremPos < 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1515 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1516 tremVol = ch->realVol - tmpTrem;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1517 if (tremVol < 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1518 tremVol = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1519 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1520 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1521 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1522 tremVol = ch->realVol + tmpTrem;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1523 if (tremVol > 64)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1524 tremVol = 64;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1525 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1526
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1527 ch->outVol = (uint8_t)tremVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1528 ch->status |= IS_Vol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1529 ch->tremPos += ch->tremSpeed;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1530 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1531
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1532 static void volume(stmTyp *ch, uint8_t param) // 8bb: volume slide
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1533 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1534 if (param == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1535 param = ch->volSlideSpeed;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1536
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1537 ch->volSlideSpeed = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1538
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1539 uint8_t newVol = ch->realVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1540 if ((param & 0xF0) == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1541 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1542 newVol -= param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1543 if ((int8_t)newVol < 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1544 newVol = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1545 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1546 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1547 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1548 param >>= 4;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1549
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1550 newVol += param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1551 if (newVol > 64)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1552 newVol = 64;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1553 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1554
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1555 ch->outVol = ch->realVol = newVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1556 ch->status |= IS_Vol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1557 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1558
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1559 static void globalVolSlide(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1560 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1561 if (param == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1562 param = ch->globVolSlideSpeed;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1563
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1564 ch->globVolSlideSpeed = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1565
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1566 uint8_t newVol = (uint8_t)song.globVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1567 if ((param & 0xF0) == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1568 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1569 newVol -= param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1570 if ((int8_t)newVol < 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1571 newVol = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1572 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1573 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1574 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1575 param >>= 4;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1576
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1577 newVol += param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1578 if (newVol > 64)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1579 newVol = 64;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1580 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1581
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1582 song.globVol = newVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1583
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1584 stmTyp *c = stm;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1585 for (int32_t i = 0; i < song.antChn; i++, c++) // 8bb: this updates the volume for all voices
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1586 c->status |= IS_Vol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1587 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1588
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1589 static void keyOffCmd(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1590 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1591 if ((uint8_t)(song.tempo-song.timer) == (param & 31))
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1592 keyOff(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1593 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1594
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1595 static void panningSlide(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1596 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1597 if (param == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1598 param = ch->panningSlideSpeed;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1599
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1600 ch->panningSlideSpeed = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1601
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1602 int16_t newPan = (int16_t)ch->outPan;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1603 if ((param & 0xF0) == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1604 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1605 newPan -= param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1606 if (newPan < 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1607 newPan = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1608 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1609 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1610 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1611 param >>= 4;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1612
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1613 newPan += param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1614 if (newPan > 255)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1615 newPan = 255;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1616 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1617
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1618 ch->outPan = (uint8_t)newPan;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1619 ch->status |= IS_Pan;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1620 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1621
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1622 static void tremor(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1623 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1624 if (param == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1625 param = ch->tremorSave;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1626
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1627 ch->tremorSave = param;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1628
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1629 uint8_t tremorSign = ch->tremorPos & 0x80;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1630 uint8_t tremorData = ch->tremorPos & 0x7F;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1631
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1632 tremorData--;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1633 if ((int8_t)tremorData < 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1634 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1635 if (tremorSign == 0x80)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1636 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1637 tremorSign = 0x00;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1638 tremorData = param & 0x0F;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1639 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1640 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1641 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1642 tremorSign = 0x80;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1643 tremorData = param >> 4;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1644 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1645 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1646
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1647 ch->tremorPos = tremorSign | tremorData;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1648 ch->outVol = (tremorSign == 0x80) ? ch->realVol : 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1649 ch->status |= IS_Vol + IS_QuickVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1650 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1651
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1652 static void retrigNote(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1653 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1654 if (param == 0) // 8bb: E9x with a param of zero is handled in getNewNote()
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1655 return;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1656
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1657 if ((song.tempo-song.timer) % param == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1658 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1659 startTone(0, 0, 0, ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1660 retrigEnvelopeVibrato(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1661 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1662 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1663
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1664 static void noteCut(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1665 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1666 if ((uint8_t)(song.tempo-song.timer) == param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1667 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1668 ch->outVol = ch->realVol = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1669 ch->status |= IS_Vol + IS_QuickVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1670 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1671 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1672
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1673 static void noteDelay(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1674 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1675 if ((uint8_t)(song.tempo-song.timer) == param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1676 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1677 startTone(ch->tonTyp & 0xFF, 0, 0, ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1678
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1679 if ((ch->tonTyp & 0xFF00) > 0) // 8bb: do we have an instrument number?
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1680 retrigVolume(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1681
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1682 retrigEnvelopeVibrato(ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1683
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1684 if (ch->volKolVol >= 0x10 && ch->volKolVol <= 0x50) // 8bb: Set Volume (volume column)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1685 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1686 ch->outVol = ch->volKolVol - 16;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1687 ch->realVol = ch->outVol;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1688 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1689 else if (ch->volKolVol >= 0xC0 && ch->volKolVol <= 0xCF) // 8bb: Set Panning (volume column)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1690 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1691 ch->outPan = (ch->volKolVol & 0x0F) << 4;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1692 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1693 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1694 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1695
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1696 static const efxRoutine EJumpTab_TickNonZero[16] =
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1697 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1698 dummy, // 0
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1699 dummy, // 1
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1700 dummy, // 2
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1701 dummy, // 3
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1702 dummy, // 4
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1703 dummy, // 5
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1704 dummy, // 6
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1705 dummy, // 7
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1706 dummy, // 8
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1707 retrigNote, // 9
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1708 dummy, // A
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1709 dummy, // B
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1710 noteCut, // C
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1711 noteDelay, // D
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1712 dummy, // E
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1713 dummy // F
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1714 };
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1715
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1716 static void E_Effects_TickNonZero(stmTyp *ch, uint8_t param)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1717 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1718 EJumpTab_TickNonZero[param >> 4](ch, param & 0xF);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1719 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1720
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1721 static const efxRoutine JumpTab_TickNonZero[36] =
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1722 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1723 arp, // 0
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1724 portaUp, // 1
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1725 portaDown, // 2
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1726 tonePorta, // 3
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1727 vibrato, // 4
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1728 tonePlusVol, // 5
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1729 vibratoPlusVol, // 6
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1730 tremolo, // 7
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1731 dummy, // 8
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1732 dummy, // 9
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1733 volume, // A
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1734 dummy, // B
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1735 dummy, // C
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1736 dummy, // D
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1737 E_Effects_TickNonZero, // E
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1738 dummy, // F
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1739 dummy, // G
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1740 globalVolSlide, // H
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1741 dummy, // I
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1742 dummy, // J
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1743 keyOffCmd, // K
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1744 dummy, // L
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1745 dummy, // M
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1746 dummy, // N
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1747 dummy, // O
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1748 panningSlide, // P
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1749 dummy, // Q
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1750 doMultiRetrig, // R
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1751 dummy, // S
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1752 tremor, // T
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1753 dummy, // U
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1754 dummy, // V
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1755 dummy, // W
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1756 dummy, // X
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1757 dummy, // Y
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1758 dummy // Z
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1759 };
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1760
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1761 static void doEffects(stmTyp *ch) // tick>0 effect handling
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1762 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1763 const uint8_t volKolEfx = ch->volKolVol >> 4;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1764 if (volKolEfx > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1765 VJumpTab_TickNonZero[volKolEfx](ch);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1766
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1767 if ((ch->eff == 0 && ch->effTyp == 0) || ch->effTyp > 35)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1768 return;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1769
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1770 JumpTab_TickNonZero[ch->effTyp](ch, ch->eff);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1771 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1772
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1773 static void getNextPos(void)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1774 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1775 song.pattPos++;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1776
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1777 if (song.pattDelTime > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1778 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1779 song.pattDelTime2 = song.pattDelTime;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1780 song.pattDelTime = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1781 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1782
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1783 if (song.pattDelTime2 > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1784 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1785 song.pattDelTime2--;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1786 if (song.pattDelTime2 > 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1787 song.pattPos--;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1788 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1789
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1790 if (song.pBreakFlag)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1791 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1792 song.pBreakFlag = false;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1793 song.pattPos = song.pBreakPos;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1794 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1795
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1796 if (song.pattPos >= song.pattLen || song.posJumpFlag)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1797 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1798 song.pattPos = song.pBreakPos;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1799 song.pBreakPos = 0;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1800 song.posJumpFlag = false;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1801
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1802 song.songPos++;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1803 if (song.songPos >= song.len)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1804 song.songPos = song.repS;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1805
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1806 song.pattNr = song.songTab[(uint8_t)song.songPos];
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1807 song.pattLen = pattLens[(uint8_t)song.pattNr];
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1808 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1809 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1810
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1811 void mainPlayer(void)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1812 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1813 if (musicPaused)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1814 return;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1815
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1816 bool tickZero = false;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1817
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1818 song.timer--;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1819 if (song.timer == 0)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1820 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1821 song.timer = song.tempo;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1822 tickZero = true;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1823 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1824
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1825 const bool readNewNote = tickZero && (song.pattDelTime2 == 0);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1826 if (readNewNote)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1827 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1828 const tonTyp *pattPtr = nilPatternLine;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1829 if (patt[song.pattNr] != NULL)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1830 pattPtr = &patt[song.pattNr][song.pattPos * song.antChn];
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1831
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1832 stmTyp *c = stm;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1833 for (uint8_t i = 0; i < song.antChn; i++, c++, pattPtr++)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1834 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1835 PMPTmpActiveChannel = i; // 8bb: for P_StartTone()
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1836 getNewNote(c, pattPtr);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1837 fixaEnvelopeVibrato(c);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1838 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1839 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1840 else
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1841 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1842 stmTyp *c = stm;
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1843 for (uint8_t i = 0; i < song.antChn; i++, c++)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1844 {
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1845 PMPTmpActiveChannel = i; // 8bb: for P_StartTone()
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1846 doEffects(c);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1847 fixaEnvelopeVibrato(c);
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1848 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1849 }
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1850
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1851 if (song.timer == 1)
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1852 getNextPos();
8e4ee43d3b81 remove submodules
Paper <mrpapersonic@gmail.com>
parents:
diff changeset
1853 }