annotate Plugins/Input/console/Nes_Namco.cpp @ 334:0daaddb10914 trunk

[svn] Implement GYM playback.
author chainsaw
date Sun, 25 Dec 2005 13:31:46 -0800
parents 84aabc053b6e
children
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 // Nes_Snd_Emu 0.1.6. 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 "Nes_Namco.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 "Tagged_Data.h"
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
7
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
8 /* Copyright (C) 2003-2005 Shay Green. This module is free software; you
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
9 can redistribute it and/or modify it under the terms of the GNU Lesser
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
10 General Public License as published by the Free Software Foundation; either
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
11 version 2.1 of the License, or (at your option) any later version. This
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
12 module is distributed in the hope that it will be useful, but WITHOUT ANY
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
15 more details. You should have received a copy of the GNU Lesser General
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
16 Public License along with this module; if not, write to the Free Software
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
18
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
19 #include BLARGG_SOURCE_BEGIN
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
20
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
21 Nes_Namco::Nes_Namco()
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 volume( 1.0 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
25 reset();
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
28 Nes_Namco::~Nes_Namco() {
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
31 void Nes_Namco::reset()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
32 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
33 addr_reg = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
34
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
35 int i;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
36 for ( i = 0; i < reg_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
37 reg [i] = 0;
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 for ( i = 0; i < osc_count; i++ ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
40 Namco_Osc& osc = oscs [i];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
41 osc.delay = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
42 osc.last_amp = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
43 osc.wave_pos = 0;
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 }
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 void Nes_Namco::output( Blip_Buffer* buf )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
48 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
49 for ( int i = 0; i < osc_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
50 osc_output( i, buf );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
51 }
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 BOOST::uint8_t& Nes_Namco::access()
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 int addr = addr_reg & 0x7f;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
56 if ( addr_reg & 0x80 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
57 addr_reg = (addr + 1) | 0x80;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
58 return reg [addr];
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
256
84aabc053b6e [svn] C++ warning fixes by external contractor Stephen Bennett.
chainsaw
parents: 90
diff changeset
61 #define chars_to_long(s) ( (unsigned long)(s[0] << 24) | (unsigned long)(s[1] << 16) | \
84aabc053b6e [svn] C++ warning fixes by external contractor Stephen Bennett.
chainsaw
parents: 90
diff changeset
62 (unsigned long)(s[2] << 8) | (unsigned long)(s[3]) )
84aabc053b6e [svn] C++ warning fixes by external contractor Stephen Bennett.
chainsaw
parents: 90
diff changeset
63
90
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
64 void Nes_Namco::reflect_state( Tagged_Data& data )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
65 {
256
84aabc053b6e [svn] C++ warning fixes by external contractor Stephen Bennett.
chainsaw
parents: 90
diff changeset
66 reflect_int16( data, chars_to_long("ADDR"), &addr_reg );
90
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 static const char hex [17] = "0123456789ABCDEF";
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
69 int i;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
70 for ( i = 0; i < reg_count; i++ )
256
84aabc053b6e [svn] C++ warning fixes by external contractor Stephen Bennett.
chainsaw
parents: 90
diff changeset
71 reflect_int16( data, chars_to_long("RG\0\0") + hex [i >> 4] * 0x100 + hex [i & 15], &reg [i] );
90
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 for ( i = 0; i < osc_count; i++ ) {
256
84aabc053b6e [svn] C++ warning fixes by external contractor Stephen Bennett.
chainsaw
parents: 90
diff changeset
74 reflect_int32( data, chars_to_long("DLY0") + i, &oscs [i].delay );
84aabc053b6e [svn] C++ warning fixes by external contractor Stephen Bennett.
chainsaw
parents: 90
diff changeset
75 reflect_int16( data, chars_to_long("POS0") + i, &oscs [i].wave_pos );
90
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
76 }
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 #include BLARGG_ENABLE_OPTIMIZER
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
80
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
81 void Nes_Namco::run_until( nes_time_t nes_end_time )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
82 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
83 int active_oscs = ((reg [0x7f] >> 4) & 7) + 1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
84 for ( int i = osc_count - active_oscs; i < osc_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
85 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
86 Namco_Osc& osc = oscs [i];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
87 Blip_Buffer* output = osc.output;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
88 if ( !output )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
89 continue;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
90
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
91 Blip_Buffer::resampled_time_t time =
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
92 output->resampled_time( last_time ) + osc.delay;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
93 Blip_Buffer::resampled_time_t end_time = output->resampled_time( nes_end_time );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
94 osc.delay = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
95 if ( time < end_time )
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 const BOOST::uint8_t* osc_reg = &reg [i * 8 + 0x40];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
98 if ( !(osc_reg [4] & 0xe0) )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
99 continue;
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 int volume = osc_reg [7] & 15;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
102 if ( !volume )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
103 continue;
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 long freq = (osc_reg [4] & 3) * 0x10000 + osc_reg [2] * 0x100L + osc_reg [0];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
106 if ( !freq )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
107 continue;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
108 Blip_Buffer::resampled_time_t period =
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
109 output->resampled_duration( 983040 ) / freq * active_oscs;
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 int wave_size = (8 - ((osc_reg [4] >> 2) & 7)) * 4;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
112 if ( !wave_size )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
113 continue;
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 int last_amp = osc.last_amp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
116 int wave_pos = osc.wave_pos;
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 do {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
119 // read wave sample
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
120 int addr = wave_pos + osc_reg [6];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
121 int sample = reg [addr >> 1];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
122 wave_pos++;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
123 if ( addr & 1 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
124 sample >>= 4;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
125 sample = (sample & 15) * volume;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
126
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
127 // output impulse if amplitude changed
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
128 int delta = sample - last_amp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
129 if ( delta ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
130 last_amp = sample;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
131 synth.offset_resampled( time, delta, output );
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
134 // next sample
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
135 time += period;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
136 if ( wave_pos >= wave_size )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
137 wave_pos = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
138 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
139 while ( time < end_time );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
140
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
141 osc.wave_pos = wave_pos;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
142 osc.last_amp = last_amp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
143 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
144 osc.delay = time - end_time;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
145 }
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 last_time = nes_end_time;
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