nlgplay for mbed

Dependencies:   SDFileSystemEx mbed

Committer:
bkc_mbed
Date:
Mon Aug 18 22:32:46 2014 +0000
Revision:
7:7e183b33c3f9
Parent:
6:e48296dca6bb
Child:
8:88c89fd324bd
NBV3 support

Who changed what in which revision?

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