1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2004 Matthias Wientapper
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
20 #include "pluginlib_actions.h"
24 #define METRONOME_QUIT PLA_QUIT
25 #define METRONOME_VOL_UP PLA_UP
26 #define METRONOME_VOL_DOWN PLA_DOWN
27 #define METRONOME_VOL_UP_REP PLA_UP_REPEAT
28 #define METRONOME_VOL_DOWN_REP PLA_DOWN_REPEAT
29 #define METRONOME_LEFT PLA_LEFT
30 #define METRONOME_RIGHT PLA_RIGHT
31 #define METRONOME_LEFT_REP PLA_LEFT_REPEAT
32 #define METRONOME_RIGHT_REP PLA_RIGHT_REPEAT
34 METRONOME_PLAY_TAP
= LAST_PLUGINLIB_ACTION
+1,
35 #if CONFIG_KEYPAD == ONDIO_PAD
38 #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
44 #if CONFIG_KEYPAD == ONDIO_PAD
45 #define METRONOME_TAP PLA_START
46 #define METRONOME_MSG_START "start: mode"
47 #define METRONOME_MSG_STOP "pause: hold mode"
48 static const struct button_mapping ondio_action
[] =
50 {METRONOME_PLAY_TAP
, BUTTON_MENU
|BUTTON_REL
, BUTTON_MENU
},
51 {METRONOME_PAUSE
, BUTTON_MENU
|BUTTON_REPEAT
, BUTTON_NONE
},
52 {CONTEXT_CUSTOM
,BUTTON_NONE
,BUTTON_NONE
}
55 #define METRONOME_TAP PLA_FIRE
56 #define METRONOME_PLAYPAUSE PLA_START
57 #define METRONOME_MSG_START "press play"
58 #define METRONOME_MSG_STOP "press pause"
60 #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
62 static const struct button_mapping iriver_syncaction
[] =
64 {METRONOME_SYNC
, BUTTON_REC
, BUTTON_NONE
},
65 {CONTEXT_CUSTOM
,BUTTON_NONE
,BUTTON_NONE
}
68 #endif /* #if CONFIG_KEYPAD == ONDIO_PAD */
71 static struct plugin_api
* rb
;
74 static int period
= 0;
75 static int minitick
= 0;
77 static bool sound_active
= false;
78 static bool sound_paused
= true;
80 static char buffer
[30];
82 static bool reset_tap
= false;
83 static int tap_count
= 0;
84 static int tap_time
= 0;
85 static int tap_timeout
= 0;
87 int bpm_step_counter
= 0;
91 #if CONFIG_CPU == SH7034
101 #if CONFIG_CODEC != SWCODEC
103 #define MET_IS_PLAYING rb->mp3_is_playing()
104 #define MET_PLAY_STOP rb->mp3_play_stop()
106 /* tick sound from a metronome */
107 static unsigned char sound
[] = {
108 255,251, 80,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
109 0, 73,110,102,111, 0, 0, 0, 15, 0, 0, 0, 4, 0, 0, 4, 19, 0, 64, 64,
110 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
111 64, 64, 64,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
112 128,128,128,128,128,128,128,128,192,192,192,192,192,192,192,192,192,192,192,192,
113 192,192,192,192,192,192,192,192,192,192,192,192,192,255,255,255,255,255,255,255,
114 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 0, 0, 0,
115 58, 76, 65, 77, 69, 51, 46, 57, 50, 32, 1,137, 0, 0, 0, 0, 0, 0, 0, 0,
116 2, 64, 36, 5,191, 65, 0, 0, 0, 0, 0, 4, 19,168,187,153, 93, 0, 0, 0,
117 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
118 0, 0, 0, 0, 0, 0, 0, 0,255,251, 80,196, 0, 0, 10, 81, 57, 65,184,120,
119 128, 1, 95,159,239,191,144, 96, 0, 0,128, 0, 0, 0, 0, 0, 0, 48, 24, 12,
120 0, 0, 15,175,185,222, 39, 7,126, 46, 50,191,243,197,255,247, 62, 92,111,252,
121 115, 15, 27,140,153,159,247,242,124, 44, 92,164,177, 57,175,255,236, 79,164, 98,
122 68,205, 69,160, 64, 15,251,127,128,168, 38, 92,138, 17, 67,196, 80,184,223,255,
123 255,161,117, 33, 55, 83,191,255,193,240, 33, 57,114, 17, 0, 2, 0, 0, 0, 10,
124 191, 10, 8,196,209, 75, 55,236,177,115,238,223,203, 61,176, 89, 78,101,219,118,
125 118, 65,154,126,187,239,241,127,247,245, 59, 18,219, 94,105,245,221,161,173, 91,
126 191, 27,255,247, 18,124, 71,117,139,133,170,221,227,251,135,110,236,255,183,219,
127 100, 78,184,125,212,131, 65, 95,212,245,145, 67, 77, 10,153,250,132,195, 4,138,
128 224, 0, 0, 0,158,107, 42, 65,227,185, 90,158, 86, 6,155, 77,255,251, 82,196,
129 8, 0, 10,136,185,103, 4, 61, 48, 65,118,173, 44, 60,147, 10,152,107, 49, 74,
130 18,208, 91, 23,178,196,220, 25, 64,233,230, 36,170, 0,210,219,131, 40,165, 22,
131 86,195, 23,145, 33, 16,138, 99,109,117,245, 71,162, 69, 42,220,164, 91, 72,165,
132 26, 69,146,150,199,222, 73,102,148, 29, 19, 5, 65, 86, 6,150,120,180, 26, 88,
133 75, 18,191,255,250,171, 4, 8,132,140, 0, 0, 20,186,242,162, 66,100, 62, 86,
134 206, 86,255, 26,203,201,255,255,141,128,166,196,175,133, 9, 70,188,146,175,133,
135 60, 17,217,229, 90, 27, 87, 93, 34, 76,113,185, 84,213, 56, 17,170, 83, 75,180,
136 203,116,101, 93, 90, 99, 35,174,230, 42,125, 12,128, 79, 93, 81,234, 67, 66,137,
137 105,157,157, 23, 71, 53, 40,250,204,105, 89,203,107,250, 63,174, 89,133, 81,140,
138 0, 52, 17, 16, 0, 0, 18,111, 20, 92, 32,213, 48,179, 50, 26,244,179, 27,230,
139 154, 34,133,177, 88,255,251, 82,196, 13, 0, 10,125, 65, 85,244, 85, 0, 1,210,
140 172,231, 7, 31, 32, 0, 37, 11, 68, 69, 13, 37, 48,210, 23, 69, 36,122,143,148,
141 211,141, 44, 76,135, 72,148,195,135,174, 84,149,167, 30,198,183,255,213,111, 61,
142 27,155,191,177,207,246,163,255,230, 30,137,219,255,182,186,185,239, 52,148,171,
143 75, 63,167, 44, 0, 2, 81,190, 41,253,248,182,180, 23, 43,127,217,161, 41,191,
144 36,199, 40,153,108, 66,224,131,192,217, 12, 67,217, 6,218,240,108,112, 63, 33,
145 93, 12, 8, 43, 66, 42, 74, 12,215,135,100,172, 33, 65,172, 29, 98, 4, 83, 34,
146 40, 17,111,133,255, 18,145, 60, 59,136,145, 92,106,144, 34,185, 58, 76,154,254,
147 146,144,115, 4, 84,180,142,178, 38, 79,253, 34,237,105, 31,106, 70, 73, 36,138,
148 73,164,181,127,253,182, 82,217, 26,245,117,163,255,219, 50,115,223,245, 92,198,
149 165,173, 0, 15,249,132, 50, 19,157, 85,121,153,245, 51,255,251, 82,196, 6,131,
150 74, 96,134,156, 92, 19, 0, 8, 0, 0, 52,128, 0, 0, 0, 60,226, 73, 57, 26,
151 249,253,122,211,128, 65, 86, 10, 1, 9,195,128, 36, 72,225,196,146,115, 73, 18,
152 75, 65, 77, 9, 5,200, 43, 16,163,129, 77, 9, 5,200,110, 39,127,255,255,255,
153 255,255,255,255,252, 83, 66,142,140, 21,136, 46, 64,166,133, 28, 12, 21,136, 46,
154 64,166,133, 21, 6, 76, 65, 77, 69, 51, 46, 57, 50, 85, 85, 85, 85, 85, 85, 85,
155 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
156 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
157 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
158 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
159 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
162 void callback(unsigned char** start
, int* size
){
163 (void)start
; /* unused parameter, avoid warning */
164 *size
= NULL
; /* end of data */
165 sound_active
= false;
169 void play_tock(void){
172 rb
->mp3_play_data(sound
, sizeof(sound
), callback
);
173 rb
->mp3_play_pause(true); /* kickoff audio */
178 #define MET_IS_PLAYING rb->pcm_is_playing()
179 #define MET_PLAY_STOP rb->audio_stop()
181 static signed short sound
[] = {
182 1, -1, 1, -1, 0, 0, 0, 1, -1, 0, 0,
183 0, -1, 2, -2, 2, -1, 0, 0, 0, 0, 1,
184 -1, 0, -1, 1, 0, 0, 0, 1, -1, 1, -2,
185 1, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
186 0, 0, -1, 2, -2, 2, -1, 0, 1, -1, 1,
187 -1, 0, 0, 0, 0, 1, -2, 2, -2, 1, 0,
188 1, -1, 0, 1, -1, 0, 1, -2, 2, -1, 0,
189 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0,
190 0, -1, 1, -1, 2, -2, 2, -2, 2, -2, 1,
191 0, 0, 0, 1, -2, 2, -2, 1, 0, 0, 0,
192 0, 0, 0, -1, 1, 0, -1, 2, -2, 2, -1,
193 0, 0, 0, -1, 1, -1, 1, -1, 2, -2, 1,
194 0, -1, 2, -2, 2, -2, 1, 0, 0, 0, 0,
195 0, 0, 0, 0, 1, -1, 0, 0, -1, 1, 0,
196 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0,
197 1, -2, 2, -1, 0, 0, 0, 0, 0, 1, -2,
198 1, 0, 0, 0, 0, 0, 1, -1, 0, 0, -1,
199 2, -2, 2, -2, 2, -1, 0, 0, -1, 1, -1,
200 1, -1, 1, -1, 1, -1, 1, 0, 0, -1, 2,
201 -2, 1, 0, 0, 0, 0, 0, 1, -1, 0, 0,
202 -1, 1, 0, 0, 0, 0, 0, 0, 1, -2, 2,
203 -2, 2, -1, 1, -1, 1, -2, 2, -2, 2, -2,
204 2, -2, 2, -2, 2, -1, 0, 0, 0, -1, 2,
205 -2, 2, -1, 1, -1, 1, -2, 2, -2, 1, 0,
206 1, -1, 1, -2, 1, -1, 1, 0, 0, 0, 0,
207 0, 0, 0, 0, -1, 1, 0, -1, 2, -1, 0,
208 0, -1, 1, 0, -1, 2, -2, 1, 0, 0, 0,
209 0, 0, 0, -1, 2, -1, 1, -1, 0, 0, 1,
210 -2, 2, -1, 1, -1, 0, 1, -1, 0, 0, 0,
211 0, 0, 0, -1, 1, 0, 0, 0, 0, -1, 2,
212 -2, 2, -1, 0, 1, -1, 0, 0, 0, 0, 0,
213 0, 0, 0, 1, -1, 1, -1, 0, 0, 0, 0,
214 0, 1, -1, 1, -1, 0, 1, -2, 2, -1, 0,
215 1, -2, 2, -2, 2, -2, 2, -1, 0, 1, -1,
216 0, 1, -1, 0, 0, 0, 0, 0, 0, 1, -2,
217 2, -2, 1, 0, -1, 2, -2, 1, 0, 0, 0,
218 0, -1, 1, 0, 0, 1, -1, 0, 0, 0, 0,
219 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0,
220 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1,
221 -1, 1, 0, 0, 0, 0, 0, 0, -1, 2, -1,
222 0, 0, 0, 0, 1, -1, 0, 0, 1, -2, 2,
223 -1, 0, 0, 0, 0, -1, 1, 0, 0, -1, 2,
224 -2, 1, 0, -1, 1, -1, 2, -2, 2, -2, 2,
225 -1, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0,
226 0, 0, 0, 0, 0, 0, -1, 1, 0, 1, -2,
227 2, -1, 0, 1, -1, 0, 0, 0, 0, 0, 0,
228 -1, 2, -2, 2, -2, 2, -1, 0, 0, 0, -1,
229 1, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1,
230 -1, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0,
231 1, -2, 2, -2, 1, 0, 0, 0, 0, 0, 0,
232 0, 1, -1, 0, 1, -1, 1, -1, 0, -1, 2,
233 -1, 0, 0, 0, -1, 1, -1, 1, 0, 1, -1,
234 1, -2, 1, 0, 0, 1, -2, 2, -2, 2, -2,
235 2, -2, 2, -1, 0, 0, 0, 0, 0, -1, 2,
236 -2, 2, -1, 0, 0, 0, 1, -1, 0, 0, 0,
237 0, -1, 1, -1, 1, 0, 0, 0, 1, -2, 1,
238 0, -1, 2, -2, 1, -1, 0, 2, -2, 2, 0,
239 -1, 0, 0, 0, -1, 2, -2, 2, -2, 2, -2,
240 2, -1, 0, 1, -2, 2, -1, 0, 0, 0, 0,
241 1, -1, 0, 0, 0, 0, 0, 0, 0, 1, -2,
242 1, 0, 0, 0, 0, 0, 0, -1, 1, -1, 1,
243 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
244 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
245 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, -1,
246 2, -2, 1, 0, 0, 0, 0, 0, -1, 2, -2,
247 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
248 0, 0, 0, -1, 2, -1, 0, 0, -1, 1, 0,
249 0, 0, 0, 0, 1, -1, 0, 0, -1, 1, 0,
250 0, 0, 0, -1, 1, 0, -1, 2, -1, 0, 0,
251 0, 1, -2, 2, -1, 0, 0, 0, -1, 1, -1,
252 1, 0, 0, 0, 0, 0, 0, 1, -1, 1, -1,
253 0, 0, -1, 2, -2, 1, 0, 0, 0, 0, 0,
254 0, 0, 0, 0, 0, 0, -1, 1, -1, 1, 0,
255 -1, 2, -2, 1, 1, -1, 0, 0, -1, 1, 0,
256 0, 0, 1, -2, 2, -2, 1, 0, 1, -2, 2,
257 -1, 0, 0, 0, -1, 2, -1, 0, 0, 0, 0,
258 0, 0, 0, 0, -1, 2, -2, 2, -1, 0, 0,
259 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
260 0, 0, 0, 0, -1, 2, -2, 2, -1, 0, 1,
261 -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, -2,
262 2, -1, 0, 0, 0, -1, 2, -2, 2, -2, 1,
263 0, -1, 1, 0, -1, 1, 0, 0, 0, 0, 0,
264 -1, 1, -1, 2, -2, 2, -1, 1, -1, 0, 0,
265 0, 0, 1, -1, 0, 0, 0, 0, 1, -2, 2,
266 -2, 1, 1, -1, 1, -1, 1, -2, 2, -2, 1,
267 -1, 2, -2, 1, 0, 0, 0, 0, 0, -1, 2,
268 -2, 2, -1, -1, 1, -1, 1, -1, 2, -2, 2,
269 -1, 0, 0, 1, -2, 2, -2, 1, 0, 0, 0,
270 0, 1, -2, 1, -1, 1, -1, 1, 0, 0, 0,
271 0, 0, -1, 1, 0, 0, 0, -1, 1, 0, 0,
272 1, -2, 2, -2, 1, 0, 0, 0, 0, 0, 0,
273 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
274 0, 0, 0, 0, 1, -1, 1, -2, 1, 0, 0,
275 0, 0, 0, 0, -1, 1, 0, 0, 0, -1, 1,
276 0, 0, 0, 0, 0, 0, 1, -2, 2, -1, 0,
277 0, 0, 0, 0, 0, 1, -2, 2, -1, 1, -1,
278 0, 0, 0, 1, -1, 0, 0, -1, 2, -1, 0,
279 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
280 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
281 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1,
282 -1, 0, 0, 0, 0, 0, 0, -1, 2, -2, 2,
283 -1, 1, -1, 0, 0, -1, 2, -1, 1, -1, 1,
284 -2, 2, -2, 2, -2, 2, -1, 0, 0, 0, 0,
285 0, 0, 0, 0, 1, -1, 0, 0, 1, -2, 2,
286 -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
287 -1, 1, 0, 0, 0, -1, 1, 0, 0, 0, 0,
288 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
289 0, 0, 0, 0, -1, 2, -2, 2, -1, 0, 1,
290 -2, 1, 0, 0, 1, -2, 2, -2, 2, -1, -1,
291 2, -2, 1, 0, 0, 0, 1, -2, 2, -1, 0,
292 0, 0, 0, 0, 0, 0, -1, 1, -1, 2, -1,
293 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 2,
294 -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1,
295 1, 0, 0, 1, -1, 1, -1, 0, 0, -1, 2,
296 -2, 2, -1, 0, 0, 0, 1, -1, 0, 0, 0,
297 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0,
298 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0,
299 0, -1, 2, -2, 1, 0, -1, 1, 0, 0, 1,
300 -1, 0, 0, -1, 2, -2, 1, 0, -1, 2, -1,
301 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0,
302 1, -2, 2, -2, 1, 0, 0, 0, 0, -1, 1,
303 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0,
304 -1, 1, 0, 0, 0, 1, -1, 0, 0, 0, 0,
305 1, -1, 0, 1, -1, 0, -1, 1, 0, -1, 2,
306 -2, 1, 0, 0, 0, -1, 2, -2, 1, 0, 0,
307 1, -2, 2, -1, 0, 1, -1, 0, 0, 0, -1,
308 1, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
309 0, -1, 1, 0, -1, 2, -2, 1, 0, 0, 0,
310 0, 0, 0, 0, 0, 0, 0, 0, -1, 2, -2,
311 1, -1, 1, -1, 2, -2, 1, 0, -1, 2, -2,
312 2, -1, 0, 0, 0, -1, 1, 0, 0, 0, 1,
313 -2, 2, -2, 2, -2, 1, 0, 0, 0, 0, 1,
314 -1, 1, -1, 0, 0, 0, 0, 0, 0, 1, -1,
315 0, 0, 0, 0, 1, -1, 0, 0, 0, -1, 2,
316 -2, 2, -1, 0, 1, -2, 1, 0, 0, 0, 0,
317 0, 0, 0, 0, 0, 0, 0, 0, -1, 2, -2,
318 2, -2, 1, 0, 0, 0, 0, 0, 0, -1, 2,
319 -2, 2, -1, 0, 1, -1, 0, 0, 0, 0, 0,
320 0, 1, -1, 0, 1, -2, 1, 0, -1, 1, 0,
321 -1, 1, 0, 0, 0, 0, 1, -1, 0, 0, 0,
322 0, 0, -1, 2, -2, 2, -2, 2, -2, 1, 0,
323 0, 0, 0, 1, -2, 2, -2, 2, -1, 0, 1,
324 -2, 2, -2, 1, 0, 0, 0, 1, -1, 0, 0,
325 -1, 1, 0, 0, 0, 0, -1, 2, -2, 2, -1,
326 0, 0, 0, -1, 2, -1, 0, 1, -1, 0, 0,
327 0, 0, 1, -2, 2, -1, 0, 0, 0, 0, 0,
328 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0,
329 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0,
330 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0,
331 0, 0, 0, -1, 1, 0, 0, -1, 1, -1, 2,
332 -2, 2, -2, 2, -1, 0, 0, -1, 1, -1, 1,
333 0, -1, 2, -2, 2, -1, 0, 0, 0, 0, 0,
334 0, 0, 1, -2, 2, -2, 1, 0, 0, 0, -1,
335 2, -2, 1, 0, 1, -1, 0, 0, 1, -1, 1,
336 -2, 1, 0, 0, 0, -1, 1, -1, 2, -2, 2,
337 -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1,
338 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
339 1, -2, 2, -1, 0, 1, -2, 2, -1, 0, 0,
340 0, 0, 1, -1, 1, -1, 0, -1, 2, -2, 2,
341 -2, 2, -1, 0, 0, 0, 0, 0, 0, 0, 1,
342 -1, 0, 0, 0, -1, 2, -2, 1, 1, -2, 2,
343 -1, 0, 1, -2, 1, 0, 0, 0, 0, 1, -1,
344 0, 1, -1, 0, 0, -1, 2, -2, 2, -2, 2,
345 -2, 2, -2, 2, -2, 2, -2, 2, -1, 1, -1,
346 1, -1, 1, 0, -1, 1, -1, 1, 0, 0, -1,
347 0, 1, 0, 1, -2, 2, -2, 1, 1, -2, 1,
348 0, 0, 0, 0, 0, 0, 0, -1, 2, -1, 0,
349 0, -1, 1, 0, 0, 0, -1, 0, 1, 0, 1,
350 -2, 0, -1, 1, 0, 1, 0, -1, 0, 0, 1,
351 -1, 1, -2, 1, 1, -1, 1, -1, -1, 0, 1,
352 0, 1, -1, 0, -1, 0, 1, 1, -2, 1, -1,
353 1, 1, 0, -1, 0, 0, 1, 1, 1, -1, 0,
354 -1, 0, 1, -1, 1, -2, 2, 0, 0, 1, -2,
355 -1, 0, 0, 1, -1, 0, -1, 1, 0, 0, 0,
356 0, 0, 0, 0, -1, 1, -1, 1, 0, 2, 1,
357 -1, 0, 0, 0, 1, 1, 1, -1, 1, 1, 0,
358 1, -2, 1, -1, 2, 2, 0, -1, -1, -1, 0,
359 1, -1, 1, -1, 1, 1, 1, 1, -3, 0, 3,
360 0, 0, -4, -2, 4, 5, 4, -3, -1, 1, -3,
361 -2, -5, -6, -1, 5, 2, 1, -3, -2, -5, 1,
362 -4, -5, 3, 5, 0, 1, 2, 0, -5, -1, 3,
363 5, 2, 1, 1, 6, 5, 3, -1, 0, 2, 5,
364 10, 8, 4, 2, -5, -5, 3, 11, 8, -4, -8,
365 -2, 2, -1, -1, 5, -6, -12, -11, -5, -9, -5,
366 10, 6, 3, -4, -3, -9, -8, -18, -9, 5, 13,
367 7, 13, 29, 17, -1, -1, 15, 21, 15, -9, -29,
368 -15, 10, 10, -15, -31, -48, -49, -30, -7, -1, -8,
369 -6, 15, 39, 43, 24, 16, 27, 28, 9, -16, -6,
370 34, 60, 41, 15, 11, 26, 14, -28, -77, -83, -60,
371 -32, 1, 10, -11, -59, -83, -49, 27, 93, 82, 11,
372 -27, -8, 9, 1, 12, 22, 6, -22, -15, 4, 8,
373 -19, -23, 49, 143, 139, 39, -31, -56, -101, -145, -102,
374 -10, 20, -61, -196, -258, -136, 70, 172, 112, 43, 55,
375 75, 12, -69, -33, 89, 114, -26, -137, -14, 239, 335,
376 202, 68, 115, 231, 169, -131, -459, -540, -338, -72, 43,
377 20, -53, -174, -290, -195, 192, 593, 628, 322, 95, 159,
378 264, 163, -50, -202, -229, -114, 18, -31, -212, -264, -36,
379 432, 807, 619, -52, -483, -452, -414, -404, -98, 228, -3,
380 -760, -1444, -1414, -458, 624, 732, 35, -209, 476, 1113, 586,
381 -785, -1405, -480, 753, 881, 280, 81, 441, 753, 687, 711,
382 1440, 2140, 1110, -1470, -2963, -1770, 607, 1427, -399, -3146, -3899,
383 -2064, 28, 715, 874, 1442, 1606, 394, -1483, -2014, -354, 1531,
384 1156, -984, -2108, -821, 1635, 3003, 2087, 186, -155, 1569, 3328,
385 3463, 2110, 9, -2200, -3876, -4298, -2871, -266, 1039, -393, -2357,
386 -1809, 1079, 4019, 5685, 5742, 4435, 3098, 2963, 3181, 2018, -691,
387 -3919, -6922, -9001, -8935, -6374, -3215, -1862, -2089, -1508, 731, 3186,
388 4763, 5160, 3629, 706, -712, 739, 2391, 1570, -1015, -3502, -4979,
389 -4798, -2615, 420, 2178, 1457, -602, -1287, 741, 3741, 5018, 3687,
390 934, -757, 497, 3094, 3163, 113, -2188, -1194, 911, 998, -254,
391 484, 3643, 4907, 1023, -4718, -6191, -1911, 3621, 4508, -687, -6491,
392 -6309, -1015, 3007, 3184, 1911, 471, -1763, -4048, -4414, -2046, 1179,
393 1513, -1919, -4522, -2259, 2368, 4547, 3613, 2320, 2847, 5035, 6432,
394 4390, -835, -5857, -7419, -5497, -2768, -1012, -27, -294, -2444, -3889,
395 -1911, 942, 1212, 859, 2879, 5141, 4107, 108, -3768, -4853, -2787,
396 -162, 142, -1594, -2490, -498, 3349, 5670, 4368, 1089, -1548, -3118,
397 -3936, -3319, -1583, -547, -360, 985, 3125, 2273, -1728, -2291, 4071,
398 10390, 9283, 3620, 79, -90, 1293, 1968, -2030,-10963,-16320,-10631,
399 1236, 8206, 6740, 2418, 1132, 3007, 3504, -1371, -8877, -9321, 2657,
400 17866, 22245, 14739, 4801, -2737, -7071, -2808, 12289, 25609, 19526, -6479,
401 -30563,-29780, -6434, 13879, 13263, 83, -8239, -7874, -6445, -8032, -9180,
402 -7691, -7914,-12368,-13982, -7090, -1018, -8154,-21862,-22142, -3867, 14327,
403 14436, 1712, -5853, -2462, 3311, 4605, 1731, -3832,-11191,-17673,-17400,
404 -4049, 17643, 27851, 14373, -7582,-15759, -9573, -1277, 5996, 13903, 17168,
405 11276, 1603, -4763, -7550, -7537, -2186, 6709, 10980, 6990, -1127, -9765,
406 -16805,-19102,-18420,-18687,-13775, 3373, 21405, 23456, 12651, 3319, -1287,
407 -4637, -3954, 3883, 11849, 8344, -6853,-17292, -7204, 16901, 31089, 21726,
408 1084, -7875, 1459, 15092, 20527, 18496, 10594, -3296,-12835, -6081, 9842,
409 15942, 3977,-16959,-26888,-12200, 13260, 20645, 6239, -5950, -2526, 6054,
410 8073, 3123, -4656,-11949,-15611,-12153, -2236, 4314, -2887,-19936,-30928,
411 -23846, -1429, 17759, 15264, -1868, -7505, 5991, 19737, 18946, 8185, -600,
412 44, 6127, 5321, -4750,-11829, -8743, -1330, 3689, 3252, -3513,-11859,
413 -14753,-10198, 72, 10949, 13370, 5735, -564, 2639, 9903, 13145, 11045,
414 6754, 3123, -724, -6600,-10509, -8340, -6244,-12133,-21055,-20385, -5186,
415 15105, 23034, 11762, -3750, -5737, 2612, 6060, 33, -7014, -4975, 7697,
416 18684, 12606, -7934,-23083,-20429, -7355, 2345, 4875, 7094, 14569, 22636,
417 22509, 13749, 4800, 2246, 4805, 7497, 7404, 4042, -3207,-13334,-19292,
418 -12274, 5051, 15820, 7212,-12051,-20991,-11633, 3886, 11417, 10491, 8967,
419 9849, 9995, 8305, 7497, 7731, 5549, -49, -6582,-12286,-16545,-19489,
420 -22478,-23536,-16116, -123, 14039, 19014, 16964, 11024, 3746, 1174, 5696,
421 10510, 9283, 3833, -1113, -4247, -7485,-11448,-12665, -9329, -7052,-10656,
422 -14627,-10081, 3317, 16454, 18316, 6990, -6264,-10409, -7182, -2463, 3812,
423 10794, 12717, 7460, 215, -2353, 676, 983, -9207,-21161,-17629, 361,
424 11731, 2863,-15895,-22726, -8619, 11663, 17157, 7331, -255, 4522, 15016,
425 20742, 18465, 12205, 6509, 836, -6050,-10016, -8310, -6482, -9596,-13628,
426 -12443, -6667, -1745, -487, 633, 6363, 14319, 17428, 14246, 9598, 6752,
427 5527, 5289, 5673, 6272, 5900, 2123, -5034,-10908,-12352,-12153,-13371,
428 -14974,-15335,-14089, -9874, -1589, 8285, 14571, 13761, 7383, 1668, 1519,
429 4509, 3987, -1719, -7872,-10985,-12263,-12864,-11713, -9423, -8944,-10937,
430 -12477,-11078, -6884, -1052, 5798, 13303, 20195, 23473, 20387, 12863, 7217,
431 6080, 4059, -3737,-13190,-17239,-15342,-11071, -5970, -543, 4259, 7968,
432 8781, 4097, -3427, -7041, -5374, -2595, 70, 4218, 8042, 8534, 7403,
433 8758, 12712, 15141, 12739, 6198, -414, -2420, 331, 780, -7211,-18274,
434 -21587,-15771, -7472, 733, 9880, 17443, 19723, 16661, 10520, 4467, 1343,
435 308, -1550, -3368, -1921, 1564, 1426, -5086,-13434,-16483,-12675, -6499,
436 -2040, -586, -2374, -5424, -5786, -2131, 3305, 7892, 9432, 7024, 3000,
437 410, -274, 396, 1514, 785, -2873, -7609,-11931,-15458,-16897,-15275,
438 -10823, -3469, 5396, 11785, 13505, 11686, 7478, 2801, 1972, 6978, 13591,
439 14815, 7016, -6127,-15851,-17122,-13183, -9425, -7273, -5029, -1087, 3485,
440 5516, 4834, 5156, 7648, 9472, 9387, 8481, 7313, 6847, 7922, 8488,
441 6309, 2375, -1821, -6179, -9633,-10798,-10521,-10565,-11165,-11055, -8661,
442 -3781, 1960, 6819, 9680, 9920, 8944, 9396, 10975, 10715, 7182, 861,
443 -7005,-13267,-15283,-15034,-15703,-15867,-12193, -5329, 829, 3996, 5377,
444 7152, 9312, 10386, 10275, 10167, 10500, 10694, 9601, 6318, 2012, -1381,
445 -4917,-10834,-17053,-18962,-15907,-11261, -7518, -4754, -2399, -32, 2969,
446 6930, 10871, 13043, 13087, 12045, 10546, 9003, 8103, 6739, 2241, -5153,
447 -11768,-15213,-15636,-13473, -9655, -6045, -3220, -430, 2055, 3835, 6558,
448 11429, 15904, 16225, 12337, 7477, 3631, -122, -4854, -9898,-13734,-15118,
449 -13861,-11287, -8854, -6458, -3768, -1724, -385, 2105, 5993, 8742, 9121,
450 8765, 8415, 6764, 3536, 104, -2912, -5635, -7580, -8217, -7502, -5362,
451 -2617, -1366, -2262, -3363, -3163, -2137, -589, 1870, 4595, 6301, 6764,
452 6718, 6520, 5842, 4638, 3882, 4279, 4700, 3357, 183, -2935, -3952,
453 -2906, -2493, -4469, -6460, -5616, -2932, -231, 3057, 6959, 9364, 9069,
454 6831, 4078, 2556, 2602, 2068, -153, -1834, -1310, -248, -795, -2717,
455 -4126, -3995, -3695, -4963, -6850, -7066, -5258, -2772, -846, 139, 1073,
456 2821, 4490, 5430, 6971, 8941, 8259, 3626, -2713, -8358,-12049,-13228,
457 -12856,-12123,-10333, -7012, -3862, -1844, 527, 4263, 8105, 10304, 10453,
458 9346, 7786, 5793, 3181, 40, -3553, -7164, -9520, -9740, -8339, -6135,
459 -3335, 16, 3345, 5455, 5356, 3793, 2943, 3715, 4965, 5638, 6024,
460 6657, 7270, 6829, 4385, 593, -2392, -3644, -4633, -6185, -6575, -4682,
461 -2249, -1081, -648, 222, 1873, 4273, 6609, 7328, 6269, 5017, 4332,
462 3500, 2200, 704, -1135, -3367, -5373, -6705, -7346, -7055, -5618, -3596,
463 -1716, 117, 2133, 3576, 3514, 2437, 1568, 1147, 588, -490, -1976,
464 -3125, -2983, -1979, -1775, -2637, -2993, -2327, -2013, -2843, -4077, -4841,
465 -4778, -3915, -2756, -1663, -78, 2401, 4777, 5910, 6074, 5858, 4886,
466 2889, 688, -970, -2010, -2413, -2357, -2511, -3033, -3218, -2983, -2783,
467 -2022, 315, 3490, 5687, 6228, 5642, 4405, 3006, 2065, 1656, 1592,
468 2141, 3191, 3485, 2147, -131, -2437, -4663, -6289, -6118, -3991, -1098,
469 1550, 3446, 4204, 4186, 4379, 4801, 4654, 3956, 3267, 2297, 512,
470 -1660, -3571, -5057, -5713, -5051, -3695, -2719, -2075, -1180, -306, 43,
471 201, 527, 896, 1415, 2085, 2103, 1018, -171, -613, -825, -1316,
472 -1701, -1787, -1766, -1462, -922, -997, -1987, -2857, -2699, -1736, -514,
473 484, 696, 221, 24, 316, 48, -973, -1304, -49, 1921, 3426,
474 4026, 3875, 3529, 3327, 2659, 1002, -723, -1568, -2055, -2862, -3247,
475 -2368, -873, 62, 184, 58, 315, 1196, 2204, 2563, 2494, 2945,
476 3730, 3479, 1991, 500, -527, -1710, -3069, -4146, -4921, -5126, -4168,
477 -2410, -881, 287, 1399, 2210, 2737, 3559, 4435, 4390, 3402, 2338,
478 1278, -271, -1954, -2896, -3007, -2752, -2482, -2724, -3874, -5145, -5390,
479 -4613, -3122, -402, 3217, 5859, 6536, 6136, 5381, 4239, 3021, 1905,
480 465, -1127, -2074, -2588, -3532, -4652, -5131, -4876, -4054, -2586, -848,
481 525, 1727, 3291, 4715, 5094, 4595, 3990, 3426, 2642, 1618, 196,
482 -1676, -3238, -3809, -3789, -3482, -2326, -697, -239, -1207, -1820, -939,
483 863, 2740, 4260, 5221, 5856, 6299, 5671, 3229, -23, -2465, -3892,
484 -4948, -5454, -5047, -4443, -4355, -4055, -2592, -469, 1194, 2038, 2285,
485 2563, 3653, 5162, 5484, 4235, 2697, 1473, 27, -1754, -3674, -5673,
486 -6983, -6577, -4808, -2747, -690, 1257, 2527, 3071, 3338, 3313, 2895,
487 2726, 3203, 3522, 2793, 1295, -325, -2074, -3850, -4855, -4744, -4000,
488 -2801, -1095, 473, 1418, 2150, 2712, 2651, 2407, 2619, 2775, 2513,
489 2523, 2737, 2113, 659, -598, -1376, -2019, -2413, -2377, -2143, -1792,
490 -1119, -403, -404, -963, -894, 215, 1579, 2770, 3868, 4081, 2660,
491 398, -1501, -2862, -3573, -3200, -2109, -1097, -276, 295, 45, -1024,
492 -1953, -2120, -1736, -971, 274, 1597, 2369, 2667, 2840, 2417, 947,
493 -823, -1912, -2224, -1940, -1203, -452, 127, 811, 1272, 788, -366,
494 -1342, -1806, -1746, -1161, -266, 928, 2469, 3661, 3707, 2956, 2179,
495 1379, 340, -690, -1418, -1852, -2028, -1928, -1591, -1202, -864, -267,
496 806, 1949, 2658, 2868, 2653, 2202, 1866, 1534, 768, -230, -1027,
497 -1800, -2455, -2301, -1394, -707, -605, -610, -403, -39, 282, 371,
498 423, 917, 1881, 2543, 1980, 235, -1335, -1767, -1786, -2298, -2787,
499 -2689, -2421, -2133, -1460, -694, -214, 424, 1435, 2307, 2819, 3041,
500 2652, 1573, 324, -754, -1729, -2520, -2956, -2933, -2321, -1260, -306,
501 165, 305, 416, 646, 985, 1362, 1745, 2076, 2245, 2234, 1930,
502 1150, -10, -1337, -2785, -3969, -4138, -3350, -2371, -1256, 303, 1810,
503 2722, 3265, 3605, 3559, 3246, 2772, 1942, 766, -553, -1923, -2939,
504 -3124, -2592, -1721, -657, 340, 1033, 1514, 1616, 1076, 417, 322,
505 591, 787, 929, 1058, 1046, 827, 255, -548, -1069, -1232, -1508,
506 -1928, -2066, -1828, -1384, -836, -313, 165, 570, 710, 593, 549,
507 566, 338, -42, -215, -86, 93, -71, -692, -1242, -1361, -1405,
508 -1612, -1705, -1546, -1012, 64, 1202, 1774, 2110, 2444, 2028, 747,
509 -280, -586, -712, -687, -214, 222, 21, -651, -1402, -2075, -2301,
510 -1607, -374, 420, 528, 623, 906, 895, 646, 748, 1155, 1401,
511 1471, 1569, 1443, 829, -102, -1009, -1730, -2195, -2295, -1957, -1121,
512 235, 1663, 2296, 1932, 1429, 1359, 1289, 1045, 1074, 1308, 1229,
513 771, 13, -1126, -2275, -2863, -2931, -2658, -1849, -660, 316, 931,
514 1418, 1586, 1154, 592, 633, 1166, 1428, 1169, 759, 275, -489,
515 -1425, -2208, -2714, -2705, -2029, -1090, -367, 236, 886, 1413, 1728,
516 1903, 1867, 1576, 1097, 393, -463, -1157, -1465, -1417, -1112, -615,
517 82, 923, 1390, 889, -291, -1250, -1686, -1756, -1338, -411, 577,
518 1291, 1751, 1854, 1480, 897, 393, -43, -439, -733, -924, -979,
519 -751, -354, -58, 122, 314, 418, 311, 171, 225, 428, 678,
520 1000, 1304, 1263, 748, 37, -586, -1042, -1237, -1070, -664, -243,
521 97, 262, 167, -128, -402, -445, -184, 202, 446, 534, 519,
522 323, -11, -258, -385, -468, -463, -350, -191, -36, -2, -163,
523 -207, 82, 406, 588, 861, 1087, 900, 461, 73, -396, -872,
524 -917, -514, -44, 332, 667, 771, 490, -59, -620, -1123, -1495,
525 -1448, -811, 63, 751, 1214, 1446, 1336, 1005, 611, 60, -531,
526 -828, -837, -740, -478, -139, -25, -63, 30, 245, 481, 790,
527 1033, 1002, 750, 462, 140, -197, -433, -516, -516, -578, -715,
528 -818, -821, -742, -548, -228, 77, 233, 247, 183, 100, 60,
529 91, 155, 208, 257, 275, 154, -136, -387, -429, -428, -486,
530 -396, -72, 259, 435, 450, 397, 400, 373, 153, -57, 23,
531 181, 231, 390, 496, 87, -627, -1036, -1047, -785, -216, 465,
532 823, 761, 501, 269, 197, 282, 395, 502, 597, 684, 687,
533 440, -91, -581, -803, -853, -677, -155, 367, 520, 472, 351,
534 -35, -523, -708, -585, -312, 103, 471, 530, 378, 226, 51,
535 -164, -377, -542, -582, -404, -134, 42, 91, 4, -205, -400,
536 -488, -528, -548, -453, -157, 305, 794, 1106, 1134, 866, 307,
537 -368, -839, -979, -916, -721, -436, -226, -164, -84, 26, 32,
538 27, 249, 614, 889, 1016, 1036, 931, 663, 248, -235, -632,
539 -864, -967, -997, -965, -800, -394, 150, 614, 919, 1096, 1049,
540 791, 514, 271, 19, -107, -93, -145, -295, -384, -365, -257,
541 -96, -26, -115, -232, -332, -437, -400, -167, 106, 387, 655,
542 726, 536, 231, -134, -519, -793, -961, -1068, -1019, -800, -555,
543 -275, 62, 333, 543, 777, 937, 940, 888, 784, 519, 133,
544 -278, -630, -849, -905, -836, -598, -266, -41, 129, 370, 501,
545 401, 294, 265, 159, 100, 253, 410, 336, 166, 11, -162,
546 -313, -295, -159, -70, -82, -123, -159, -195, -141, 128, 547,
547 900, 1123, 1218, 1047, 565, -14, -513, -944, -1193, -1088, -735,
548 -411, -189, -17, 62, 33, 33, 114, 218, 335, 449, 434,
549 244, -53, -414, -720, -786, -594, -314, -119, -107, -289, -515,
550 -670, -755, -661, -218, 419, 945, 1257, 1343, 1140, 688, 146,
551 -364, -747, -941, -997, -923, -669, -334, -74, 97, 267, 439,
552 594, 715, 741, 715, 739, 823, 817, 615, 225, -241, -642,
553 -911, -1033, -958, -683, -356, -53, 232, 432, 478, 491, 616,
554 782, 862, 863, 794, 586, 230, -181, -534, -750, -738, -528,
555 -311, -238, -262, -256, -227, -207, -107, 83, 179, 121, 79,
556 115, 135, 168, 205, 147, 48, 78, 104, -77, -367, -617,
557 -883, -1084, -1016, -718, -373, -15, 361, 660, 801, 781, 677,
558 554, 320, -73, -437, -617, -681, -645, -434, -130, 113, 293,
559 396, 325, 127, -74, -166, -76, 183, 416, 509, 518, 451,
560 293, 114, -37, -135, -139, -66, 9, 69, 133, 172, 213,
561 302, 407, 464, 465, 362, 169, -59, -340, -635, -779, -688,
562 -447, -84, 362, 661, 681, 514, 221, -144, -386, -357, -167,
563 107, 375, 463, 237, -179, -650, -1045, -1222, -1130, -842, -392,
564 138, 538, 675, 607, 418, 190, 41, -18, -35, -35, -32,
565 -96, -207, -325, -456, -537, -470, -334, -214, -45, 183, 298,
566 318, 354, 397, 377, 383, 478, 558, 567, 484, 302, 21,
567 -283, -518, -634, -630, -538, -323, -11, 257, 390, 440, 384,
568 210, 120, 251, 418, 464, 415, 286, 41, -216, -388, -514,
569 -519, -335, -65, 96, 139, 108, -19, -217, -360, -319, -84,
570 209, 472, 622, 599, 404, 185, 16, -167, -362, -491, -580,
571 -659, -617, -457, -316, -190, 29, 245, 336, 321, 250, 116,
572 2, -41, -39, 27, 143, 200, 119, -28, -153, -219, -211,
573 -152, -101, -31, 29, 24, -42, -109, -150, -121, -8, 81,
574 114, 185, 282, 308, 280, 243, 149, 11, -54, -87, -184,
575 -283, -303, -254, -123, 83, 232, 239, 165, 62, -49, -140,
576 -173, -148, -67, 24, 67, 84, 92, 54, -41, -121, -154,
577 -114, -23, 33, -42, -166, -268, -347, -412, -399, -276, -56,
578 203, 449, 635, 747, 724, 565, 367, 166, -64, -263, -360,
579 -406, -447, -446, -403, -362, -295, -156, -16, 98, 230, 381,
580 493, 512, 456, 390, 345, 296, 223, 156, 56, -121, -320,
581 -500, -665, -754, -680, -487, -234, 79, 378, 518, 528, 469,
582 319, 127, 35, 48, 65, 106, 170, 121, -91, -334, -506,
583 -625, -686, -636, -473, -258, -40, 168, 349, 443, 477, 509,
584 514, 432, 311, 186, -4, -269, -460, -541, -600, -629, -558,
585 -432, -326, -227, -105, 34, 209, 394, 534, 582, 577, 524,
586 403, 246, 118, 23, -71, -157, -166, -96, -30, -27, -54,
587 -75, -74, -38, -12, -25, -9, 103, 245, 354, 449, 504,
588 459, 321, 148, -52, -248, -357, -383, -369, -327, -281, -274,
589 -281, -215, -56, 146, 351, 547, 692, 699, 525, 253, 5,
590 -185, -301, -328, -280, -255, -260, -282, -372, -505, -535, -391,
591 -184, 26, 233, 392, 410, 313, 173, 39, -67, -108, -93,
592 -70, -85, -151, -261, -381, -475, -495, -443, -313, -91, 211,
593 503, 688, 732, 648, 464, 220, -12, -159, -211, -226, -273,
594 -324, -329, -267, -147, -8, 120, 253, 422, 558, 570, 491,
595 394, 269, 115, 6, -26, -46, -102, -183, -263, -295, -279,
596 -200, -55, 104, 181, 191, 229, 264, 234, 170, 120, 23,
597 -99, -169, -217, -323, -368, -285, -173, -113, -33, 59, 81,
598 15, -85, -169, -191, -127, 0, 127, 178, 111, -6, -94,
599 -130, -110, -20, 82, 87, 38, 1, -73, -175, -203, -108,
600 24, 142, 243, 255, 154, 20, -64, -99, -88, -26, 73,
601 178, 230, 191, 70, -70, -165, -187, -142, -52, 49, 163,
602 267, 320, 304, 230, 146, 70, 6, -38, -84, -144, -224,
603 -289, -349, -368, -291, -88, 163, 372, 491, 466, 307, 89,
604 -105, -254, -332, -311, -217, -111, -19, -4, -66, -132, -161,
605 -159, -125, -50, -13, -36, -42, 14, 105, 212, 311, 353,
606 331, 264, 120, -101, -320, -487, -564, -501, -331, -168, -22,
607 130, 249, 281, 288, 283, 239, 225, 267, 268, 198, 126,
608 28, -139, -302, -389, -442, -438, -302, -96, 102, 291, 438,
609 476, 423, 334, 223, 106, 14, -82, -191, -290, -397, -494,
610 -518, -425, -238, -23, 164, 270, 324, 355, 319, 215, 89,
611 -27, -147, -236, -288, -347, -395, -360, -243, -125, -43, 25,
612 75, 85, 82, 119, 160, 166, 148, 130, 82, 8, -29,
613 -63, -124, -173, -166, -121, -63, 16, 87, 163, 235, 250,
614 217, 191, 187, 142, 76, 12, -71, -137, -169, -189, -183,
615 -106, 8, 87, 134, 154, 99, 45, 84, 178, 241, 277,
616 270, 209, 125, 50, -62, -190, -254, -235, -179, -106, -18,
617 33, 46, 32, 9, -22, -35, -13, 22, 64, 78, 29,
618 -63, -133, -169, -189, -166, -121, -98, -67, -3, 15, 5,
619 44, 100, 108, 108, 114, 64, -46, -141, -245, -316, -233,
620 -59, 21, -10, -20, -6, -7, -6, 7, -3, -2, 9,
621 -2, -25, -17, -1, 1, -8, -1, -5, -11, -13, -10,
622 -14, -12, -3, 11, 6, 2, 1, -9, -13, 0, 11,
623 12, 16, 17, 9, -4, -9, -13, -11, 1, 7, 2,
624 13, 13, -3, 0, 10, 9, 3, 6, 4, -4, -9,
625 -7, -2, 6, 5, -14, -19, -9, -11, -10, -5, -16,
626 -22, -4, 17, 16, 1, -14, -17, -6, 6, 3, -2,
627 -5, -10, -11, -1, -2, -12, -12, -4, 9, 14, 15,
628 6, 9, 13, 7, -6, -5, 5, 3, -6, -10, -14,
629 -11, -4, 4, 3, -1, 3, -1, -12, -13, 2, 9,
630 -1, -7, -1, 1, 1, 12, 7, 2, -1, 3, 3,
631 7, 7, 3, -1, 4, 8, 3, 6, 6, 2, -3,
632 -2, -5, -6, 1, -2, -6, -9, -10, -7, -5, 3,
633 -4, -10, -7, 5, 7, 1, 0, 0, -8, -7, -5,
634 -1, 2, 4, 6, -1, -2, 5, 5, 0, -1, 0,
635 1, -8, -8, -12, -9, -4, -2, -3, -4, -1, 2,
636 3, 3, -3, -4, -5, 3, 6, -1, -5, -14, -13,
637 -12, -13, -11, 0, 9, 13, 10, 9, 7, 1, 1,
638 -2, 1, 3, 3, 2, 0, -2, 0, 0, 3, 1,
639 4, 2, 4, 0, 1, -1, -1, -1, 0, -2, -2,
640 -1, -2, 2, -1, 1, 0, 1, 2, 2, 1, 1,
641 1, 0, -1, -1, 0, -1, 1, -2, 2, 0, 1,
642 0, -1, -1, -1, 1, 0, 0, -1, -2, -2, -1,
643 -2, -1, 2, 1, 3, 0, 3, 0, -1, 1, -1,
644 1, 0, 1, 0, -1, 1, -2, 2, -1, 1, 0,
645 1, 0, 0, 0, 0, 0, -1, 1, -2, 1, -1,
646 1, 0, 0, 0, 0, 0, 0, 1, -1, 1, 0,
647 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1,
648 0, 0, 1, 0, 0, 0, -1, 0, -1, 1, -1,
649 1, 0, -1, 2, -1, 1, -1, 1, -1, 0, 1,
650 -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0,
651 1, -1, 1, 0, -1, 1, 0, -1, 1, -1, 0,
652 1, -1, 1, 0, -1, 1, -1, 0, 0, 1, -1,
653 1, -1, 1, 0, -1, 1, -1, 1, 0, -1, 1,
654 -1, 1, -1, 0, 1, -1, 1, -1, 1, -2, 2,
655 -1, 0, 1, -1, 0, 1, -1, 1, 0, 0, 0,
656 0, 0, 0, -1, 1, -1, 1, -1, 1, -1, 1,
657 -1, 1, -1, 0, 1, -2, 2, -1, 0, 0, 1,
658 -1, 1, 0, -1, 0, 0, 1, -2, 2, -1, 0,
659 1, -1, 0, 1, -1, 1, -1, 1, -1, 1, -1,
660 1, -1, 0, 1, -1, 1, 0, -1, 0, 0, 1,
661 -1, 0, 0, 1, -1, 0, 0, 0, 1, -1, 1,
662 -1, 0, 1, -1, 1, -1, 0, 0, 0, 1, -1,
663 1, -1, 1, -1, 1, 0, 0, 0, -1, 0, 1,
664 -1, 1, -1, 0, 0, 0, 0, 1, -1, 1, -1,
665 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1,
666 -1, 0, 1, -1, 1, 0, -1, 1, 0, -1, 1,
667 -1, 1, -1, 1, -1, 1, -1, 0, 1, -2, 2,
668 0, -1, 1, -1, 1, -1, 1, 0, -1, 1, -1,
669 0, 1, -2, 2, -1, 1, 0, 0, 0, -1, 1,
670 -1, 1, -1, 0, 0, 0, 1, -1, 1, 0, -1,
671 1, -1, 0, 1, -1, 1, -1, 1, -1, 0, 1,
672 -1, 1, -1, 0, 0, 1, -1, 1, -1, 0, 1,
673 -2, 2, -1, 0, 1, -2, 2, 0, 0, 0, -1,
674 1, -1, 0, 1, -1, 1, -1, 1, -1, 1, -1,
675 0, 1, -1, 1, -1, 0, 0, 1, -1, 1, -2,
676 2, -2, 3, -3, 3, -2, 0, 1, -1, 0, 0,
677 1, -1, 1, -1, 0, 1, -1, 0, 0, 0, 1,
678 -1, 0, 1, -1, 1, -1, 0, 0, 0, 1, -1,
679 0, 0, 0, 0, 1, -1, 1, -1, 0, 1, -1,
680 1, -1, 1, 0, -1, 1, 0, -1, 1, -1, 0,
681 1, -1, 1, -1, 1, 0, -1, 1, -1, 0, 1,
682 -1, 1, 0, 0, 0, -1, 1, -1, 0, 0, 0,
683 0, 1, -1, 1, 0, -1, 0, 1, -1, 0, 1,
684 -1, 1, -1, 1, -1, 0, 1, -2, 2, -1, 0,
685 0, 0, 1, -1, 1, -1, 1, -1, 1, -1, 1,
686 -1, 0, 1, -1, 1, -1, 1, 0, 0, -1, 1,
687 -1, 0, 0, 0, 0, 1, -1, 1, -1, 0, 1,
688 -1, 0, 1, -1, 1, -1, 1, -1, 0, 1, -1,
689 0, 1, -1, 1, 0, -1, 1, -1, 0, 1, -2,
690 2, -1, 0, 0, 0, 1, -1, 1, -1, 1, 0,
691 -1, 1, -1, 0, 1, -2, 2, -1, 0, 0, 0,
692 1, -1, 0, 0, 1, -1, 1, 0, -1, 0, 1,
693 -2, 2, -1, 1, 0, -1, 0, 1, -2, 3, -2,
694 1, -1, 1, -2, 2, -2, 2, -1, 1, -1, 1,
695 -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1,
696 0, 0, 1, -1, 1, -2, 2, -1, 1, -1, 1,
697 -1, 0, 1, -2, 2, -1, 1, -1, 0, 0, 0,
698 0, 1, -1, 1, -1, 1, -2, 2, -1, 1, 0,
699 -1, 1, -1, 1, -1, 0, 0, 0, 0, 0, 0,
700 1, -1, 1, -1, 1, -1, 0, 0, 0, 1, 0,
701 -1, 1, 0, -1, 1, -2, 2, -2, 2, -1, 0,
702 0, 0, 1, -1, 1, -1, 1, -1, 1, -1, 1,
703 0, 0, -1, 1, -1, 1, -1, 1, -1, 0, 0,
704 0, 0, 1, -1, 1, 0, -1, 0, 0, 0, 1,
705 -1, 1, -1, 0, 1, -1, 0
709 #if CONFIG_CODEC == SWCODEC
710 bool need_to_play
= false;
713 short sndbuf
[sizeof(sound
)*2];
715 /* Convert the mono "tock" sample to interleaved stereo */
716 void prepare_tock(void)
719 for(i
= 0;i
< (int)sizeof(sound
)/2;i
++) {
720 sndbuf
[i
*2] = sound
[i
];
721 sndbuf
[i
*2+1] = sound
[i
];
725 void play_tock(void) {
726 rb
->pcm_play_data(NULL
,(unsigned char *)sndbuf
,sizeof(sndbuf
));
732 void calc_period(void)
734 period
= 61440/bpm
-1; /* (60*1024)/bpm; */
738 void draw_display(void)
740 rb
->lcd_clear_display();
741 #ifdef HAVE_REMOTE_LCD
742 rb
->lcd_remote_clear_display();
745 #ifdef HAVE_LCD_BITMAP
746 rb
->lcd_setfont(FONT_SYSFIXED
);
747 rb
->lcd_putsxy(1, 1, "Metronome");
748 rb
->lcd_puts(0, 10, "Select to TAP");
749 rb
->lcd_puts(0, 12, "Rec to SYNC");
751 #ifdef HAVE_REMOTE_LCD
752 rb
->lcd_remote_putsxy(1, 1, "Metronome");
753 rb
->lcd_remote_putsxy(1, 42, "Rec to TAP");
754 rb
->lcd_remote_putsxy(1, 52, "Mode to SYNC");
757 rb
->snprintf(buffer
, sizeof(buffer
), "BPM: %d ",bpm
);
758 #ifdef HAVE_LCD_BITMAP
759 rb
->lcd_puts(0,7, buffer
);
761 rb
->lcd_puts(0,0, buffer
);
763 #ifdef HAVE_REMOTE_LCD
764 rb
->lcd_remote_putsxy(1, 32, buffer
);
767 rb
->snprintf(buffer
, sizeof(buffer
), "Vol: %d",
768 rb
->global_settings
->volume
);
769 #ifdef HAVE_LCD_BITMAP
770 rb
->lcd_puts(10, 7, buffer
);
772 rb
->lcd_puts(0,1, buffer
);
774 #ifdef HAVE_REMOTE_LCD
775 rb
->lcd_remote_putsxy(60, 32, buffer
);
778 #ifdef HAVE_LCD_BITMAP
779 rb
->lcd_drawline(0, 12, 111, 12);
781 rb
->lcd_puts(0,2,METRONOME_MSG_START
);
783 rb
->lcd_puts(0,2,METRONOME_MSG_STOP
);
786 #ifdef HAVE_REMOTE_LCD
787 rb
->lcd_remote_drawline(0, 12, 111, 12);
789 rb
->lcd_remote_putsxy(1,20,METRONOME_MSG_START
);
791 rb
->lcd_remote_putsxy(1,20,METRONOME_MSG_STOP
);
792 rb
->lcd_remote_update();
796 /* helper function to change the volume by a certain amount, +/-
797 ripped from video.c */
798 void change_volume(int delta
){
799 int minvol
= rb
->sound_min(SOUND_VOLUME
);
800 int maxvol
= rb
->sound_max(SOUND_VOLUME
);
801 int vol
= rb
->global_settings
->volume
+ delta
;
803 if (vol
> maxvol
) vol
= maxvol
;
804 else if (vol
< minvol
) vol
= minvol
;
805 if (vol
!= rb
->global_settings
->volume
) {
806 rb
->sound_set(SOUND_VOLUME
, vol
);
807 rb
->global_settings
->volume
= vol
;
812 /*function to accelerate bpm change*/
813 void change_bpm(int direction
){
814 if((bpm_step_counter
< 20)
817 bpm
= bpm
+ direction
;
818 else if (bpm_step_counter
< 60)
819 bpm
= bpm
+ direction
* 2;
821 bpm
= bpm
+ direction
* 9;
823 if (bpm
> 400) bpm
= 400;
824 if (bpm
< 1) bpm
= 1;
830 void timer_callback(void)
832 if(minitick
>= period
){
834 if(!sound_active
&& !sound_paused
&& !tap_count
) {
835 #if CONFIG_CODEC == SWCODEC
836 /* On SWCODEC we can't call play_tock() directly from an ISR. */
841 rb
->reset_poweroff_timer();
850 if (tap_count
> 1 && tap_time
> tap_timeout
)
855 void cleanup(void *parameter
)
859 rb
->timer_unregister();
860 MET_PLAY_STOP
; /* stop audio ISR */
866 if (tap_count
== 0 || tap_time
< tap_count
) {
871 bpm
= 61440/(tap_time
/tap_count
);
880 tap_timeout
= (tap_count
+2)*tap_time
/tap_count
;
884 minitick
= 0; /* sync tock to tapping */
890 enum plugin_status
plugin_start(struct plugin_api
* api
, void* parameter
){
892 const struct button_mapping
*plugin_contexts
[]
893 = {generic_directions
,
894 #if CONFIG_KEYPAD == ONDIO_PAD
896 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
900 #if (CONFIG_KEYPAD == ONDIO_PAD) \
901 || (CONFIG_KEYPAD == IRIVER_H100_PAD) \
902 || (CONFIG_KEYPAD == IRIVER_H300_PAD)
903 #define PLA_ARRAY_COUNT 3
905 #define PLA_ARRAY_COUNT 2
912 MET_PLAY_STOP
; /* stop audio IS */
914 #if CONFIG_CODEC != SWCODEC
915 rb
->bitswap(sound
, sizeof(sound
));
918 rb
->pcm_set_frequency(44100);
922 rb
->timer_register(1, NULL
, TIMER_FREQ
/1024, 1, timer_callback
);
930 #if CONFIG_CODEC == SWCODEC
931 button
= pluginlib_getaction(rb
,1,plugin_contexts
,PLA_ARRAY_COUNT
);
934 need_to_play
= false;
938 button
= pluginlib_getaction(rb
,TIMEOUT_BLOCK
,
939 plugin_contexts
,PLA_ARRAY_COUNT
);
945 /* get out of here */
949 #if CONFIG_KEYPAD == ONDIO_PAD
950 case METRONOME_PLAY_TAP
:
952 sound_paused
= false;
960 case METRONOME_PAUSE
:
967 case METRONOME_PLAYPAUSE
:
969 sound_paused
= false;
977 case METRONOME_VOL_UP
:
978 case METRONOME_VOL_UP_REP
:
983 case METRONOME_VOL_DOWN
:
984 case METRONOME_VOL_DOWN_REP
:
990 bpm_step_counter
= 0;
991 case METRONOME_LEFT_REP
:
995 case METRONOME_RIGHT
:
996 bpm_step_counter
= 0;
997 case METRONOME_RIGHT_REP
:
1001 #ifdef METRONOME_TAP
1008 case METRONOME_SYNC
:
1014 if (rb
->default_event_handler_ex(button
, cleanup
, NULL
)
1015 == SYS_USB_CONNECTED
)
1016 return PLUGIN_USB_CONNECTED
;