nlgplay for mbed

Dependencies:   SDFileSystemEx mbed

Committer:
bkc_mbed
Date:
Wed Aug 20 00:31:00 2014 +0000
Revision:
8:88c89fd324bd
Parent:
7:7e183b33c3f9
Child:
9:834e9eed0d72
Reduce program size.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bkc_mbed 8:88c89fd324bd 1 //
bkc_mbed 8:88c89fd324bd 2 // NLGPLAY : NLG file player for mbed
bkc_mbed 8:88c89fd324bd 3 //
bkc_mbed 8:88c89fd324bd 4
bkc_mbed 0:2053640461b5 5 #include "mbed.h"
bkc_mbed 0:2053640461b5 6 #include "SDFileSystem.h"
bkc_mbed 0:2053640461b5 7 #include "lcd.h"
bkc_mbed 0:2053640461b5 8
bkc_mbed 8:88c89fd324bd 9 #define USE_NBV3
bkc_mbed 8:88c89fd324bd 10 #define USE_FASTIO
bkc_mbed 7:7e183b33c3f9 11
bkc_mbed 6:e48296dca6bb 12
bkc_mbed 6:e48296dca6bb 13 // (pinname, mode)
bkc_mbed 5:27f193e21222 14 DigitalIn sw_play(dp24, PullUp);
bkc_mbed 5:27f193e21222 15 DigitalIn sw_next(dp10, PullUp);
bkc_mbed 6:e48296dca6bb 16 DigitalIn sw_prev(dp9, PullUp);
bkc_mbed 0:2053640461b5 17
bkc_mbed 6:e48296dca6bb 18 // LED
bkc_mbed 1:ec416e6d5739 19 DigitalOut led1(LED1);
bkc_mbed 1:ec416e6d5739 20 DigitalOut led2(LED2);
bkc_mbed 0:2053640461b5 21
bkc_mbed 6:e48296dca6bb 22 // SPI: MOSI, MISO, SCLK, CS
bkc_mbed 0:2053640461b5 23 SDFileSystem sd(dp2, dp1, dp6, dp25, "sd");
bkc_mbed 0:2053640461b5 24
bkc_mbed 0:2053640461b5 25 //
bkc_mbed 0:2053640461b5 26 // nlg_emb.c
bkc_mbed 0:2053640461b5 27 //
bkc_mbed 0:2053640461b5 28
bkc_mbed 0:2053640461b5 29 #define CMD_PSG 0x00
bkc_mbed 0:2053640461b5 30 #define CMD_OPM 0x01
bkc_mbed 0:2053640461b5 31 #define CMD_OPM2 0x02
bkc_mbed 0:2053640461b5 32 #define CMD_IRQ 0x80
bkc_mbed 0:2053640461b5 33
bkc_mbed 0:2053640461b5 34 #define CMD_CTC0 0x81
bkc_mbed 0:2053640461b5 35 #define CMD_CTC3 0x82
bkc_mbed 0:2053640461b5 36
bkc_mbed 0:2053640461b5 37 #define NLG_VER (110)
bkc_mbed 0:2053640461b5 38 #define NLG_BASECLK (4000000)
bkc_mbed 0:2053640461b5 39
bkc_mbed 0:2053640461b5 40 FILE *nlg_file;
bkc_mbed 0:2053640461b5 41
bkc_mbed 3:aed228fa3ae4 42 char nlg_title[65];
bkc_mbed 0:2053640461b5 43 int nlg_baseclk;
bkc_mbed 0:2053640461b5 44 int nlg_tick;
bkc_mbed 0:2053640461b5 45 int nlg_length;
bkc_mbed 0:2053640461b5 46 int nlg_loop_ptr;
bkc_mbed 0:2053640461b5 47 int nlg_version;
bkc_mbed 0:2053640461b5 48
bkc_mbed 0:2053640461b5 49 int nlg_ctc0;
bkc_mbed 0:2053640461b5 50 int nlg_ctc3;
bkc_mbed 0:2053640461b5 51
bkc_mbed 8:88c89fd324bd 52 #define _WAIT for(int wcnt=0; wcnt < 2; wcnt++)
bkc_mbed 8:88c89fd324bd 53
bkc_mbed 8:88c89fd324bd 54 #ifndef USE_FASTIO
bkc_mbed 8:88c89fd324bd 55 // 通常IO
bkc_mbed 8:88c89fd324bd 56
bkc_mbed 0:2053640461b5 57 #define RCK io04
bkc_mbed 0:2053640461b5 58 #define SCK io03
bkc_mbed 0:2053640461b5 59 #define DBS io01
bkc_mbed 0:2053640461b5 60 #define CTS io02
bkc_mbed 0:2053640461b5 61
bkc_mbed 7:7e183b33c3f9 62 #define IO_A0 io05
bkc_mbed 7:7e183b33c3f9 63 #define IO_WR io06
bkc_mbed 7:7e183b33c3f9 64
bkc_mbed 8:88c89fd324bd 65 // (pinname, initial value)
bkc_mbed 8:88c89fd324bd 66 DigitalOut io01(dp13, 0); // P1_4
bkc_mbed 8:88c89fd324bd 67 DigitalOut io02(dp26, 0); // P0_3
bkc_mbed 8:88c89fd324bd 68 DigitalOut io03(dp17, 0); // P1_8
bkc_mbed 8:88c89fd324bd 69 DigitalOut io04(dp4, 0); // P0_11
bkc_mbed 7:7e183b33c3f9 70
bkc_mbed 8:88c89fd324bd 71 DigitalOut io05(dp18, 0); // P1_9
bkc_mbed 8:88c89fd324bd 72 DigitalOut io06(dp11, 0); // P1_1
bkc_mbed 8:88c89fd324bd 73
bkc_mbed 8:88c89fd324bd 74 void ioInit()
bkc_mbed 8:88c89fd324bd 75 {
bkc_mbed 8:88c89fd324bd 76 }
bkc_mbed 2:f0b7779b03c7 77
bkc_mbed 0:2053640461b5 78 // 16bit output
bkc_mbed 8:88c89fd324bd 79 void ioShiftOut(unsigned int data)
bkc_mbed 0:2053640461b5 80 {
bkc_mbed 0:2053640461b5 81 int i;
bkc_mbed 0:2053640461b5 82
bkc_mbed 0:2053640461b5 83 for(i = 0; i < 8; i++)
bkc_mbed 0:2053640461b5 84 {
bkc_mbed 0:2053640461b5 85 /* 2ビット分のデータをそれぞれ出力 */
bkc_mbed 0:2053640461b5 86 if (data & 0x80)
bkc_mbed 0:2053640461b5 87 CTS = 1;
bkc_mbed 0:2053640461b5 88 else
bkc_mbed 0:2053640461b5 89 CTS = 0;
bkc_mbed 0:2053640461b5 90
bkc_mbed 0:2053640461b5 91 if (data & 0x8000)
bkc_mbed 0:2053640461b5 92 DBS = 1;
bkc_mbed 0:2053640461b5 93 else
bkc_mbed 0:2053640461b5 94 DBS = 0;
bkc_mbed 0:2053640461b5 95
bkc_mbed 0:2053640461b5 96 data <<= 1;
bkc_mbed 0:2053640461b5 97
bkc_mbed 0:2053640461b5 98 SCK = 1;
bkc_mbed 3:aed228fa3ae4 99 // _WAIT;
bkc_mbed 0:2053640461b5 100 SCK = 0;
bkc_mbed 3:aed228fa3ae4 101 // _WAIT;
bkc_mbed 0:2053640461b5 102 }
bkc_mbed 0:2053640461b5 103
bkc_mbed 0:2053640461b5 104 RCK = 1;
bkc_mbed 3:aed228fa3ae4 105 // _WAIT;
bkc_mbed 0:2053640461b5 106 RCK = 0;
bkc_mbed 3:aed228fa3ae4 107 // _WAIT;
bkc_mbed 2:f0b7779b03c7 108 }
bkc_mbed 8:88c89fd324bd 109 #else
bkc_mbed 8:88c89fd324bd 110
bkc_mbed 8:88c89fd324bd 111 // 高速IO
bkc_mbed 8:88c89fd324bd 112
bkc_mbed 8:88c89fd324bd 113 #define RCK IO_04
bkc_mbed 8:88c89fd324bd 114 #define SCK IO_03
bkc_mbed 8:88c89fd324bd 115 #define DBS IO_01
bkc_mbed 8:88c89fd324bd 116 #define CTS IO_02
bkc_mbed 8:88c89fd324bd 117
bkc_mbed 8:88c89fd324bd 118
bkc_mbed 8:88c89fd324bd 119 #define IO_A0 io05
bkc_mbed 8:88c89fd324bd 120 #define IO_WR io06
bkc_mbed 8:88c89fd324bd 121
bkc_mbed 8:88c89fd324bd 122 DigitalOut io05(dp18, 0); // P1_9
bkc_mbed 8:88c89fd324bd 123 DigitalOut io06(dp11, 0); // P1_1
bkc_mbed 8:88c89fd324bd 124
bkc_mbed 8:88c89fd324bd 125
bkc_mbed 8:88c89fd324bd 126 #define IO_01 (1<<4) // P1_4
bkc_mbed 8:88c89fd324bd 127 #define IO_02 (1<<3) // P0_3
bkc_mbed 8:88c89fd324bd 128 #define IO_03 (1<<8) // P1_8
bkc_mbed 8:88c89fd324bd 129 #define IO_04 (1<<11) // P0_11
bkc_mbed 8:88c89fd324bd 130
bkc_mbed 8:88c89fd324bd 131
bkc_mbed 8:88c89fd324bd 132 void ioInit()
bkc_mbed 8:88c89fd324bd 133 {
bkc_mbed 8:88c89fd324bd 134 // 出力
bkc_mbed 8:88c89fd324bd 135 LPC_GPIO0->DIR |= (IO_02 | IO_04);
bkc_mbed 8:88c89fd324bd 136 LPC_GPIO1->DIR |= (IO_01 | IO_03);
bkc_mbed 8:88c89fd324bd 137 }
bkc_mbed 8:88c89fd324bd 138
bkc_mbed 8:88c89fd324bd 139 // 16bit output
bkc_mbed 8:88c89fd324bd 140 void ioShiftOut(unsigned int data)
bkc_mbed 8:88c89fd324bd 141 {
bkc_mbed 8:88c89fd324bd 142 int i;
bkc_mbed 8:88c89fd324bd 143
bkc_mbed 8:88c89fd324bd 144 for(i = 0; i < 8; i++)
bkc_mbed 8:88c89fd324bd 145 {
bkc_mbed 8:88c89fd324bd 146 /* 2ビット分のデータをそれぞれ出力 */
bkc_mbed 8:88c89fd324bd 147 if (data & 0x80)
bkc_mbed 8:88c89fd324bd 148 LPC_GPIO0->DATA |= CTS;
bkc_mbed 8:88c89fd324bd 149 else
bkc_mbed 8:88c89fd324bd 150 LPC_GPIO0->DATA &= ~CTS;
bkc_mbed 8:88c89fd324bd 151
bkc_mbed 8:88c89fd324bd 152 if (data & 0x8000)
bkc_mbed 8:88c89fd324bd 153 LPC_GPIO1->DATA |= DBS;
bkc_mbed 8:88c89fd324bd 154 else
bkc_mbed 8:88c89fd324bd 155 LPC_GPIO1->DATA &= DBS;
bkc_mbed 8:88c89fd324bd 156
bkc_mbed 8:88c89fd324bd 157 data <<= 1;
bkc_mbed 8:88c89fd324bd 158
bkc_mbed 8:88c89fd324bd 159 LPC_GPIO1->DATA |= SCK;
bkc_mbed 8:88c89fd324bd 160 LPC_GPIO1->DATA &= SCK;
bkc_mbed 8:88c89fd324bd 161 }
bkc_mbed 8:88c89fd324bd 162
bkc_mbed 8:88c89fd324bd 163 LPC_GPIO0->DATA |= RCK;
bkc_mbed 8:88c89fd324bd 164 LPC_GPIO0->DATA &= ~RCK;
bkc_mbed 8:88c89fd324bd 165
bkc_mbed 8:88c89fd324bd 166 }
bkc_mbed 8:88c89fd324bd 167
bkc_mbed 8:88c89fd324bd 168
bkc_mbed 8:88c89fd324bd 169 #endif
bkc_mbed 8:88c89fd324bd 170
bkc_mbed 2:f0b7779b03c7 171
bkc_mbed 2:f0b7779b03c7 172
bkc_mbed 0:2053640461b5 173 /* 制御信号定義 */
bkc_mbed 0:2053640461b5 174 #define CS_PSG (1 << 1)
bkc_mbed 0:2053640461b5 175 #define CS_FM1 (1 << 2)
bkc_mbed 0:2053640461b5 176 #define CS_FM2 (1 << 3)
bkc_mbed 0:2053640461b5 177 #define A0 (1 << 4)
bkc_mbed 0:2053640461b5 178 #define WR (1 << 5)
bkc_mbed 0:2053640461b5 179 #define ICL (1 << 6)
bkc_mbed 0:2053640461b5 180
bkc_mbed 0:2053640461b5 181 /* アクティブローの制御信号 */
bkc_mbed 0:2053640461b5 182 #define ACTLOW (CS_PSG | CS_FM1 | CS_FM2 | WR | ICL)
bkc_mbed 0:2053640461b5 183
bkc_mbed 7:7e183b33c3f9 184 #ifdef USE_NBV3
bkc_mbed 7:7e183b33c3f9 185 /* 16bit出力 */
bkc_mbed 7:7e183b33c3f9 186 void regOutBase(int addr, int data,int select)
bkc_mbed 7:7e183b33c3f9 187 {
bkc_mbed 7:7e183b33c3f9 188 /* アドレスを出力 */
bkc_mbed 7:7e183b33c3f9 189 /* A0をローにして待つ */
bkc_mbed 7:7e183b33c3f9 190 IO_A0 = 0;
bkc_mbed 7:7e183b33c3f9 191 ioShiftOut((addr << 8) | (ACTLOW & ~(select | WR)));
bkc_mbed 7:7e183b33c3f9 192 ioShiftOut((addr << 8) | (ACTLOW));
bkc_mbed 7:7e183b33c3f9 193
bkc_mbed 7:7e183b33c3f9 194
bkc_mbed 7:7e183b33c3f9 195 /* チップ側の処理を待つ */
bkc_mbed 7:7e183b33c3f9 196
bkc_mbed 7:7e183b33c3f9 197 /* データを出力 */
bkc_mbed 7:7e183b33c3f9 198 /* A0をハイにして待つ */
bkc_mbed 7:7e183b33c3f9 199 IO_A0 = 1;
bkc_mbed 7:7e183b33c3f9 200 ioShiftOut((data << 8) | (ACTLOW & ~(select | WR)));
bkc_mbed 7:7e183b33c3f9 201 ioShiftOut((data << 8) | (ACTLOW));
bkc_mbed 0:2053640461b5 202
bkc_mbed 7:7e183b33c3f9 203 /* 処理を待つ */
bkc_mbed 7:7e183b33c3f9 204 }
bkc_mbed 7:7e183b33c3f9 205 #else
bkc_mbed 7:7e183b33c3f9 206 /* NBV2互換出力 */
bkc_mbed 0:2053640461b5 207 void regOutBase(int addr, int data,int select)
bkc_mbed 0:2053640461b5 208 {
bkc_mbed 0:2053640461b5 209 /* アドレスを出力 */
bkc_mbed 0:2053640461b5 210 /* A0をローにして待つ */
bkc_mbed 0:2053640461b5 211 ioShiftOut((addr << 8) | (ACTLOW));
bkc_mbed 0:2053640461b5 212 ioShiftOut((addr << 8) | (ACTLOW & ~(select | WR)));
bkc_mbed 0:2053640461b5 213 ioShiftOut((addr << 8) | (ACTLOW));
bkc_mbed 0:2053640461b5 214
bkc_mbed 7:7e183b33c3f9 215 /* チップ処理待ち */
bkc_mbed 0:2053640461b5 216
bkc_mbed 0:2053640461b5 217 /* データを出力 */
bkc_mbed 0:2053640461b5 218 /* A0をハイにして待つ */
bkc_mbed 0:2053640461b5 219 ioShiftOut((data << 8) | A0 | (ACTLOW));
bkc_mbed 0:2053640461b5 220 ioShiftOut((data << 8) | A0 | (ACTLOW & ~(select | WR)));
bkc_mbed 0:2053640461b5 221 ioShiftOut((data << 8) | A0 | (ACTLOW));
bkc_mbed 0:2053640461b5 222
bkc_mbed 7:7e183b33c3f9 223 /* チップ処理待ち */
bkc_mbed 0:2053640461b5 224 }
bkc_mbed 7:7e183b33c3f9 225 #endif
bkc_mbed 0:2053640461b5 226
bkc_mbed 0:2053640461b5 227 /* PSG出力 */
bkc_mbed 0:2053640461b5 228 void regPSGOut(int addr, int data)
bkc_mbed 0:2053640461b5 229 {
bkc_mbed 0:2053640461b5 230 regOutBase(addr, data, CS_PSG);
bkc_mbed 0:2053640461b5 231 }
bkc_mbed 0:2053640461b5 232
bkc_mbed 0:2053640461b5 233 /* FM2出力 */
bkc_mbed 0:2053640461b5 234 void regFM2Out(int addr, int data)
bkc_mbed 0:2053640461b5 235 {
bkc_mbed 0:2053640461b5 236 regOutBase(addr, data, CS_FM2);
bkc_mbed 0:2053640461b5 237 }
bkc_mbed 0:2053640461b5 238
bkc_mbed 0:2053640461b5 239 /* FM音源にデータを出力 */
bkc_mbed 0:2053640461b5 240 void regFMOut(int addr,int data)
bkc_mbed 0:2053640461b5 241 {
bkc_mbed 0:2053640461b5 242 regOutBase(addr, data, CS_FM1);
bkc_mbed 0:2053640461b5 243 }
bkc_mbed 0:2053640461b5 244
bkc_mbed 0:2053640461b5 245 /* ボード消音 */
bkc_mbed 0:2053640461b5 246 void boardMute(void)
bkc_mbed 0:2053640461b5 247 {
bkc_mbed 0:2053640461b5 248 int i;
bkc_mbed 0:2053640461b5 249
bkc_mbed 0:2053640461b5 250 /* PSG初期化 */
bkc_mbed 0:2053640461b5 251 regPSGOut(0x00,0);
bkc_mbed 0:2053640461b5 252 regPSGOut(0x01,0);
bkc_mbed 0:2053640461b5 253
bkc_mbed 3:aed228fa3ae4 254 regPSGOut(0x06, 0x00);
bkc_mbed 3:aed228fa3ae4 255 regPSGOut(0x07, 0x3f); // ALL OFF
bkc_mbed 3:aed228fa3ae4 256 regPSGOut(0x08, 0x00); // CH.A 0
bkc_mbed 3:aed228fa3ae4 257 regPSGOut(0x09, 0x00); // CH.B 0
bkc_mbed 3:aed228fa3ae4 258 regPSGOut(0x0a, 0x00); // CH.C 0
bkc_mbed 0:2053640461b5 259
bkc_mbed 7:7e183b33c3f9 260 /* MUTE(disable) */
bkc_mbed 0:2053640461b5 261 for(i = 0x20; i < 0x28; i++)
bkc_mbed 3:aed228fa3ae4 262 {
bkc_mbed 0:2053640461b5 263 regFMOut(i, 0x00);
bkc_mbed 3:aed228fa3ae4 264 regFM2Out(i, 0x00);
bkc_mbed 3:aed228fa3ae4 265 }
bkc_mbed 0:2053640461b5 266
bkc_mbed 7:7e183b33c3f9 267 // KEYOFF
bkc_mbed 3:aed228fa3ae4 268 for(i = 0x00; i < 0x08; i++)
bkc_mbed 3:aed228fa3ae4 269 {
bkc_mbed 3:aed228fa3ae4 270 regFMOut(0x08, i & 0x07);
bkc_mbed 3:aed228fa3ae4 271 regFM2Out(0x08, i & 0x07);
bkc_mbed 3:aed228fa3ae4 272 }
bkc_mbed 7:7e183b33c3f9 273
bkc_mbed 7:7e183b33c3f9 274 // FORCE RELEASE
bkc_mbed 7:7e183b33c3f9 275 for(i= 0x00; i < 0x20; i++)
bkc_mbed 7:7e183b33c3f9 276 {
bkc_mbed 7:7e183b33c3f9 277 regFMOut(0xE0 + i, 0x0f);
bkc_mbed 7:7e183b33c3f9 278 regFM2Out(0xE0 + i, 0x0f);
bkc_mbed 7:7e183b33c3f9 279 }
bkc_mbed 0:2053640461b5 280 }
bkc_mbed 0:2053640461b5 281
bkc_mbed 0:2053640461b5 282
bkc_mbed 0:2053640461b5 283 /* ボード初期化 */
bkc_mbed 0:2053640461b5 284 void boardInit(void)
bkc_mbed 0:2053640461b5 285 {
bkc_mbed 1:ec416e6d5739 286 wait_ms(20);
bkc_mbed 0:2053640461b5 287 /* ICLのみをLOW(アクティブ)にする */
bkc_mbed 0:2053640461b5 288 ioShiftOut(ACTLOW & ~(ICL));
bkc_mbed 6:e48296dca6bb 289 wait_ms(150);
bkc_mbed 0:2053640461b5 290
bkc_mbed 0:2053640461b5 291 /* 元に戻す */
bkc_mbed 0:2053640461b5 292 ioShiftOut(ACTLOW);
bkc_mbed 1:ec416e6d5739 293 wait_ms(10);
bkc_mbed 0:2053640461b5 294 }
bkc_mbed 0:2053640461b5 295
bkc_mbed 0:2053640461b5 296 typedef unsigned char byte;
bkc_mbed 0:2053640461b5 297 typedef unsigned short word;
bkc_mbed 0:2053640461b5 298 typedef unsigned long dword;
bkc_mbed 0:2053640461b5 299
bkc_mbed 0:2053640461b5 300
bkc_mbed 0:2053640461b5 301 // 変数読み出し(WORD)
bkc_mbed 0:2053640461b5 302 word ReadWORD(byte *p)
bkc_mbed 0:2053640461b5 303 {
bkc_mbed 0:2053640461b5 304 return
bkc_mbed 0:2053640461b5 305 ((word)p[0]) |
bkc_mbed 0:2053640461b5 306 ((word)p[1])<<8;
bkc_mbed 0:2053640461b5 307 }
bkc_mbed 0:2053640461b5 308
bkc_mbed 0:2053640461b5 309 // 変数読み出し(DWORD)
bkc_mbed 0:2053640461b5 310 dword ReadDWORD(byte *p)
bkc_mbed 0:2053640461b5 311 {
bkc_mbed 0:2053640461b5 312 return
bkc_mbed 0:2053640461b5 313 ((dword)p[0]) |
bkc_mbed 0:2053640461b5 314 ((dword)p[1])<<8 |
bkc_mbed 0:2053640461b5 315 ((dword)p[2])<<16 |
bkc_mbed 0:2053640461b5 316 ((dword)p[3])<<24;
bkc_mbed 0:2053640461b5 317 }
bkc_mbed 0:2053640461b5 318
bkc_mbed 0:2053640461b5 319 // NLGファイルを開く
bkc_mbed 0:2053640461b5 320 int OpenNLG(const char *file)
bkc_mbed 0:2053640461b5 321 {
bkc_mbed 3:aed228fa3ae4 322 byte nlg_hdr[0x60];
bkc_mbed 1:ec416e6d5739 323
bkc_mbed 0:2053640461b5 324 nlg_file = fopen(file, "rb");
bkc_mbed 0:2053640461b5 325
bkc_mbed 0:2053640461b5 326 if (!nlg_file)
bkc_mbed 0:2053640461b5 327 {
bkc_mbed 0:2053640461b5 328 printf("File open error:%s\n", file);
bkc_mbed 0:2053640461b5 329 return -1;
bkc_mbed 0:2053640461b5 330 }
bkc_mbed 0:2053640461b5 331
bkc_mbed 0:2053640461b5 332 fread(nlg_hdr, 0x60, 1, nlg_file);
bkc_mbed 0:2053640461b5 333
bkc_mbed 6:e48296dca6bb 334 if (memcmp(nlg_hdr, "NLG1", 4) != 0)
bkc_mbed 0:2053640461b5 335 {
bkc_mbed 0:2053640461b5 336 printf("Unknown format!\n");
bkc_mbed 0:2053640461b5 337 fclose(nlg_file);
bkc_mbed 0:2053640461b5 338 return -1;
bkc_mbed 0:2053640461b5 339 }
bkc_mbed 0:2053640461b5 340
bkc_mbed 0:2053640461b5 341 nlg_version = ReadWORD(nlg_hdr + 4);
bkc_mbed 0:2053640461b5 342
bkc_mbed 0:2053640461b5 343 memcpy(nlg_title, nlg_hdr + 8, 64);
bkc_mbed 0:2053640461b5 344 nlg_title[64]=0;
bkc_mbed 0:2053640461b5 345
bkc_mbed 0:2053640461b5 346 nlg_baseclk = ReadDWORD(nlg_hdr + 72);
bkc_mbed 0:2053640461b5 347 nlg_tick = ReadDWORD(nlg_hdr + 76);
bkc_mbed 0:2053640461b5 348
bkc_mbed 0:2053640461b5 349 nlg_length = ReadDWORD(nlg_hdr + 88);
bkc_mbed 0:2053640461b5 350 nlg_loop_ptr = (long)ReadDWORD(nlg_hdr + 92);
bkc_mbed 0:2053640461b5 351
bkc_mbed 0:2053640461b5 352 fseek(nlg_file, 0x60, SEEK_SET);
bkc_mbed 0:2053640461b5 353
bkc_mbed 0:2053640461b5 354 nlg_ctc0 = nlg_ctc3 = 0;
bkc_mbed 0:2053640461b5 355
bkc_mbed 0:2053640461b5 356 return 0;
bkc_mbed 0:2053640461b5 357 }
bkc_mbed 0:2053640461b5 358
bkc_mbed 2:f0b7779b03c7 359 #if 0
bkc_mbed 2:f0b7779b03c7 360
bkc_mbed 8:88c89fd324bd 361
bkc_mbed 8:88c89fd324bd 362 // 変数書き出し(WORD)
bkc_mbed 8:88c89fd324bd 363 inline void WriteWORD(byte *p,word val)
bkc_mbed 8:88c89fd324bd 364 {
bkc_mbed 8:88c89fd324bd 365 p[0] = (val & 0xff);
bkc_mbed 8:88c89fd324bd 366 p[1] = ((val>>8) & 0xff);
bkc_mbed 8:88c89fd324bd 367 }
bkc_mbed 8:88c89fd324bd 368
bkc_mbed 8:88c89fd324bd 369 // 変数書き出し(DWORD)
bkc_mbed 8:88c89fd324bd 370 inline void WriteDWORD(byte *p,dword val)
bkc_mbed 8:88c89fd324bd 371 {
bkc_mbed 8:88c89fd324bd 372 p[0] = (val & 0xff);
bkc_mbed 8:88c89fd324bd 373 p[1] = ((val>>8) & 0xff);
bkc_mbed 8:88c89fd324bd 374 p[2] = ((val>>16) & 0xff);
bkc_mbed 8:88c89fd324bd 375 p[3] = ((val>>24) & 0xff);
bkc_mbed 8:88c89fd324bd 376 }
bkc_mbed 8:88c89fd324bd 377
bkc_mbed 0:2053640461b5 378 // 書き込み用NLGファイルを開く
bkc_mbed 0:2053640461b5 379 int CreateNLG(const char *file)
bkc_mbed 0:2053640461b5 380 {
bkc_mbed 0:2053640461b5 381 byte hdr[0x80];
bkc_mbed 0:2053640461b5 382
bkc_mbed 0:2053640461b5 383 nlg_file = fopen(file, "wb");
bkc_mbed 0:2053640461b5 384
bkc_mbed 0:2053640461b5 385 if (!nlg_file)
bkc_mbed 0:2053640461b5 386 {
bkc_mbed 0:2053640461b5 387 printf("File open error:%s\n", file);
bkc_mbed 0:2053640461b5 388 return -1;
bkc_mbed 0:2053640461b5 389 }
bkc_mbed 0:2053640461b5 390
bkc_mbed 0:2053640461b5 391 memset(hdr, 0, 0x80);
bkc_mbed 0:2053640461b5 392 memcpy(hdr,"NLG1",4);
bkc_mbed 0:2053640461b5 393
bkc_mbed 0:2053640461b5 394 WriteWORD(hdr + 4, NLG_VER); // Version
bkc_mbed 0:2053640461b5 395 WriteDWORD(hdr + 72, NLG_BASECLK); // BaseCLK
bkc_mbed 0:2053640461b5 396 WriteDWORD(hdr + 76, 0); // Tick
bkc_mbed 0:2053640461b5 397 WriteDWORD(hdr + 88, 0); // Length
bkc_mbed 0:2053640461b5 398 WriteDWORD(hdr + 92, 0); // Loop Pointer
bkc_mbed 0:2053640461b5 399
bkc_mbed 0:2053640461b5 400 fwrite(hdr, 0x60, 1, nlg_file);
bkc_mbed 0:2053640461b5 401
bkc_mbed 0:2053640461b5 402 nlg_ctc0 = nlg_ctc3 = 0;
bkc_mbed 0:2053640461b5 403
bkc_mbed 0:2053640461b5 404 return 0;
bkc_mbed 0:2053640461b5 405 }
bkc_mbed 0:2053640461b5 406
bkc_mbed 0:2053640461b5 407
bkc_mbed 0:2053640461b5 408 // コマンドの書き込み
bkc_mbed 0:2053640461b5 409 void WriteNLG_CMD(int cmd)
bkc_mbed 0:2053640461b5 410 {
bkc_mbed 0:2053640461b5 411 if (!nlg_file)
bkc_mbed 0:2053640461b5 412 return;
bkc_mbed 0:2053640461b5 413
bkc_mbed 0:2053640461b5 414 fputc(cmd, nlg_file);
bkc_mbed 0:2053640461b5 415 }
bkc_mbed 0:2053640461b5 416
bkc_mbed 0:2053640461b5 417 // CTC定数の書き込み
bkc_mbed 0:2053640461b5 418 void WriteNLG_CTC(int cmd,int ctc)
bkc_mbed 0:2053640461b5 419 {
bkc_mbed 0:2053640461b5 420 if (!nlg_file)
bkc_mbed 0:2053640461b5 421 return;
bkc_mbed 0:2053640461b5 422
bkc_mbed 0:2053640461b5 423 fputc(cmd, nlg_file);
bkc_mbed 0:2053640461b5 424 fputc(ctc, nlg_file);
bkc_mbed 0:2053640461b5 425 }
bkc_mbed 0:2053640461b5 426
bkc_mbed 0:2053640461b5 427 // データの書き込み
bkc_mbed 0:2053640461b5 428 void WriteNLG_Data(int cmd,int addr,int data)
bkc_mbed 0:2053640461b5 429 {
bkc_mbed 0:2053640461b5 430 if (!nlg_file)
bkc_mbed 0:2053640461b5 431 return;
bkc_mbed 0:2053640461b5 432
bkc_mbed 0:2053640461b5 433 fputc(cmd, nlg_file);
bkc_mbed 0:2053640461b5 434 fputc(addr, nlg_file);
bkc_mbed 0:2053640461b5 435 fputc(data, nlg_file);
bkc_mbed 0:2053640461b5 436 }
bkc_mbed 0:2053640461b5 437
bkc_mbed 2:f0b7779b03c7 438 #endif
bkc_mbed 2:f0b7779b03c7 439
bkc_mbed 2:f0b7779b03c7 440 // ファイルを閉じる
bkc_mbed 2:f0b7779b03c7 441 void CloseNLG(void)
bkc_mbed 2:f0b7779b03c7 442 {
bkc_mbed 2:f0b7779b03c7 443 if (!nlg_file)
bkc_mbed 2:f0b7779b03c7 444 return;
bkc_mbed 2:f0b7779b03c7 445
bkc_mbed 2:f0b7779b03c7 446 fclose(nlg_file);
bkc_mbed 8:88c89fd324bd 447
bkc_mbed 2:f0b7779b03c7 448 #if defined(__MICROLIB) && defined(__ARMCC_VERSION) // with microlib and ARM compiler
bkc_mbed 2:f0b7779b03c7 449 free(nlg_file);
bkc_mbed 2:f0b7779b03c7 450 #endif
bkc_mbed 2:f0b7779b03c7 451
bkc_mbed 2:f0b7779b03c7 452 nlg_file = NULL;
bkc_mbed 2:f0b7779b03c7 453 }
bkc_mbed 2:f0b7779b03c7 454
bkc_mbed 0:2053640461b5 455 // データの読み出し
bkc_mbed 8:88c89fd324bd 456 inline int ReadNLG(void)
bkc_mbed 0:2053640461b5 457 {
bkc_mbed 0:2053640461b5 458 return fgetc(nlg_file);
bkc_mbed 0:2053640461b5 459 }
bkc_mbed 0:2053640461b5 460
bkc_mbed 0:2053640461b5 461 // ファイルポインタの位置を取得
bkc_mbed 8:88c89fd324bd 462 inline long TellNLG(void)
bkc_mbed 0:2053640461b5 463 {
bkc_mbed 0:2053640461b5 464 return ftell(nlg_file);
bkc_mbed 0:2053640461b5 465 }
bkc_mbed 0:2053640461b5 466
bkc_mbed 0:2053640461b5 467 // ファイルポインタの位置を設定
bkc_mbed 8:88c89fd324bd 468 inline void SeekNLG(long pos)
bkc_mbed 0:2053640461b5 469 {
bkc_mbed 0:2053640461b5 470 fseek(nlg_file, pos, SEEK_SET);
bkc_mbed 0:2053640461b5 471 }
bkc_mbed 0:2053640461b5 472
bkc_mbed 0:2053640461b5 473 // タイトルの取得
bkc_mbed 8:88c89fd324bd 474 inline char *GetTitleNLG(void)
bkc_mbed 0:2053640461b5 475 {
bkc_mbed 0:2053640461b5 476 return nlg_title;
bkc_mbed 0:2053640461b5 477 }
bkc_mbed 0:2053640461b5 478
bkc_mbed 0:2053640461b5 479 // ティックの取得
bkc_mbed 8:88c89fd324bd 480 inline int GetTickNLG(void)
bkc_mbed 0:2053640461b5 481 {
bkc_mbed 0:2053640461b5 482 return nlg_tick;
bkc_mbed 0:2053640461b5 483 }
bkc_mbed 0:2053640461b5 484
bkc_mbed 3:aed228fa3ae4 485 // Set Tick
bkc_mbed 3:aed228fa3ae4 486 inline void SetTick(void)
bkc_mbed 3:aed228fa3ae4 487 {
bkc_mbed 3:aed228fa3ae4 488 nlg_tick = ((nlg_ctc0 * 256) * nlg_ctc3);
bkc_mbed 3:aed228fa3ae4 489 // printf("nlg_tick=%d\n", nlg_tick);
bkc_mbed 3:aed228fa3ae4 490 }
bkc_mbed 3:aed228fa3ae4 491
bkc_mbed 0:2053640461b5 492 // CTC0値の設定
bkc_mbed 0:2053640461b5 493 void SetCTC0_NLG(int value)
bkc_mbed 0:2053640461b5 494 {
bkc_mbed 0:2053640461b5 495 nlg_ctc0 = value;
bkc_mbed 3:aed228fa3ae4 496 SetTick();
bkc_mbed 0:2053640461b5 497 }
bkc_mbed 0:2053640461b5 498
bkc_mbed 0:2053640461b5 499 // CTC3値の設定
bkc_mbed 0:2053640461b5 500 void SetCTC3_NLG(int value)
bkc_mbed 0:2053640461b5 501 {
bkc_mbed 0:2053640461b5 502 nlg_ctc3 = value;
bkc_mbed 3:aed228fa3ae4 503 SetTick();
bkc_mbed 0:2053640461b5 504 }
bkc_mbed 0:2053640461b5 505
bkc_mbed 0:2053640461b5 506 // 曲の長さを得る
bkc_mbed 0:2053640461b5 507 int GetLengthNLG(void)
bkc_mbed 0:2053640461b5 508 {
bkc_mbed 0:2053640461b5 509 return nlg_length;
bkc_mbed 0:2053640461b5 510 }
bkc_mbed 0:2053640461b5 511
bkc_mbed 0:2053640461b5 512 // ループポインタを得る
bkc_mbed 0:2053640461b5 513 int GetLoopPtrNLG(void)
bkc_mbed 0:2053640461b5 514 {
bkc_mbed 0:2053640461b5 515 return nlg_loop_ptr;
bkc_mbed 0:2053640461b5 516 }
bkc_mbed 0:2053640461b5 517
bkc_mbed 0:2053640461b5 518 // ベースクロックを得る
bkc_mbed 0:2053640461b5 519 int GetBaseClkNLG(void)
bkc_mbed 0:2053640461b5 520 {
bkc_mbed 0:2053640461b5 521 return nlg_baseclk;
bkc_mbed 0:2053640461b5 522 }
bkc_mbed 0:2053640461b5 523
bkc_mbed 0:2053640461b5 524 #define CMD_PSG 0x00
bkc_mbed 0:2053640461b5 525 #define CMD_OPM 0x01
bkc_mbed 0:2053640461b5 526 #define CMD_OPM2 0x02
bkc_mbed 0:2053640461b5 527 #define CMD_IRQ 0x80
bkc_mbed 0:2053640461b5 528
bkc_mbed 0:2053640461b5 529 #define CMD_CTC0 0x81
bkc_mbed 0:2053640461b5 530 #define CMD_CTC3 0x82
bkc_mbed 0:2053640461b5 531
bkc_mbed 0:2053640461b5 532
bkc_mbed 0:2053640461b5 533 /* 単位を扱いやすいように */
bkc_mbed 0:2053640461b5 534 typedef unsigned char byte;
bkc_mbed 0:2053640461b5 535 typedef unsigned short word;
bkc_mbed 0:2053640461b5 536 typedef unsigned long dword;
bkc_mbed 0:2053640461b5 537
bkc_mbed 0:2053640461b5 538 /* NLGを処理するための構造体 */
bkc_mbed 0:2053640461b5 539 typedef struct
bkc_mbed 0:2053640461b5 540 {
bkc_mbed 0:2053640461b5 541 int base_clk;
bkc_mbed 0:2053640461b5 542 int clk_per_sample;
bkc_mbed 0:2053640461b5 543
bkc_mbed 0:2053640461b5 544 int freeze;
bkc_mbed 0:2053640461b5 545 int total_samples;
bkc_mbed 0:2053640461b5 546
bkc_mbed 0:2053640461b5 547 int total_sec;
bkc_mbed 0:2053640461b5 548
bkc_mbed 0:2053640461b5 549 int current_samples;
bkc_mbed 0:2053640461b5 550 int tick;
bkc_mbed 0:2053640461b5 551 int tick_sec;
bkc_mbed 0:2053640461b5 552
bkc_mbed 0:2053640461b5 553 int irq_count;
bkc_mbed 0:2053640461b5 554 int irq_loop;
bkc_mbed 0:2053640461b5 555 long loop_address;
bkc_mbed 2:f0b7779b03c7 556
bkc_mbed 1:ec416e6d5739 557 int irq_counter;
bkc_mbed 1:ec416e6d5739 558 int irq_counter2;
bkc_mbed 1:ec416e6d5739 559
bkc_mbed 0:2053640461b5 560 } NLG_R;
bkc_mbed 0:2053640461b5 561
bkc_mbed 0:2053640461b5 562
bkc_mbed 0:2053640461b5 563 /* 初期化 */
bkc_mbed 0:2053640461b5 564 int initNLG(NLG_R *np, const char *nlg_name)
bkc_mbed 0:2053640461b5 565 {
bkc_mbed 0:2053640461b5 566 if (OpenNLG(nlg_name) < 0)
bkc_mbed 0:2053640461b5 567 return -1;
bkc_mbed 0:2053640461b5 568
bkc_mbed 0:2053640461b5 569 np->base_clk = GetBaseClkNLG();
bkc_mbed 0:2053640461b5 570
bkc_mbed 0:2053640461b5 571 /* printf("Title:%s %d %d %dsec %d\n",
bkc_mbed 0:2053640461b5 572 GetTitleNLG(),
bkc_mbed 0:2053640461b5 573 GetBaseClkNLG(),
bkc_mbed 0:2053640461b5 574 GetTickNLG(),
bkc_mbed 0:2053640461b5 575 GetLengthNLG(),
bkc_mbed 0:2053640461b5 576 GetLoopPtrNLG());
bkc_mbed 0:2053640461b5 577 */
bkc_mbed 0:2053640461b5 578
bkc_mbed 0:2053640461b5 579 np->total_samples = 0;
bkc_mbed 0:2053640461b5 580 np->current_samples = 0;
bkc_mbed 0:2053640461b5 581
bkc_mbed 0:2053640461b5 582 np->total_sec = 0;
bkc_mbed 0:2053640461b5 583
bkc_mbed 0:2053640461b5 584 np->tick = 0;
bkc_mbed 0:2053640461b5 585 np->tick_sec = 0;
bkc_mbed 0:2053640461b5 586
bkc_mbed 0:2053640461b5 587 np->freeze = 0;
bkc_mbed 0:2053640461b5 588
bkc_mbed 0:2053640461b5 589 np->irq_count = 0;
bkc_mbed 0:2053640461b5 590 np->irq_loop = GetLoopPtrNLG();
bkc_mbed 0:2053640461b5 591 np->loop_address = -1;
bkc_mbed 2:f0b7779b03c7 592
bkc_mbed 1:ec416e6d5739 593 np->irq_counter = 0;
bkc_mbed 1:ec416e6d5739 594 np->irq_counter2 = 0;
bkc_mbed 0:2053640461b5 595
bkc_mbed 0:2053640461b5 596 return 0;
bkc_mbed 0:2053640461b5 597 }
bkc_mbed 0:2053640461b5 598
bkc_mbed 0:2053640461b5 599 /* PSGへの出力 */
bkc_mbed 0:2053640461b5 600 void WritePSG(int addr,int value)
bkc_mbed 0:2053640461b5 601 {
bkc_mbed 0:2053640461b5 602 regPSGOut(addr, value);
bkc_mbed 0:2053640461b5 603 }
bkc_mbed 0:2053640461b5 604
bkc_mbed 0:2053640461b5 605 /* FM1への出力 */
bkc_mbed 0:2053640461b5 606 void WriteOPM(int addr,int value)
bkc_mbed 0:2053640461b5 607 {
bkc_mbed 0:2053640461b5 608 regFMOut(addr, value);
bkc_mbed 0:2053640461b5 609 }
bkc_mbed 0:2053640461b5 610
bkc_mbed 0:2053640461b5 611 /* FM2への出力 */
bkc_mbed 0:2053640461b5 612 void WriteOPM2(int addr,int value)
bkc_mbed 0:2053640461b5 613 {
bkc_mbed 0:2053640461b5 614 regFM2Out(addr, value);
bkc_mbed 0:2053640461b5 615 }
bkc_mbed 0:2053640461b5 616
bkc_mbed 6:e48296dca6bb 617 // stop flag
bkc_mbed 6:e48296dca6bb 618 bool g_stop = false;
bkc_mbed 6:e48296dca6bb 619 bool g_prev = false;
bkc_mbed 0:2053640461b5 620
bkc_mbed 0:2053640461b5 621 void DispNLG(NLG_R *np)
bkc_mbed 0:2053640461b5 622 {
bkc_mbed 1:ec416e6d5739 623 // printf("Time %02d:%02d\r",np->total_sec / 60, np->total_sec % 60);
bkc_mbed 1:ec416e6d5739 624 // fflush(stdout);
bkc_mbed 0:2053640461b5 625
bkc_mbed 0:2053640461b5 626 char buf[16];
bkc_mbed 2:f0b7779b03c7 627 sprintf(buf, "%02d:%02d",
bkc_mbed 2:f0b7779b03c7 628 np->total_sec / 60,
bkc_mbed 2:f0b7779b03c7 629 np->total_sec % 60);
bkc_mbed 0:2053640461b5 630
bkc_mbed 2:f0b7779b03c7 631 lcd_setCursor(3,1);
bkc_mbed 2:f0b7779b03c7 632 lcd_printStr(buf);
bkc_mbed 0:2053640461b5 633 }
bkc_mbed 0:2053640461b5 634
bkc_mbed 6:e48296dca6bb 635 // wait until release buttons
bkc_mbed 6:e48296dca6bb 636 void waitButtonRelease(void)
bkc_mbed 6:e48296dca6bb 637 {
bkc_mbed 6:e48296dca6bb 638 while(!sw_next || !sw_play || !sw_prev);
bkc_mbed 6:e48296dca6bb 639 }
bkc_mbed 6:e48296dca6bb 640
bkc_mbed 6:e48296dca6bb 641 // wait until press buttons
bkc_mbed 6:e48296dca6bb 642 void waitButtonPress(void)
bkc_mbed 6:e48296dca6bb 643 {
bkc_mbed 6:e48296dca6bb 644 while(sw_next && sw_play && sw_prev);
bkc_mbed 6:e48296dca6bb 645 }
bkc_mbed 6:e48296dca6bb 646
bkc_mbed 0:2053640461b5 647 /* NLGの再生 */
bkc_mbed 0:2053640461b5 648 int PlayNLG(NLG_R *np, int sec)
bkc_mbed 0:2053640461b5 649 {
bkc_mbed 0:2053640461b5 650 int cmd;
bkc_mbed 0:2053640461b5 651 int addr, data;
bkc_mbed 0:2053640461b5 652 int result = 0;
bkc_mbed 0:2053640461b5 653
bkc_mbed 0:2053640461b5 654 int tick;
bkc_mbed 0:2053640461b5 655 int total_us = 0;
bkc_mbed 0:2053640461b5 656 int us_tick = np->base_clk / 1000000;
bkc_mbed 0:2053640461b5 657
bkc_mbed 2:f0b7779b03c7 658 printf("start play\n");
bkc_mbed 0:2053640461b5 659 Timer t;
bkc_mbed 0:2053640461b5 660
bkc_mbed 0:2053640461b5 661 t.start();
bkc_mbed 0:2053640461b5 662 total_us = 0;
bkc_mbed 0:2053640461b5 663
bkc_mbed 0:2053640461b5 664 // wait until release buttons
bkc_mbed 6:e48296dca6bb 665 waitButtonRelease();
bkc_mbed 0:2053640461b5 666
bkc_mbed 0:2053640461b5 667 DispNLG(np);
bkc_mbed 0:2053640461b5 668
bkc_mbed 0:2053640461b5 669 while(np->total_sec < sec && !g_stop)
bkc_mbed 0:2053640461b5 670 {
bkc_mbed 0:2053640461b5 671 // push next
bkc_mbed 0:2053640461b5 672 if (!sw_next)
bkc_mbed 0:2053640461b5 673 break;
bkc_mbed 6:e48296dca6bb 674
bkc_mbed 6:e48296dca6bb 675 // push prev
bkc_mbed 6:e48296dca6bb 676 if (!sw_prev)
bkc_mbed 6:e48296dca6bb 677 {
bkc_mbed 6:e48296dca6bb 678 g_prev = true;
bkc_mbed 6:e48296dca6bb 679 break;
bkc_mbed 6:e48296dca6bb 680 }
bkc_mbed 0:2053640461b5 681
bkc_mbed 0:2053640461b5 682 // push play
bkc_mbed 0:2053640461b5 683 if (!sw_play)
bkc_mbed 0:2053640461b5 684 {
bkc_mbed 6:e48296dca6bb 685 g_stop = true;
bkc_mbed 0:2053640461b5 686 break;
bkc_mbed 0:2053640461b5 687 }
bkc_mbed 0:2053640461b5 688
bkc_mbed 0:2053640461b5 689 /* ウエイトの処理 */
bkc_mbed 0:2053640461b5 690 while (np->tick >= us_tick)
bkc_mbed 0:2053640461b5 691 {
bkc_mbed 0:2053640461b5 692 int us = np->tick / us_tick;
bkc_mbed 0:2053640461b5 693 np->tick -= (us * us_tick);
bkc_mbed 0:2053640461b5 694
bkc_mbed 0:2053640461b5 695 while(t.read_us() < total_us + us);
bkc_mbed 3:aed228fa3ae4 696
bkc_mbed 0:2053640461b5 697 total_us += us;
bkc_mbed 0:2053640461b5 698
bkc_mbed 3:aed228fa3ae4 699 // reset timer
bkc_mbed 0:2053640461b5 700 if (total_us >= 1000000)
bkc_mbed 0:2053640461b5 701 {
bkc_mbed 0:2053640461b5 702 total_us -= t.read_us();
bkc_mbed 0:2053640461b5 703 t.reset();
bkc_mbed 0:2053640461b5 704 }
bkc_mbed 0:2053640461b5 705 // DELAY_NEXT(us);
bkc_mbed 0:2053640461b5 706
bkc_mbed 0:2053640461b5 707 // printf("delay : %dus\n",us);
bkc_mbed 0:2053640461b5 708 }
bkc_mbed 0:2053640461b5 709
bkc_mbed 0:2053640461b5 710 /* コマンドの読み出し */
bkc_mbed 0:2053640461b5 711 cmd = ReadNLG();
bkc_mbed 0:2053640461b5 712 if (cmd == EOF)
bkc_mbed 0:2053640461b5 713 {
bkc_mbed 0:2053640461b5 714 if (np->loop_address >= 0)
bkc_mbed 0:2053640461b5 715 {
bkc_mbed 0:2053640461b5 716 SeekNLG(np->loop_address);
bkc_mbed 0:2053640461b5 717 cmd = ReadNLG();
bkc_mbed 0:2053640461b5 718 }
bkc_mbed 0:2053640461b5 719 else
bkc_mbed 0:2053640461b5 720 {
bkc_mbed 0:2053640461b5 721 result = EOF;
bkc_mbed 0:2053640461b5 722 break;
bkc_mbed 0:2053640461b5 723 }
bkc_mbed 0:2053640461b5 724 }
bkc_mbed 0:2053640461b5 725
bkc_mbed 0:2053640461b5 726 /* コマンドの処理 */
bkc_mbed 0:2053640461b5 727 switch (cmd)
bkc_mbed 0:2053640461b5 728 {
bkc_mbed 0:2053640461b5 729 case CMD_PSG:
bkc_mbed 0:2053640461b5 730 addr = ReadNLG();
bkc_mbed 0:2053640461b5 731 data = ReadNLG();
bkc_mbed 0:2053640461b5 732 WritePSG(addr, data);
bkc_mbed 0:2053640461b5 733 break;
bkc_mbed 0:2053640461b5 734 case CMD_OPM:
bkc_mbed 0:2053640461b5 735 addr = ReadNLG();
bkc_mbed 0:2053640461b5 736 data = ReadNLG();
bkc_mbed 0:2053640461b5 737 WriteOPM(addr, data);
bkc_mbed 0:2053640461b5 738 break;
bkc_mbed 0:2053640461b5 739 case CMD_OPM2:
bkc_mbed 0:2053640461b5 740 addr = ReadNLG();
bkc_mbed 0:2053640461b5 741 data = ReadNLG();
bkc_mbed 0:2053640461b5 742 WriteOPM2(addr, data);
bkc_mbed 0:2053640461b5 743 break;
bkc_mbed 0:2053640461b5 744 case CMD_IRQ:
bkc_mbed 0:2053640461b5 745 tick = GetTickNLG();
bkc_mbed 0:2053640461b5 746 np->tick_sec += tick;
bkc_mbed 0:2053640461b5 747 np->tick += tick;
bkc_mbed 0:2053640461b5 748 np->irq_count++;
bkc_mbed 0:2053640461b5 749 if (np->irq_count == np->irq_loop)
bkc_mbed 0:2053640461b5 750 {
bkc_mbed 0:2053640461b5 751 /* ループ位置の設定 */
bkc_mbed 0:2053640461b5 752 np->loop_address = TellNLG();
bkc_mbed 0:2053640461b5 753 np->loop_address -= 1;
bkc_mbed 0:2053640461b5 754 }
bkc_mbed 1:ec416e6d5739 755 np->irq_counter++;
bkc_mbed 1:ec416e6d5739 756 if (np->irq_counter >= 48)
bkc_mbed 1:ec416e6d5739 757 {
bkc_mbed 1:ec416e6d5739 758 np->irq_counter = 0;
bkc_mbed 1:ec416e6d5739 759 led1 = !led1;
bkc_mbed 1:ec416e6d5739 760
bkc_mbed 1:ec416e6d5739 761 np->irq_counter2++;
bkc_mbed 1:ec416e6d5739 762 if (np->irq_counter2 >= 4)
bkc_mbed 1:ec416e6d5739 763 {
bkc_mbed 1:ec416e6d5739 764 np->irq_counter2 = 0;
bkc_mbed 1:ec416e6d5739 765 led2 = !led2;
bkc_mbed 1:ec416e6d5739 766 }
bkc_mbed 1:ec416e6d5739 767 }
bkc_mbed 0:2053640461b5 768 break;
bkc_mbed 0:2053640461b5 769 case CMD_CTC0:
bkc_mbed 0:2053640461b5 770 SetCTC0_NLG(ReadNLG());
bkc_mbed 0:2053640461b5 771 break;
bkc_mbed 0:2053640461b5 772 case CMD_CTC3:
bkc_mbed 0:2053640461b5 773 SetCTC3_NLG(ReadNLG());
bkc_mbed 0:2053640461b5 774 break;
bkc_mbed 0:2053640461b5 775
bkc_mbed 0:2053640461b5 776 }
bkc_mbed 0:2053640461b5 777 /* 秒情報の表示 */
bkc_mbed 0:2053640461b5 778 while (np->tick_sec >= np->base_clk)
bkc_mbed 0:2053640461b5 779 {
bkc_mbed 0:2053640461b5 780 np->tick_sec -= np->base_clk;
bkc_mbed 0:2053640461b5 781 np->total_sec++;
bkc_mbed 0:2053640461b5 782
bkc_mbed 0:2053640461b5 783 DispNLG(np);
bkc_mbed 0:2053640461b5 784 }
bkc_mbed 0:2053640461b5 785 }
bkc_mbed 0:2053640461b5 786
bkc_mbed 0:2053640461b5 787 return result;
bkc_mbed 0:2053640461b5 788 }
bkc_mbed 0:2053640461b5 789
bkc_mbed 0:2053640461b5 790 NLG_R n;
bkc_mbed 0:2053640461b5 791
bkc_mbed 2:f0b7779b03c7 792 int nlg_play(const char *nlg_file)
bkc_mbed 0:2053640461b5 793 {
bkc_mbed 1:ec416e6d5739 794 printf("nlg_play:%s\n",nlg_file);
bkc_mbed 0:2053640461b5 795
bkc_mbed 0:2053640461b5 796 /* NLGの初期化 */
bkc_mbed 0:2053640461b5 797 if (initNLG(&n, nlg_file) < 0)
bkc_mbed 0:2053640461b5 798 {
bkc_mbed 7:7e183b33c3f9 799 lcd_printStrY(1, " ERROR!!");
bkc_mbed 0:2053640461b5 800 printf("Failed to init.\n");
bkc_mbed 0:2053640461b5 801 return -1;
bkc_mbed 0:2053640461b5 802 }
bkc_mbed 2:f0b7779b03c7 803
bkc_mbed 2:f0b7779b03c7 804 printf("Play..\n");
bkc_mbed 1:ec416e6d5739 805
bkc_mbed 0:2053640461b5 806 /* 再生する */
bkc_mbed 0:2053640461b5 807 PlayNLG(&n, 360);
bkc_mbed 0:2053640461b5 808
bkc_mbed 6:e48296dca6bb 809 /* mute */
bkc_mbed 0:2053640461b5 810 boardMute();
bkc_mbed 0:2053640461b5 811
bkc_mbed 0:2053640461b5 812 /* NLGファイルを閉じる */
bkc_mbed 0:2053640461b5 813 CloseNLG();
bkc_mbed 0:2053640461b5 814
bkc_mbed 0:2053640461b5 815 return 0;
bkc_mbed 0:2053640461b5 816 }
bkc_mbed 0:2053640461b5 817
bkc_mbed 6:e48296dca6bb 818 int get_nlg_file(char *dest, int index)
bkc_mbed 0:2053640461b5 819 {
bkc_mbed 0:2053640461b5 820 char *cwd = "/sd/";
bkc_mbed 0:2053640461b5 821 int count = -1;
bkc_mbed 0:2053640461b5 822 DIR *dir = opendir(cwd);
bkc_mbed 0:2053640461b5 823
bkc_mbed 0:2053640461b5 824 dest[0] = 0;
bkc_mbed 0:2053640461b5 825
bkc_mbed 0:2053640461b5 826 if (dir == NULL)
bkc_mbed 0:2053640461b5 827 {
bkc_mbed 6:e48296dca6bb 828 lcd_printStr2("SD CARD", "ERROR!");
bkc_mbed 0:2053640461b5 829 return -1;
bkc_mbed 0:2053640461b5 830 }
bkc_mbed 0:2053640461b5 831 struct dirent *dent;
bkc_mbed 0:2053640461b5 832
bkc_mbed 0:2053640461b5 833 while(1)
bkc_mbed 0:2053640461b5 834 {
bkc_mbed 0:2053640461b5 835 dent = readdir(dir);
bkc_mbed 0:2053640461b5 836 if (!dent)
bkc_mbed 0:2053640461b5 837 break;
bkc_mbed 0:2053640461b5 838
bkc_mbed 0:2053640461b5 839 // resource or hidden file
bkc_mbed 0:2053640461b5 840 if (dent->d_name[0] == '.')
bkc_mbed 0:2053640461b5 841 continue;
bkc_mbed 0:2053640461b5 842
bkc_mbed 0:2053640461b5 843 char *ext = strrchr(dent->d_name, '.');
bkc_mbed 0:2053640461b5 844 if (!ext)
bkc_mbed 0:2053640461b5 845 continue;
bkc_mbed 0:2053640461b5 846
bkc_mbed 0:2053640461b5 847 if (strcasecmp(ext, ".nlg") != 0)
bkc_mbed 0:2053640461b5 848 continue;
bkc_mbed 0:2053640461b5 849
bkc_mbed 0:2053640461b5 850 if (count < 0)
bkc_mbed 0:2053640461b5 851 count = 0;
bkc_mbed 0:2053640461b5 852
bkc_mbed 0:2053640461b5 853 count++;
bkc_mbed 0:2053640461b5 854
bkc_mbed 0:2053640461b5 855 if (index < 0)
bkc_mbed 0:2053640461b5 856 continue;
bkc_mbed 0:2053640461b5 857
bkc_mbed 0:2053640461b5 858 if (count <= index)
bkc_mbed 0:2053640461b5 859 continue;
bkc_mbed 0:2053640461b5 860
bkc_mbed 0:2053640461b5 861 strcpy(dest, dent->d_name);
bkc_mbed 0:2053640461b5 862 break;
bkc_mbed 0:2053640461b5 863 }
bkc_mbed 0:2053640461b5 864 closedir(dir);
bkc_mbed 0:2053640461b5 865 return count;
bkc_mbed 0:2053640461b5 866 }
bkc_mbed 0:2053640461b5 867
bkc_mbed 6:e48296dca6bb 868
bkc_mbed 6:e48296dca6bb 869 //
bkc_mbed 6:e48296dca6bb 870 // title
bkc_mbed 6:e48296dca6bb 871 //
bkc_mbed 6:e48296dca6bb 872 void putTitle()
bkc_mbed 6:e48296dca6bb 873 {
bkc_mbed 7:7e183b33c3f9 874 lcd_printStr2("NBCTRL", "Ver 1.11");
bkc_mbed 7:7e183b33c3f9 875 wait(1.5);
bkc_mbed 6:e48296dca6bb 876 }
bkc_mbed 6:e48296dca6bb 877
bkc_mbed 6:e48296dca6bb 878 //
bkc_mbed 6:e48296dca6bb 879 // main
bkc_mbed 6:e48296dca6bb 880 //
bkc_mbed 0:2053640461b5 881 int main()
bkc_mbed 0:2053640461b5 882 {
bkc_mbed 0:2053640461b5 883 char file[32];
bkc_mbed 3:aed228fa3ae4 884 char path[48];
bkc_mbed 0:2053640461b5 885
bkc_mbed 0:2053640461b5 886 led1 = 0;
bkc_mbed 1:ec416e6d5739 887 led2 = 0;
bkc_mbed 1:ec416e6d5739 888
bkc_mbed 8:88c89fd324bd 889 ioInit();
bkc_mbed 8:88c89fd324bd 890
bkc_mbed 6:e48296dca6bb 891 wait_ms(20);
bkc_mbed 6:e48296dca6bb 892
bkc_mbed 6:e48296dca6bb 893 // reset SHIFT REGISTER
bkc_mbed 7:7e183b33c3f9 894 ioShiftOut((0xFF << 8) | (ACTLOW));
bkc_mbed 4:4dc67a366727 895
bkc_mbed 0:2053640461b5 896 lcd_init();
bkc_mbed 6:e48296dca6bb 897
bkc_mbed 6:e48296dca6bb 898 putTitle();
bkc_mbed 5:27f193e21222 899
bkc_mbed 0:2053640461b5 900 boardInit();
bkc_mbed 0:2053640461b5 901
bkc_mbed 0:2053640461b5 902 int files = 0;
bkc_mbed 0:2053640461b5 903 int disp_mode = 0;
bkc_mbed 0:2053640461b5 904
bkc_mbed 0:2053640461b5 905 if (!sw_next)
bkc_mbed 0:2053640461b5 906 disp_mode = 1;
bkc_mbed 0:2053640461b5 907
bkc_mbed 0:2053640461b5 908 files = get_nlg_file(file, -1);
bkc_mbed 0:2053640461b5 909
bkc_mbed 0:2053640461b5 910 if (disp_mode)
bkc_mbed 3:aed228fa3ae4 911 {
bkc_mbed 0:2053640461b5 912 char buf[16];
bkc_mbed 3:aed228fa3ae4 913 Timer t;
bkc_mbed 3:aed228fa3ae4 914 int result_us = 0;
bkc_mbed 4:4dc67a366727 915 t.reset();
bkc_mbed 3:aed228fa3ae4 916 t.start();
bkc_mbed 3:aed228fa3ae4 917
bkc_mbed 7:7e183b33c3f9 918 // actual timing
bkc_mbed 7:7e183b33c3f9 919 regFMOut(0x20, 0x00);
bkc_mbed 3:aed228fa3ae4 920
bkc_mbed 3:aed228fa3ae4 921 result_us = t.read_us();
bkc_mbed 3:aed228fa3ae4 922 t.stop();
bkc_mbed 4:4dc67a366727 923
bkc_mbed 6:e48296dca6bb 924 printf("result_us=%dus\n", result_us);
bkc_mbed 8:88c89fd324bd 925 sprintf(buf, "R:%dus", result_us);
bkc_mbed 8:88c89fd324bd 926 lcd_printStrY(1, buf);
bkc_mbed 8:88c89fd324bd 927 wait(3);
bkc_mbed 8:88c89fd324bd 928
bkc_mbed 1:ec416e6d5739 929 sprintf(buf, "%8s", __DATE__);
bkc_mbed 1:ec416e6d5739 930 lcd_printStrYscr(1, buf);
bkc_mbed 1:ec416e6d5739 931 wait(3);
bkc_mbed 3:aed228fa3ae4 932
bkc_mbed 0:2053640461b5 933 if (files < 0)
bkc_mbed 1:ec416e6d5739 934 lcd_printStrY(1, "NO FILES");
bkc_mbed 0:2053640461b5 935 else
bkc_mbed 0:2053640461b5 936 {
bkc_mbed 0:2053640461b5 937 char buf[16];
bkc_mbed 1:ec416e6d5739 938 sprintf(buf, "%3dfiles", files);
bkc_mbed 1:ec416e6d5739 939 lcd_printStrY(1, buf);
bkc_mbed 0:2053640461b5 940 }
bkc_mbed 0:2053640461b5 941 wait(3);
bkc_mbed 0:2053640461b5 942 lcd_cls();
bkc_mbed 0:2053640461b5 943 }
bkc_mbed 1:ec416e6d5739 944
bkc_mbed 7:7e183b33c3f9 945 bool repeat_flag = false;
bkc_mbed 0:2053640461b5 946 int idx = 0;
bkc_mbed 0:2053640461b5 947 while(files > 0)
bkc_mbed 0:2053640461b5 948 {
bkc_mbed 2:f0b7779b03c7 949 char buf[16];
bkc_mbed 2:f0b7779b03c7 950
bkc_mbed 0:2053640461b5 951 get_nlg_file(file, idx);
bkc_mbed 0:2053640461b5 952
bkc_mbed 0:2053640461b5 953 sprintf(path, "/sd/%s", file);
bkc_mbed 0:2053640461b5 954 printf("path=%s\n",path);
bkc_mbed 0:2053640461b5 955
bkc_mbed 2:f0b7779b03c7 956 lcd_cls();
bkc_mbed 1:ec416e6d5739 957 lcd_printStrY(0, file);
bkc_mbed 0:2053640461b5 958
bkc_mbed 3:aed228fa3ae4 959 sprintf(buf, "%2d ", idx + 1);
bkc_mbed 2:f0b7779b03c7 960 lcd_printStrY(1, buf);
bkc_mbed 2:f0b7779b03c7 961
bkc_mbed 2:f0b7779b03c7 962 nlg_play(path);
bkc_mbed 0:2053640461b5 963
bkc_mbed 2:f0b7779b03c7 964 // wait for chattering
bkc_mbed 1:ec416e6d5739 965 wait(0.25);
bkc_mbed 6:e48296dca6bb 966
bkc_mbed 6:e48296dca6bb 967 // wait release
bkc_mbed 6:e48296dca6bb 968 waitButtonRelease();
bkc_mbed 6:e48296dca6bb 969
bkc_mbed 6:e48296dca6bb 970 // if play button is pressed
bkc_mbed 0:2053640461b5 971 if (g_stop)
bkc_mbed 0:2053640461b5 972 {
bkc_mbed 6:e48296dca6bb 973 g_stop = false;
bkc_mbed 6:e48296dca6bb 974 g_prev = false;
bkc_mbed 6:e48296dca6bb 975
bkc_mbed 2:f0b7779b03c7 976 lcd_printStrY(1, " STOP ");
bkc_mbed 1:ec416e6d5739 977
bkc_mbed 6:e48296dca6bb 978 // wait any button is pressed
bkc_mbed 6:e48296dca6bb 979 waitButtonPress();
bkc_mbed 1:ec416e6d5739 980
bkc_mbed 7:7e183b33c3f9 981 //
bkc_mbed 7:7e183b33c3f9 982 if (!sw_prev) {
bkc_mbed 2:f0b7779b03c7 983 lcd_printStrY(1, " PREV ");
bkc_mbed 6:e48296dca6bb 984 g_prev = true;
bkc_mbed 2:f0b7779b03c7 985 }
bkc_mbed 7:7e183b33c3f9 986 if (!sw_play)
bkc_mbed 7:7e183b33c3f9 987 {
bkc_mbed 7:7e183b33c3f9 988 lcd_printStrY(1, " PLAY ");
bkc_mbed 7:7e183b33c3f9 989 repeat_flag = true;
bkc_mbed 7:7e183b33c3f9 990 }
bkc_mbed 7:7e183b33c3f9 991 if (!sw_next)
bkc_mbed 2:f0b7779b03c7 992 {
bkc_mbed 2:f0b7779b03c7 993 lcd_printStrY(1, " NEXT ");
bkc_mbed 7:7e183b33c3f9 994 repeat_flag = false;
bkc_mbed 2:f0b7779b03c7 995 }
bkc_mbed 1:ec416e6d5739 996
bkc_mbed 1:ec416e6d5739 997 // wait release
bkc_mbed 6:e48296dca6bb 998 waitButtonRelease();
bkc_mbed 1:ec416e6d5739 999
bkc_mbed 1:ec416e6d5739 1000 // reset board
bkc_mbed 1:ec416e6d5739 1001 boardInit();
bkc_mbed 0:2053640461b5 1002 }
bkc_mbed 6:e48296dca6bb 1003
bkc_mbed 6:e48296dca6bb 1004 // play prev or next song
bkc_mbed 6:e48296dca6bb 1005 if (g_prev)
bkc_mbed 1:ec416e6d5739 1006 {
bkc_mbed 6:e48296dca6bb 1007 g_prev = false;
bkc_mbed 6:e48296dca6bb 1008
bkc_mbed 1:ec416e6d5739 1009 if (idx - 1 >= 0)
bkc_mbed 1:ec416e6d5739 1010 idx--;
bkc_mbed 1:ec416e6d5739 1011 else
bkc_mbed 1:ec416e6d5739 1012 idx = files - 1;
bkc_mbed 7:7e183b33c3f9 1013
bkc_mbed 7:7e183b33c3f9 1014 continue;
bkc_mbed 1:ec416e6d5739 1015 }
bkc_mbed 7:7e183b33c3f9 1016
bkc_mbed 7:7e183b33c3f9 1017 if (!repeat_flag)
bkc_mbed 1:ec416e6d5739 1018 {
bkc_mbed 1:ec416e6d5739 1019 if (idx + 1 < files)
bkc_mbed 1:ec416e6d5739 1020 idx++;
bkc_mbed 1:ec416e6d5739 1021 else
bkc_mbed 1:ec416e6d5739 1022 idx = 0;
bkc_mbed 1:ec416e6d5739 1023 }
bkc_mbed 7:7e183b33c3f9 1024 repeat_flag = false;
bkc_mbed 0:2053640461b5 1025 }
bkc_mbed 0:2053640461b5 1026 }