Change i2c config on e200. Seems to speed things up somewhat.
[kugel-rb.git] / apps / plugins / metronome.c
blob712731462acef73e9004a6586212defa75743ed8
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
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 ****************************************************************************/
19 #include "plugin.h"
20 #include "pluginlib_actions.h"
22 PLUGIN_HEADER
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
33 enum {
34 METRONOME_PLAY_TAP = LAST_PLUGINLIB_ACTION+1,
35 #if CONFIG_KEYPAD == ONDIO_PAD
36 METRONOME_PAUSE,
37 #endif
38 #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
39 METRONOME_SYNC
40 #endif
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}
54 #else
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)
61 #define MET_SYNC
62 static const struct button_mapping iriver_syncaction[] =
64 {METRONOME_SYNC, BUTTON_REC, BUTTON_NONE },
65 {CONTEXT_CUSTOM,BUTTON_NONE,BUTTON_NONE}
67 #endif
68 #endif /* #if CONFIG_KEYPAD == ONDIO_PAD */
71 static struct plugin_api* rb;
73 static int bpm = 120;
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;
89 void led(bool on)
91 #if CONFIG_CPU == SH7034
92 if(on)
93 or_b(0x40, &PBDRL);
94 else
95 and_b(~0x40, &PBDRL);
96 #else
97 (void)on;
98 #endif
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,
160 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;
166 led(0);
169 void play_tock(void){
170 sound_active = true;
171 led(1);
172 rb->mp3_play_data(sound, sizeof(sound), callback);
173 rb->mp3_play_pause(true); /* kickoff audio */
176 #else
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
708 int tock;
709 #if CONFIG_CODEC == SWCODEC
710 bool need_to_play = false;
711 #endif
713 short sndbuf[sizeof(sound)*2];
715 /* Convert the mono "tock" sample to interleaved stereo */
716 void prepare_tock(void)
718 int i;
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));
727 tock++;
730 #endif
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();
743 #endif
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");
750 #endif
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");
755 #endif
757 rb->snprintf(buffer, sizeof(buffer), "BPM: %d ",bpm);
758 #ifdef HAVE_LCD_BITMAP
759 rb->lcd_puts(0,7, buffer);
760 #else
761 rb->lcd_puts(0,0, buffer);
762 #endif
763 #ifdef HAVE_REMOTE_LCD
764 rb->lcd_remote_putsxy(1, 32, buffer);
765 #endif
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);
771 #else
772 rb->lcd_puts(0,1, buffer);
773 #endif
774 #ifdef HAVE_REMOTE_LCD
775 rb->lcd_remote_putsxy(60, 32, buffer);
776 #endif
778 #ifdef HAVE_LCD_BITMAP
779 rb->lcd_drawline(0, 12, 111, 12);
780 if(sound_paused)
781 rb->lcd_puts(0,2,METRONOME_MSG_START);
782 else
783 rb->lcd_puts(0,2,METRONOME_MSG_STOP);
784 #endif
785 rb->lcd_update();
786 #ifdef HAVE_REMOTE_LCD
787 rb->lcd_remote_drawline(0, 12, 111, 12);
788 if(sound_paused)
789 rb->lcd_remote_putsxy(1,20,METRONOME_MSG_START);
790 else
791 rb->lcd_remote_putsxy(1,20,METRONOME_MSG_STOP);
792 rb->lcd_remote_update();
793 #endif
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;
808 draw_display();
812 /*function to accelerate bpm change*/
813 void change_bpm(int direction){
814 if((bpm_step_counter < 20)
815 || (bpm > 389)
816 || (bpm < 10))
817 bpm = bpm + direction;
818 else if (bpm_step_counter < 60)
819 bpm = bpm + direction * 2;
820 else
821 bpm = bpm + direction * 9;
823 if (bpm > 400) bpm = 400;
824 if (bpm < 1) bpm = 1;
825 calc_period();
826 draw_display();
827 bpm_step_counter++;
830 void timer_callback(void)
832 if(minitick >= period){
833 minitick = 0;
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. */
837 need_to_play = true;
838 #else
839 play_tock();
840 #endif
841 rb->reset_poweroff_timer();
844 else {
845 minitick++;
848 if (tap_count) {
849 tap_time++;
850 if (tap_count > 1 && tap_time > tap_timeout)
851 tap_count = 0;
855 void cleanup(void *parameter)
857 (void)parameter;
859 rb->timer_unregister();
860 MET_PLAY_STOP; /* stop audio ISR */
861 led(0);
864 void tap(void)
866 if (tap_count == 0 || tap_time < tap_count) {
867 tap_time = 0;
869 else {
870 if (tap_time > 0) {
871 bpm = 61440/(tap_time/tap_count);
873 if (bpm > 400)
874 bpm = 400;
877 calc_period();
878 draw_display();
880 tap_timeout = (tap_count+2)*tap_time/tap_count;
883 tap_count++;
884 minitick = 0; /* sync tock to tapping */
885 play_tock();
887 reset_tap = false;
890 enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
891 int button;
892 const struct button_mapping *plugin_contexts[]
893 = {generic_directions,
894 #if CONFIG_KEYPAD == ONDIO_PAD
895 ondio_action,
896 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
897 iriver_syncaction,
898 #endif
899 generic_actions};
900 #if (CONFIG_KEYPAD == ONDIO_PAD) \
901 || (CONFIG_KEYPAD == IRIVER_H100_PAD) \
902 || (CONFIG_KEYPAD == IRIVER_H300_PAD)
903 #define PLA_ARRAY_COUNT 3
904 #else
905 #define PLA_ARRAY_COUNT 2
906 #endif
908 (void)parameter;
909 rb = api;
911 if (MET_IS_PLAYING)
912 MET_PLAY_STOP; /* stop audio IS */
914 #if CONFIG_CODEC != SWCODEC
915 rb->bitswap(sound, sizeof(sound));
916 #else
917 prepare_tock();
918 rb->pcm_set_frequency(44100);
919 #endif
921 calc_period();
922 rb->timer_register(1, NULL, TIMER_FREQ/1024, 1, timer_callback);
923 draw_display();
925 /* main loop */
926 while (true){
927 reset_tap = true;
930 #if CONFIG_CODEC == SWCODEC
931 button = pluginlib_getaction(rb,1,plugin_contexts,PLA_ARRAY_COUNT);
932 if (need_to_play)
934 need_to_play = false;
935 play_tock();
937 #else
938 button = pluginlib_getaction(rb,TIMEOUT_BLOCK,
939 plugin_contexts,PLA_ARRAY_COUNT);
940 #endif
942 switch (button) {
944 case METRONOME_QUIT:
945 /* get out of here */
946 cleanup(NULL);
947 return PLUGIN_OK;
949 #if CONFIG_KEYPAD == ONDIO_PAD
950 case METRONOME_PLAY_TAP:
951 if(sound_paused) {
952 sound_paused = false;
953 calc_period();
954 draw_display();
956 else
957 tap();
958 break;
960 case METRONOME_PAUSE:
961 if(!sound_paused) {
962 sound_paused = true;
963 draw_display();
965 break;
966 #else
967 case METRONOME_PLAYPAUSE:
968 if(sound_paused)
969 sound_paused = false;
970 else
971 sound_paused = true;
972 calc_period();
973 draw_display();
974 break;
975 #endif
977 case METRONOME_VOL_UP:
978 case METRONOME_VOL_UP_REP:
979 change_volume(1);
980 calc_period();
981 break;
983 case METRONOME_VOL_DOWN:
984 case METRONOME_VOL_DOWN_REP:
985 change_volume(-1);
986 calc_period();
987 break;
989 case METRONOME_LEFT:
990 bpm_step_counter = 0;
991 case METRONOME_LEFT_REP:
992 change_bpm(-1);
993 break;
995 case METRONOME_RIGHT:
996 bpm_step_counter = 0;
997 case METRONOME_RIGHT_REP:
998 change_bpm(1);
999 break;
1001 #ifdef METRONOME_TAP
1002 case METRONOME_TAP:
1003 tap();
1004 break;
1005 #endif
1007 #ifdef MET_SYNC
1008 case METRONOME_SYNC:
1009 minitick = period;
1010 break;
1011 #endif
1013 default:
1014 if (rb->default_event_handler_ex(button, cleanup, NULL)
1015 == SYS_USB_CONNECTED)
1016 return PLUGIN_USB_CONNECTED;
1017 reset_tap = false;
1018 break;
1021 if (reset_tap) {
1022 tap_count = 0;