annotate Plugins/Input/console/Sms_Apu.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 // Sms_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 "Sms_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 /* 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
7 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
8 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
9 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
10 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
11 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
12 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
13 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
14 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
15 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
16
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
17 #include BLARGG_SOURCE_BEGIN
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 // Sms_Osc
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 Sms_Osc::Sms_Osc()
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 output = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
24 outputs [0] = NULL; // always stays NULL
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
25 outputs [1] = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
26 outputs [2] = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
27 outputs [3] = NULL;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
28 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
29
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
30 void Sms_Osc::reset()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
31 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
32 delay = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
33 last_amp = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
34 volume = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
35 output_select = 3;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
36 output = outputs [3];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
37 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
38
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
39 // Sms_Square
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
40
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
41 Sms_Square::Sms_Square() {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
42 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
43
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
44 void Sms_Square::reset()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
45 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
46 period = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
47 phase = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
48 Sms_Osc::reset();
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
51 void Sms_Square::run( sms_time_t time, sms_time_t end_time )
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 if ( !volume || period <= 128 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
54 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
55 // ignore 16kHz and higher
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
56 if ( last_amp ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
57 synth->offset( time, -last_amp, output );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
58 last_amp = 0;
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 time += delay;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
61 if ( !period ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
62 time = end_time;
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 else if ( time < end_time ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
65 // keep calculating phase
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
66 int count = (end_time - time + period - 1) / period;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
67 phase = (phase + count) & 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
68 time += count * period;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
69 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
70 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
71 else
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 int amp = phase ? volume : -volume;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
74 if ( amp != last_amp ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
75 synth->offset( time, amp - last_amp, output );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
76 last_amp = amp;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
79 time += delay;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
80 if ( time < end_time )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
81 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
82 Blip_Buffer* const output = this->output;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
83 amp *= 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
84 do {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
85 amp = -amp; // amp always alternates
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
86 synth->offset_inline( time, amp, output );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
87 time += period;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
88 phase ^= 1;
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 while ( time < end_time );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
91 this->last_amp = phase ? volume : -volume;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
92 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
93 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
94 delay = time - end_time;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
95 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
96
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
97 // Sms_Noise
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
98
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
99 static const int noise_periods [3] = { 0x100, 0x200, 0x400 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
100
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
101 inline Sms_Noise::Sms_Noise() {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
102 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
103
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
104 inline void Sms_Noise::reset()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
105 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
106 period = &noise_periods [0];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
107 shifter = 0x8000;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
108 tap = 12;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
109 Sms_Osc::reset();
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
112 void Sms_Noise::run( sms_time_t time, sms_time_t end_time )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
113 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
114 int cur_amp = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
115 int period = *this->period * 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
116 if ( !volume ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
117 if ( last_amp ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
118 synth.offset( time, -last_amp, output );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
119 last_amp = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
120 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
121 delay = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
122 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
123 else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
124 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
125 int amp = (shifter & 1) ? -volume : volume;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
126 if ( !period )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
127 period = 16;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
128 if ( amp != last_amp ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
129 synth.offset( time, amp - last_amp, output );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
130 last_amp = amp;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
133 time += delay;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
134 if ( time < end_time )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
135 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
136 Blip_Buffer* const output = this->output;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
137 unsigned shifter = this->shifter;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
138 amp *= 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
139
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
140 do {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
141 int changed = (shifter + 1) & 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
142 shifter = (((shifter << 15) ^ (shifter << tap)) & 0x8000) | (shifter >> 1);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
143 if ( changed ) { // prev and next bits differ
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
144 amp = -amp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
145 synth.offset_inline( time, amp, 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 time += period;
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 while ( time < end_time );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
150
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
151 this->shifter = shifter;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
152 this->last_amp = amp >> 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
153 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
154 delay = time - end_time;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
155 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
156 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
157
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
158 // Sms_Apu
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
159
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
160 Sms_Apu::Sms_Apu()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
161 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
162 for ( int i = 0; i < 3; i++ ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
163 squares [i].synth = &square_synth;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
164 oscs [i] = &squares [i];
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 oscs [3] = &noise;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
167
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
168 volume( 1.0 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
169 reset();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
170 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
171
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
172 Sms_Apu::~Sms_Apu() {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
173 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
174
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
175 void Sms_Apu::treble_eq( const blip_eq_t& eq )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
176 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
177 square_synth.treble_eq( eq );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
178 noise.synth.treble_eq( eq );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
179 }
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 void Sms_Apu::volume( double vol )
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 vol *= 0.85 / osc_count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
184 square_synth.volume( vol );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
185 noise.synth.volume( vol );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
186 }
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 void Sms_Apu::output( Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
189 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
190 for ( int i = 0; i < osc_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
191 osc_output( i, center, left, right );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
192 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
193
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
194 void Sms_Apu::osc_output( int index, Blip_Buffer* center, Blip_Buffer* left,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
195 Blip_Buffer* right )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
196 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
197 require( (unsigned) index < osc_count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
198
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
199 Sms_Osc& osc = *oscs [index];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
200 if ( center && !left && !right )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
201 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
202 // mono
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
203 left = center;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
204 right = center;
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 else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
207 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
208 // must be silenced or stereo
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
209 require( (!left && !right) || (left && right) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
210 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
211 osc.outputs [1] = right;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
212 osc.outputs [2] = left;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
213 osc.outputs [3] = center;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
214 osc.output = osc.outputs [osc.output_select];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
215 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
216
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
217 void Sms_Apu::reset()
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 stereo_found = false;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
220 last_time = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
221 latch = 0;
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 squares [0].reset();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
224 squares [1].reset();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
225 squares [2].reset();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
226 noise.reset();
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 void Sms_Apu::run_until( sms_time_t end_time )
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 require( end_time >= last_time ); // end_time must not be before previous time
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 if ( end_time > last_time )
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 // run oscillators
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
236 for ( int i = 0; i < osc_count; ++i ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
237 Sms_Osc& osc = *oscs [i];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
238 if ( osc.output ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
239 if ( osc.output != osc.outputs [3] )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
240 stereo_found = true; // playing on side output
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
241 osc.run( last_time, end_time );
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
245 last_time = end_time;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
246 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
247 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
248
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
249 bool Sms_Apu::end_frame( sms_time_t end_time )
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 run_until( end_time );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
252 last_time = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
253
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
254 bool result = stereo_found;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
255 stereo_found = false;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
256 return result;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
257 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
258
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
259 void Sms_Apu::write_ggstereo( sms_time_t time, int data )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
260 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
261 require( (unsigned) data <= 0xff );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
262
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
263 run_until( time );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
264
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
265 // left/right assignments
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
266 for ( int i = 0; i < osc_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
267 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
268 Sms_Osc& osc = *oscs [i];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
269 int flags = data >> i;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
270 Blip_Buffer* old_output = osc.output;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
271 osc.output_select = ((flags >> 3) & 2) | (flags & 1);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
272 osc.output = osc.outputs [osc.output_select];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
273 if ( osc.output != old_output && osc.last_amp ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
274 if ( old_output )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
275 square_synth.offset( time, -osc.last_amp, old_output );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
276 osc.last_amp = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
277 }
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 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
280
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
281 static const char volumes [16] = {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
282 // volumes [i] = 64 * pow( 1.26, 15 - i ) / pow( 1.26, 15 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
283 64, 50, 39, 31, 24, 19, 15, 12, 9, 7, 5, 4, 3, 2, 1, 0
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
284 };
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 void Sms_Apu::write_data( sms_time_t time, int data )
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 require( (unsigned) data <= 0xff );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
289
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
290 run_until( time );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
291
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
292 if ( data & 0x80 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
293 latch = data;
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 int index = (latch >> 5) & 3;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
296 if ( latch & 0x10 )
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 // volume
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
299 oscs [index]->volume = volumes [data & 15];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
300 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
301 else if ( index < 3 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
302 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
303 // square period
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
304 Sms_Square& sq = squares [index];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
305 if ( data & 0x80 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
306 sq.period = (sq.period & ~0xff) | ((data << 4) & 0xff);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
307 else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
308 sq.period = (sq.period & 0xff) | ((data << 8) & 0x3f00);
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 else
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 // noise period/mode
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
313 int select = data & 3;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
314 if ( select < 3 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
315 noise.period = &noise_periods [select];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
316 else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
317 noise.period = &squares [2].period;
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 noise.tap = (data & 0x04) ? 12 : 16; // 16 disables tap
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
320 noise.shifter = 0x8000;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
321 }
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