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