annotate Plugins/Input/console/Blip_Buffer.cpp @ 352:f13ab2d8e9cf trunk

[svn] various fixes :(
author nenolod
date Mon, 26 Dec 2005 14:12:35 -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 // Blip_Buffer 0.3.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 "Blip_Buffer.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 #include <math.h>
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
8
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
9 /* 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
10 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
11 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
12 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
13 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
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
15 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
16 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
17 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
18 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
19
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
20 #include BLARGG_SOURCE_BEGIN
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
21
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
22 Blip_Buffer::Blip_Buffer()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
23 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
24 samples_per_sec = 44100;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
25 buffer_ = NULL;
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 // try to cause assertion failure if buffer is used before these are set
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
28 clocks_per_sec = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
29 factor_ = ~0ul;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
30 offset_ = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
31 buffer_size_ = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
32 length_ = 0;
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 bass_freq_ = 16;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
37 void Blip_Buffer::clear( bool entire_buffer )
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 long count = (entire_buffer ? buffer_size_ : samples_avail());
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
40 offset_ = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
41 reader_accum = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
42 memset( buffer_, sample_offset & 0xFF, (count + widest_impulse_) * sizeof (buf_t_) );
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
45 blargg_err_t Blip_Buffer::sample_rate( long new_rate, int msec )
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 size_t new_size = (ULONG_MAX >> BLIP_BUFFER_ACCURACY) + 1 - widest_impulse_ - 64;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
48 if ( msec != blip_default_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 size_t s = (new_rate * (msec + 1) + 999) / 1000;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
51 if ( s < new_size )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
52 new_size = s;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
53 else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
54 require( false ); // requested buffer length exceeds limit
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
57 if ( buffer_size_ != new_size )
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 delete [] buffer_;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
60 buffer_ = NULL; // allow for exception in allocation below
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
61 buffer_size_ = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
62 offset_ = 0;
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 buffer_ = new buf_t_ [new_size + widest_impulse_];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
65 if ( !buffer_ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
66 return "Out of memory";
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
67 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
68
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
69 buffer_size_ = new_size;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
70 length_ = new_size * 1000 / new_rate - 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
71 if ( msec )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
72 assert( length_ == msec ); // ensure length is same as that passed in
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
73
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
74 samples_per_sec = new_rate;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
75 if ( clocks_per_sec )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
76 clock_rate( clocks_per_sec ); // recalculate factor
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 bass_freq( bass_freq_ ); // recalculate shift
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
79
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
80 clear();
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 return blargg_success;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
85 void Blip_Buffer::clock_rate( long cps )
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 clocks_per_sec = cps;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
88 factor_ = (unsigned long) floor( (double) samples_per_sec / cps *
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
89 (1L << BLIP_BUFFER_ACCURACY) + 0.5 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
90 require( factor_ > 0 ); // clock_rate/sample_rate ratio is too large
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
93 Blip_Buffer::~Blip_Buffer()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
94 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
95 delete [] buffer_;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
98 void Blip_Buffer::bass_freq( int freq )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
99 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
100 bass_freq_ = freq;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
101 if ( freq == 0 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
102 bass_shift = 31; // 32 or greater invokes undefined behavior elsewhere
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
103 return;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
104 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
105 bass_shift = 1 + (int) floor( 1.442695041 * log( 0.124 * samples_per_sec / freq ) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
106 if ( bass_shift < 0 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
107 bass_shift = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
108 if ( bass_shift > 24 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
109 bass_shift = 24;
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 long Blip_Buffer::count_samples( blip_time_t t ) const {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
113 return (resampled_time( t ) >> BLIP_BUFFER_ACCURACY) - (offset_ >> BLIP_BUFFER_ACCURACY);
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
116 void Blip_Impulse_::init( blip_pair_t_* imps, int w, int r, int fb )
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 fine_bits = fb;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
119 width = w;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
120 impulses = (imp_t*) imps;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
121 generate = true;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
122 volume_unit_ = -1.0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
123 res = r;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
124 buf = NULL;
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 impulse = &impulses [width * res * 2 * (fine_bits ? 2 : 1)];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
127 offset = 0;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
130 const int impulse_bits = 15;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
131 const long impulse_amp = 1L << impulse_bits;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
132 const long impulse_offset = impulse_amp / 2;
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 void Blip_Impulse_::scale_impulse( int unit, imp_t* imp_in ) const
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 long offset = ((long) unit << impulse_bits) - impulse_offset * unit +
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
137 (1 << (impulse_bits - 1));
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
138 imp_t* imp = imp_in;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
139 imp_t* fimp = impulse;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
140 for ( int n = res / 2 + 1; n--; )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
141 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
142 int error = unit;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
143 for ( int nn = width; nn--; )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
144 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
145 long a = ((long) *fimp++ * unit + offset) >> impulse_bits;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
146 error -= a - unit;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
147 *imp++ = (imp_t) a;
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 // add error to middle
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
151 imp [-width / 2 - 1] += (imp_t) error;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
152 }
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 if ( res > 2 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
155 // second half is mirror-image
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
156 const imp_t* rev = imp - width - 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
157 for ( int nn = (res / 2 - 1) * width - 1; nn--; )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
158 *imp++ = *--rev;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
159 *imp++ = (imp_t) unit;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
160 }
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 // copy to odd offset
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
163 *imp++ = (imp_t) unit;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
164 memcpy( imp, imp_in, (res * width - 1) * sizeof *imp );
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
167 const int max_res = 1 << blip_res_bits_;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
168
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
169 void Blip_Impulse_::fine_volume_unit()
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 // to do: find way of merging in-place without temporary buffer
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
172
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
173 imp_t temp [max_res * 2 * Blip_Buffer::widest_impulse_];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
174 scale_impulse( (offset & 0xffff) << fine_bits, temp );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
175 imp_t* imp2 = impulses + res * 2 * width;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
176 scale_impulse( offset & 0xffff, imp2 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
177
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
178 // merge impulses
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
179 imp_t* imp = impulses;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
180 imp_t* src2 = temp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
181 for ( int n = res / 2 * 2 * width; n--; ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
182 *imp++ = *imp2++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
183 *imp++ = *imp2++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
184 *imp++ = *src2++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
185 *imp++ = *src2++;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
189 void Blip_Impulse_::volume_unit( double new_unit )
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 ( new_unit == volume_unit_ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
192 return;
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 if ( generate )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
195 treble_eq( blip_eq_t( -8.87, 8800, 44100 ) );
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 volume_unit_ = new_unit;
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 offset = 0x10001 * (unsigned long) floor( volume_unit_ * 0x10000 + 0.5 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
200
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
201 if ( fine_bits )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
202 fine_volume_unit();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
203 else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
204 scale_impulse( offset & 0xffff, impulses );
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
207 static const double pi = 3.1415926535897932384626433832795029L;
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 void Blip_Impulse_::treble_eq( const blip_eq_t& new_eq )
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 if ( !generate && new_eq.treble == eq.treble && new_eq.cutoff == eq.cutoff &&
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
212 new_eq.sample_rate == eq.sample_rate )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
213 return; // already calculated with same parameters
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
214
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
215 generate = false;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
216 eq = new_eq;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
217
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
218 double treble = pow( 10.0, 1.0 / 20 * eq.treble ); // dB (-6dB = 0.50)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
219 if ( treble < 0.000005 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
220 treble = 0.000005;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
221
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
222 const double treble_freq = 22050.0; // treble level at 22 kHz harmonic
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
223 const double sample_rate = eq.sample_rate;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
224 const double pt = treble_freq * 2 / sample_rate;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
225 double cutoff = eq.cutoff * 2 / sample_rate;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
226 if ( cutoff >= pt * 0.95 || cutoff >= 0.95 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
227 cutoff = 0.5;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
228 treble = 1.0;
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 // DSF Synthesis (See T. Stilson & J. Smith (1996),
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
232 // Alias-free digital synthesis of classic analog waveforms)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
233
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
234 // reduce adjacent impulse interference by using small part of wide impulse
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
235 const double n_harm = 4096;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
236 const double rolloff = pow( treble, 1.0 / (n_harm * pt - n_harm * cutoff) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
237 const double rescale = 1.0 / pow( rolloff, n_harm * cutoff );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
238
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
239 const double pow_a_n = rescale * pow( rolloff, n_harm );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
240 const double pow_a_nc = rescale * pow( rolloff, n_harm * cutoff );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
241
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
242 double total = 0.0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
243 const double to_angle = pi / 2 / n_harm / max_res;
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 float buf [max_res * (Blip_Buffer::widest_impulse_ - 2) / 2];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
246 const int size = max_res * (width - 2) / 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
247 for ( int i = size; i--; )
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 double angle = (i * 2 + 1) * to_angle;
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 // equivalent
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
252 //double y = dsf( angle, n_harm * cutoff, 1.0 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
253 //y -= rescale * dsf( angle, n_harm * cutoff, rolloff );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
254 //y += rescale * dsf( angle, n_harm, rolloff );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
255
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
256 const double cos_angle = cos( angle );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
257 const double cos_nc_angle = cos( n_harm * cutoff * angle );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
258 const double cos_nc1_angle = cos( (n_harm * cutoff - 1.0) * angle );
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 double b = 2.0 - 2.0 * cos_angle;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
261 double a = 1.0 - cos_angle - cos_nc_angle + cos_nc1_angle;
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 double d = 1.0 + rolloff * (rolloff - 2.0 * cos_angle);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
264 double c = pow_a_n * rolloff * cos( (n_harm - 1.0) * angle ) -
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
265 pow_a_n * cos( n_harm * angle ) -
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
266 pow_a_nc * rolloff * cos_nc1_angle +
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
267 pow_a_nc * cos_nc_angle;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
268
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
269 // optimization of a / b + c / d
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
270 double y = (a * d + c * b) / (b * d);
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 // fixed window which affects wider impulses more
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
273 if ( width > 12 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
274 double window = cos( n_harm / 1.25 / Blip_Buffer::widest_impulse_ * angle );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
275 y *= window * window;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
278 total += (float) y;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
279 buf [i] = (float) y;
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
282 // integrate runs of length 'max_res'
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
283 double factor = impulse_amp * 0.5 / total; // 0.5 accounts for other mirrored half
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
284 imp_t* imp = impulse;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
285 const int step = max_res / res;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
286 int offset = res > 1 ? max_res : max_res / 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
287 for ( int n = res / 2 + 1; n--; offset -= step )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
288 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
289 for ( int w = -width / 2; w < width / 2; w++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
290 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
291 double sum = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
292 for ( int i = max_res; i--; )
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 int index = w * max_res + offset + i;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
295 if ( index < 0 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
296 index = -index - 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
297 if ( index < size )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
298 sum += buf [index];
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 *imp++ = (imp_t) floor( sum * factor + (impulse_offset + 0.5) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
301 }
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
304 // rescale
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
305 double unit = volume_unit_;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
306 if ( unit >= 0 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
307 volume_unit_ = -1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
308 volume_unit( unit );
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 }
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 void Blip_Buffer::remove_samples( long count )
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 require( buffer_ ); // sample rate must have been set
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 if ( !count ) // optimization
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
317 return;
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 remove_silence( count );
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 // copy remaining samples to beginning and clear old samples
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
322 long remain = samples_avail() + widest_impulse_;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
323 if ( count >= remain )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
324 memmove( buffer_, buffer_ + count, remain * sizeof (buf_t_) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
325 else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
326 memcpy( buffer_, buffer_ + count, remain * sizeof (buf_t_) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
327 memset( buffer_ + remain, sample_offset & 0xFF, count * sizeof (buf_t_) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
328 }
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 #include BLARGG_ENABLE_OPTIMIZER
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
331
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
332 long Blip_Buffer::read_samples( blip_sample_t* out, long max_samples, bool stereo )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
333 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
334 require( buffer_ ); // sample rate must have been set
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 long count = samples_avail();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
337 if ( count > max_samples )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
338 count = max_samples;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
339
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
340 if ( !count )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
341 return 0; // optimization
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
342
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
343 int sample_offset = this->sample_offset;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
344 int bass_shift = this->bass_shift;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
345 buf_t_* buf = buffer_;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
346 long accum = reader_accum;
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 if ( !stereo ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
349 for ( long n = count; n--; ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
350 long s = accum >> accum_fract;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
351 accum -= accum >> bass_shift;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
352 accum += (long (*buf++) - sample_offset) << accum_fract;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
353 *out++ = (blip_sample_t) s;
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 // clamp sample
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
356 if ( (BOOST::int16_t) s != s )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
357 out [-1] = blip_sample_t (0x7FFF - (s >> 24));
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
358 }
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 else {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
361 for ( long n = count; n--; ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
362 long s = accum >> accum_fract;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
363 accum -= accum >> bass_shift;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
364 accum += (long (*buf++) - sample_offset) << accum_fract;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
365 *out = (blip_sample_t) s;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
366 out += 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
367
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
368 // clamp sample
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
369 if ( (BOOST::int16_t) s != s )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
370 out [-2] = blip_sample_t (0x7FFF - (s >> 24));
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
371 }
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
374 reader_accum = accum;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
375
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
376 remove_samples( count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
377
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
378 return count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
379 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
380
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
381 void Blip_Buffer::mix_samples( const blip_sample_t* in, long count )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
382 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
383 buf_t_* buf = &buffer_ [(offset_ >> BLIP_BUFFER_ACCURACY) + (widest_impulse_ / 2 - 1)];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
384
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
385 int prev = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
386 while ( count-- ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
387 int s = *in++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
388 *buf += s - prev;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
389 prev = s;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
390 ++buf;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
391 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
392 *buf -= *--in;
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