annotate Plugins/Input/console/Gb_Oscs.cpp @ 145:8794a4781a15 trunk

[svn] looping stuff
author nenolod
date Thu, 10 Nov 2005 17:51:04 -0800
parents 252843aac42f
children 7c5e886205ef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
90
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
2 // Gb_Snd_Emu 0.1.3. http://www.slack.net/~ant/libs/
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
3
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
4 #include "Gb_Apu.h"
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
5
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
6 #include <string.h>
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
7
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
8 /* Copyright (C) 2003-2005 Shay Green. This module is free software; you
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
9 can redistribute it and/or modify it under the terms of the GNU Lesser
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
10 General Public License as published by the Free Software Foundation; either
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
11 version 2.1 of the License, or (at your option) any later version. This
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
12 module is distributed in the hope that it will be useful, but WITHOUT ANY
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
15 more details. You should have received a copy of the GNU Lesser General
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
16 Public License along with this module; if not, write to the Free Software
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
18
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
19 #include BLARGG_SOURCE_BEGIN
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
20
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
21 const int trigger = 0x80;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
22
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
23 // Gb_Osc
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
24
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
25 Gb_Osc::Gb_Osc()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
26 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
27 output = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
28 outputs [0] = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
29 outputs [1] = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
30 outputs [2] = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
31 outputs [3] = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
32 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
33
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
34 void Gb_Osc::reset()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
35 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
36 delay = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
37 last_amp = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
38 period = 2048;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
39 volume = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
40 frequency = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
41 length = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
42 enabled = false;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
43 length_enabled = false;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
44 output_select = 3;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
45 output = outputs [output_select];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
46 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
47
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
48 void Gb_Osc::clock_length()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
49 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
50 if ( length_enabled && length )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
51 --length;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
52 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
53
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
54 void Gb_Osc::write_register( int reg, int value )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
55 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
56 if ( reg == 4 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
57 length_enabled = value & 0x40;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
58 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
59
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
60 // Gb_Env
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
61
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
62 void Gb_Env::reset()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
63 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
64 env_period = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
65 env_dir = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
66 env_delay = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
67 new_env_period = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
68 new_env_dir = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
69 new_volume = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
70 Gb_Osc::reset();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
71 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
72
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
73 Gb_Env::Gb_Env() {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
74 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
75
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
76 void Gb_Env::clock_envelope()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
77 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
78 if ( env_delay && !--env_delay ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
79 env_delay = env_period;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
80 if ( env_dir ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
81 if ( volume < 15 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
82 ++volume;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
83 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
84 else if ( volume > 0 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
85 --volume;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
86 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
87 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
88 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
89
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
90 void Gb_Env::write_register( int reg, int value )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
91 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
92 if ( reg == 2 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
93 new_env_period = value & 7;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
94 new_env_dir = value & 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
95 new_volume = value >> 4;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
96 if ( value == 0 && volume )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
97 // to do: find correct behavior
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
98 volume = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
99 //enabled = new_volume != 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
100 enabled = true;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
101 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
102 else if ( reg == 4 && (value & trigger) ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
103 env_period = new_env_period;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
104 env_delay = new_env_period;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
105 env_dir = new_env_dir;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
106 volume = new_volume;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
107 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
108 Gb_Osc::write_register( reg, value );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
109 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
110
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
111 // Gb_Square
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
112
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
113 void Gb_Square::reset()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
114 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
115 phase = 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
116 duty = 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
117
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
118 sweep_period = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
119 sweep_delay = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
120 sweep_shift = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
121 sweep_dir = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
122 sweep_freq = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
123
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
124 Gb_Env::reset();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
125 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
126
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
127 Gb_Square::Gb_Square()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
128 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
129 has_sweep = false;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
130 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
131
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
132 void Gb_Square::clock_sweep()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
133 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
134 if ( sweep_period && sweep_delay && !--sweep_delay ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
135 sweep_delay = sweep_period;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
136 frequency = sweep_freq;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
137 period = (2048 - frequency) * 4;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
138
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
139 int offset = sweep_freq >> sweep_shift;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
140 if ( sweep_dir )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
141 offset = -offset;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
142 sweep_freq += offset;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
143 if ( sweep_freq < 0 || sweep_freq >= 2048 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
144 sweep_delay = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
145 sweep_freq = 2048; // stop sound output
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
146 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
147 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
148 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
149
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
150 void Gb_Square::write_register( int reg, int value )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
151 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
152 switch ( reg ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
153 case 0:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
154 sweep_period = (value >> 4) & 3;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
155 sweep_shift = value & 7;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
156 sweep_dir = value & 0x08;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
157 break;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
158
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
159 case 1:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
160 length = 64 - (value & 0x3f);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
161 duty = (value >> 5) & 6; // duty = { 1, 2, 4, 6 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
162 if ( !duty )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
163 duty = 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
164 break;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
165
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
166 case 3:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
167 frequency = (frequency & ~0xFF) + value;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
168 break;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
169
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
170 case 4:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
171 frequency = (value & 7) * 0x100 + (frequency & 0xFF);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
172 if ( value & trigger ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
173 sweep_freq = frequency;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
174 if ( has_sweep && sweep_period && sweep_shift ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
175 sweep_delay = 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
176 clock_sweep();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
177 sweep_delay = sweep_period;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
178 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
179 enabled = true;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
180 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
181 break;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
182 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
183
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
184 period = (2048 - frequency) * 4;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
185
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
186 Gb_Env::write_register( reg, value );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
187 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
188
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
189 void Gb_Square::run( gb_time_t time, gb_time_t end_time )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
190 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
191 if ( !enabled || (!length && length_enabled) || !volume || sweep_freq == 2048 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
192 if ( last_amp ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
193 synth->offset( time, -last_amp, output );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
194 last_amp = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
195 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
196 delay = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
197 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
198 else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
199 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
200 int amp = (phase < duty) ? volume : -volume;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
201 if ( amp != last_amp ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
202 synth->offset( time, amp - last_amp, output );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
203 last_amp = amp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
204 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
205
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
206 time += delay;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
207 if ( time < end_time )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
208 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
209 Blip_Buffer* const output = this->output;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
210 const int duty = this->duty;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
211 int phase = this->phase;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
212 amp *= 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
213 do {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
214 phase = (phase + 1) & 7;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
215 if ( phase == 0 || phase == duty ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
216 amp = -amp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
217 synth->offset_inline( time, amp, output );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
218 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
219 time += period;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
220 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
221 while ( time < end_time );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
222
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
223 this->phase = phase;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
224 last_amp = amp >> 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
225 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
226 delay = time - end_time;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
227 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
228 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
229
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
230
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
231 // Gb_Wave
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
232
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
233 void Gb_Wave::reset()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
234 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
235 volume_shift = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
236 wave_pos = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
237 memset( wave, 0, sizeof wave );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
238 Gb_Osc::reset();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
239 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
240
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
241 Gb_Wave::Gb_Wave() {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
242 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
243
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
244 void Gb_Wave::write_register( int reg, int value )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
245 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
246 switch ( reg ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
247 case 0:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
248 enabled = value & 0x80;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
249 break;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
250
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
251 case 1:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
252 length = 256 - value;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
253 break;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
254
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
255 case 2:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
256 volume = ((value >> 5) & 3);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
257 volume_shift = (volume - 1) & 7; // silence = 7
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
258 break;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
259
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
260 case 3:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
261 frequency = (frequency & ~0xFF) + value;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
262 break;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
263
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
264 case 4:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
265 frequency = (value & 7) * 0x100 + (frequency & 0xFF);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
266 //if ( value & trigger )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
267 // wave_pos = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
268 break;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
269
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
270 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
271
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
272 period = (2048 - frequency) * 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
273
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
274 Gb_Osc::write_register( reg, value );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
275 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
276
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
277 void Gb_Wave::run( gb_time_t time, gb_time_t end_time )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
278 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
279 if ( !enabled || (!length && length_enabled) || !volume ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
280 if ( last_amp ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
281 synth.offset( time, -last_amp, output );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
282 last_amp = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
283 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
284 delay = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
285 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
286 else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
287 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
288 // wave data or shift may have changed
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
289 int diff = (wave [wave_pos] >> volume_shift) * 2 - last_amp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
290 if ( diff ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
291 last_amp += diff;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
292 synth.offset( time, diff, output );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
293 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
294
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
295 time += delay;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
296 if ( time < end_time )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
297 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
298 unsigned wave_pos = this->wave_pos;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
299
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
300 do {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
301 wave_pos = (wave_pos + 1) % wave_size;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
302 int amp = (wave [wave_pos] >> volume_shift) * 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
303 int diff = amp - last_amp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
304 if ( diff ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
305 last_amp = amp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
306 synth.offset_inline( time, diff, output );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
307 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
308 time += period;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
309 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
310 while ( time < end_time );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
311
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
312 this->wave_pos = wave_pos;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
313 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
314 delay = time - end_time;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
315 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
316 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
317
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
318
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
319 // Gb_Noise
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
320
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
321 void Gb_Noise::reset()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
322 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
323 bits = 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
324 tap = 14;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
325 Gb_Env::reset();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
326 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
327
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
328 Gb_Noise::Gb_Noise() {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
329 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
330
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
331 void Gb_Noise::write_register( int reg, int value )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
332 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
333 if ( reg == 1 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
334 length = 64 - (value & 0x3f);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
335 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
336 else if ( reg == 3 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
337 tap = 14 - (value & 8);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
338 // noise formula and frequency tested against Metroid 2 and Zelda LA
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
339 int divisor = (value & 7) * 16;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
340 if ( !divisor )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
341 divisor = 8;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
342 period = divisor << (value >> 4);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
343 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
344 else if ( reg == 4 && value & trigger ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
345 bits = ~0u;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
346 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
347
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
348 Gb_Env::write_register( reg, value );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
349 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
350
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
351 #include BLARGG_ENABLE_OPTIMIZER
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
352
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
353 void Gb_Noise::run( gb_time_t time, gb_time_t end_time )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
354 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
355 if ( !enabled || (!length && length_enabled) || !volume ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
356 if ( last_amp ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
357 synth.offset( time, -last_amp, output );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
358 last_amp = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
359 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
360 delay = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
361 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
362 else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
363 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
364 int amp = bits & 1 ? -volume : volume;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
365 if ( amp != last_amp ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
366 synth.offset( time, amp - last_amp, output );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
367 last_amp = amp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
368 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
369
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
370 time += delay;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
371 if ( time < end_time )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
372 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
373 Blip_Buffer* const output = this->output;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
374 // keep parallel resampled time to eliminate multiplication in the loop
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
375 const Blip_Buffer::resampled_time_t resampled_period =
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
376 output->resampled_duration( period );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
377 Blip_Buffer::resampled_time_t resampled_time = output->resampled_time( time );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
378 const unsigned mask = ~(1u << tap);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
379 unsigned bits = this->bits;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
380 amp *= 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
381
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
382 do {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
383 unsigned feedback = bits;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
384 bits >>= 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
385 feedback = 1 & (feedback ^ bits);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
386 time += period;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
387 bits = (feedback << tap) | (bits & mask);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
388 // feedback just happens to be true only when the level needs to change
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
389 // (the previous and current bits are different)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
390 if ( feedback ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
391 amp = -amp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
392 synth.offset_resampled( resampled_time, amp, output );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
393 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
394 resampled_time += resampled_period;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
395 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
396 while ( time < end_time );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
397
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
398 this->bits = bits;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
399 last_amp = amp >> 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
400 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
401 delay = time - end_time;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
402 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
403 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
404