SPC music playback tools for real snes apu

Dependencies:   mbed

Committer:
akkera102
Date:
Wed Jan 11 16:00:29 2017 +0000
Revision:
2:62e6e22f8be2
second

Who changed what in which revision?

UserRevisionLine numberNew contents of line
akkera102 2:62e6e22f8be2 1 #include "cmd.h"
akkera102 2:62e6e22f8be2 2 #include "mbed.h"
akkera102 2:62e6e22f8be2 3 #include "apu.h"
akkera102 2:62e6e22f8be2 4 #include "apu2.h"
akkera102 2:62e6e22f8be2 5
akkera102 2:62e6e22f8be2 6 // option
akkera102 2:62e6e22f8be2 7 int g_loop = 0; // Loop
akkera102 2:62e6e22f8be2 8 int g_verbose = 0; // Verbose
akkera102 2:62e6e22f8be2 9 int g_debug = 0; // Debug mode
akkera102 2:62e6e22f8be2 10
akkera102 2:62e6e22f8be2 11 static int cmd_read_id666(FILE *fp, id666_tag *tag);
akkera102 2:62e6e22f8be2 12 static void cmd_print_time(int seconds);
akkera102 2:62e6e22f8be2 13
akkera102 2:62e6e22f8be2 14 void cmd(char *filename)
akkera102 2:62e6e22f8be2 15 {
akkera102 2:62e6e22f8be2 16 FILE *fp = fopen(filename, "rb");
akkera102 2:62e6e22f8be2 17 if(fp == NULL)
akkera102 2:62e6e22f8be2 18 {
akkera102 2:62e6e22f8be2 19 perror("fopen\n");
akkera102 2:62e6e22f8be2 20 return;
akkera102 2:62e6e22f8be2 21 }
akkera102 2:62e6e22f8be2 22
akkera102 2:62e6e22f8be2 23 id666_tag tag;
akkera102 2:62e6e22f8be2 24 if(cmd_read_id666(fp, &tag))
akkera102 2:62e6e22f8be2 25 {
akkera102 2:62e6e22f8be2 26 perror("id666_tag\n");
akkera102 2:62e6e22f8be2 27 return;
akkera102 2:62e6e22f8be2 28 }
akkera102 2:62e6e22f8be2 29
akkera102 2:62e6e22f8be2 30 printf("\nNow loading '%s' using 'embedded' algo\n", filename);
akkera102 2:62e6e22f8be2 31 if(LoadAPU_embedded(fp) < 0)
akkera102 2:62e6e22f8be2 32 {
akkera102 2:62e6e22f8be2 33 return;
akkera102 2:62e6e22f8be2 34 }
akkera102 2:62e6e22f8be2 35
akkera102 2:62e6e22f8be2 36 BOLD();
akkera102 2:62e6e22f8be2 37 printf("Title: ");
akkera102 2:62e6e22f8be2 38 NORMAL();
akkera102 2:62e6e22f8be2 39 printf("%s\n", tag.title);
akkera102 2:62e6e22f8be2 40
akkera102 2:62e6e22f8be2 41 BOLD();
akkera102 2:62e6e22f8be2 42 printf("Game Title: ");
akkera102 2:62e6e22f8be2 43 NORMAL();
akkera102 2:62e6e22f8be2 44 printf("%s\n", tag.game_title);
akkera102 2:62e6e22f8be2 45
akkera102 2:62e6e22f8be2 46 BOLD();
akkera102 2:62e6e22f8be2 47 printf("Dumper: ");
akkera102 2:62e6e22f8be2 48 NORMAL();
akkera102 2:62e6e22f8be2 49 printf("%s\n", tag.name_of_dumper);
akkera102 2:62e6e22f8be2 50
akkera102 2:62e6e22f8be2 51 BOLD();
akkera102 2:62e6e22f8be2 52 printf("Comments: ");
akkera102 2:62e6e22f8be2 53 NORMAL();
akkera102 2:62e6e22f8be2 54 printf("%s\n", tag.comments);
akkera102 2:62e6e22f8be2 55
akkera102 2:62e6e22f8be2 56 BOLD();
akkera102 2:62e6e22f8be2 57 printf("Seconds: ");
akkera102 2:62e6e22f8be2 58 NORMAL();
akkera102 2:62e6e22f8be2 59 printf("%s\n", tag.seconds_til_fadeout);
akkera102 2:62e6e22f8be2 60
akkera102 2:62e6e22f8be2 61 fclose(fp);
akkera102 2:62e6e22f8be2 62
akkera102 2:62e6e22f8be2 63
akkera102 2:62e6e22f8be2 64 int num_sec = atoi(tag.seconds_til_fadeout);
akkera102 2:62e6e22f8be2 65 int last_elaps_sec = -1;
akkera102 2:62e6e22f8be2 66
akkera102 2:62e6e22f8be2 67 if(num_sec < 1 || num_sec > 999)
akkera102 2:62e6e22f8be2 68 {
akkera102 2:62e6e22f8be2 69 num_sec = 150;
akkera102 2:62e6e22f8be2 70 }
akkera102 2:62e6e22f8be2 71 if(strlen(tag.title) == 0)
akkera102 2:62e6e22f8be2 72 {
akkera102 2:62e6e22f8be2 73 strncpy(tag.title, filename, 32);
akkera102 2:62e6e22f8be2 74 }
akkera102 2:62e6e22f8be2 75
akkera102 2:62e6e22f8be2 76
akkera102 2:62e6e22f8be2 77 Timer t;
akkera102 2:62e6e22f8be2 78 t.start();
akkera102 2:62e6e22f8be2 79
akkera102 2:62e6e22f8be2 80 for(;;)
akkera102 2:62e6e22f8be2 81 {
akkera102 2:62e6e22f8be2 82 int elaps_sec = t.read();
akkera102 2:62e6e22f8be2 83
akkera102 2:62e6e22f8be2 84 if((!g_loop) && (elaps_sec > num_sec))
akkera102 2:62e6e22f8be2 85 {
akkera102 2:62e6e22f8be2 86 break;
akkera102 2:62e6e22f8be2 87 }
akkera102 2:62e6e22f8be2 88
akkera102 2:62e6e22f8be2 89 if(last_elaps_sec != elaps_sec)
akkera102 2:62e6e22f8be2 90 {
akkera102 2:62e6e22f8be2 91 if(!g_loop)
akkera102 2:62e6e22f8be2 92 {
akkera102 2:62e6e22f8be2 93 BOLD();
akkera102 2:62e6e22f8be2 94 printf("Time: ");
akkera102 2:62e6e22f8be2 95
akkera102 2:62e6e22f8be2 96 NORMAL();
akkera102 2:62e6e22f8be2 97 cmd_print_time(elaps_sec);
akkera102 2:62e6e22f8be2 98 printf(" [");
akkera102 2:62e6e22f8be2 99 cmd_print_time(num_sec - elaps_sec);
akkera102 2:62e6e22f8be2 100 printf("] of ");
akkera102 2:62e6e22f8be2 101 cmd_print_time(num_sec);
akkera102 2:62e6e22f8be2 102 printf(" \r");
akkera102 2:62e6e22f8be2 103 }
akkera102 2:62e6e22f8be2 104 else
akkera102 2:62e6e22f8be2 105 {
akkera102 2:62e6e22f8be2 106 BOLD();
akkera102 2:62e6e22f8be2 107 printf("Time: ");
akkera102 2:62e6e22f8be2 108
akkera102 2:62e6e22f8be2 109 NORMAL();
akkera102 2:62e6e22f8be2 110 cmd_print_time(elaps_sec);
akkera102 2:62e6e22f8be2 111 printf(" \r");
akkera102 2:62e6e22f8be2 112 }
akkera102 2:62e6e22f8be2 113 }
akkera102 2:62e6e22f8be2 114 last_elaps_sec = elaps_sec;
akkera102 2:62e6e22f8be2 115 fflush(stdout);
akkera102 2:62e6e22f8be2 116
akkera102 2:62e6e22f8be2 117 wait_ms(75);
akkera102 2:62e6e22f8be2 118 }
akkera102 2:62e6e22f8be2 119
akkera102 2:62e6e22f8be2 120 printf("\nFinished playing.\n");
akkera102 2:62e6e22f8be2 121 apu_reset();
akkera102 2:62e6e22f8be2 122 }
akkera102 2:62e6e22f8be2 123
akkera102 2:62e6e22f8be2 124 static int cmd_read_id666(FILE *fp, id666_tag *tag)
akkera102 2:62e6e22f8be2 125 {
akkera102 2:62e6e22f8be2 126 long orig_pos = ftell(fp);
akkera102 2:62e6e22f8be2 127 unsigned char istag=0;
akkera102 2:62e6e22f8be2 128
akkera102 2:62e6e22f8be2 129 fseek(fp, 0x23, SEEK_SET);
akkera102 2:62e6e22f8be2 130 fread(&istag, 1, 1, fp);
akkera102 2:62e6e22f8be2 131
akkera102 2:62e6e22f8be2 132 if(istag != 26)
akkera102 2:62e6e22f8be2 133 {
akkera102 2:62e6e22f8be2 134 printf("No tag\n");
akkera102 2:62e6e22f8be2 135 strcpy(tag->title, "");
akkera102 2:62e6e22f8be2 136 strcpy(tag->game_title, "");
akkera102 2:62e6e22f8be2 137 strcpy(tag->name_of_dumper, "");
akkera102 2:62e6e22f8be2 138 strcpy(tag->comments, "");
akkera102 2:62e6e22f8be2 139 strcpy(tag->seconds_til_fadeout, "150"); // 2.5 minutes
akkera102 2:62e6e22f8be2 140
akkera102 2:62e6e22f8be2 141 return 1;
akkera102 2:62e6e22f8be2 142 }
akkera102 2:62e6e22f8be2 143
akkera102 2:62e6e22f8be2 144 fseek(fp, 0x2e, SEEK_SET);
akkera102 2:62e6e22f8be2 145
akkera102 2:62e6e22f8be2 146 fread(&tag->title, 32, 1, fp);
akkera102 2:62e6e22f8be2 147 tag->title[32] = 0;
akkera102 2:62e6e22f8be2 148
akkera102 2:62e6e22f8be2 149 fread(&tag->game_title, 32, 1, fp);
akkera102 2:62e6e22f8be2 150 tag->game_title[32] = 0;
akkera102 2:62e6e22f8be2 151
akkera102 2:62e6e22f8be2 152 fread(&tag->name_of_dumper, 16, 1, fp);
akkera102 2:62e6e22f8be2 153 tag->name_of_dumper[16] = 0;
akkera102 2:62e6e22f8be2 154
akkera102 2:62e6e22f8be2 155 fread(&tag->comments, 32, 1, fp);
akkera102 2:62e6e22f8be2 156 tag->comments[32] = 0;
akkera102 2:62e6e22f8be2 157
akkera102 2:62e6e22f8be2 158 fseek(fp, 0xa9, SEEK_SET);
akkera102 2:62e6e22f8be2 159
akkera102 2:62e6e22f8be2 160 fread(&tag->seconds_til_fadeout, 3, 1, fp);
akkera102 2:62e6e22f8be2 161 tag->seconds_til_fadeout[3] = 0;
akkera102 2:62e6e22f8be2 162
akkera102 2:62e6e22f8be2 163 fseek(fp, orig_pos, SEEK_SET);
akkera102 2:62e6e22f8be2 164
akkera102 2:62e6e22f8be2 165 return 0;
akkera102 2:62e6e22f8be2 166 }
akkera102 2:62e6e22f8be2 167
akkera102 2:62e6e22f8be2 168 static void cmd_print_time(int seconds)
akkera102 2:62e6e22f8be2 169 {
akkera102 2:62e6e22f8be2 170 int hour=0, min=0, sec=0;
akkera102 2:62e6e22f8be2 171
akkera102 2:62e6e22f8be2 172 if(seconds >= 3600)
akkera102 2:62e6e22f8be2 173 {
akkera102 2:62e6e22f8be2 174 hour = seconds / 3600;
akkera102 2:62e6e22f8be2 175 seconds -= hour * 3600;;
akkera102 2:62e6e22f8be2 176 }
akkera102 2:62e6e22f8be2 177
akkera102 2:62e6e22f8be2 178 if(seconds >= 60)
akkera102 2:62e6e22f8be2 179 {
akkera102 2:62e6e22f8be2 180 min = seconds / 60;
akkera102 2:62e6e22f8be2 181 seconds -= min * 60;
akkera102 2:62e6e22f8be2 182 }
akkera102 2:62e6e22f8be2 183
akkera102 2:62e6e22f8be2 184 sec = seconds;
akkera102 2:62e6e22f8be2 185
akkera102 2:62e6e22f8be2 186 printf("%02d:%02d:%02d", hour, min, sec);
akkera102 2:62e6e22f8be2 187 }
akkera102 2:62e6e22f8be2 188
akkera102 2:62e6e22f8be2 189 void cmd_pspin_update(void)
akkera102 2:62e6e22f8be2 190 {
akkera102 2:62e6e22f8be2 191 static int pspin_step = 0;
akkera102 2:62e6e22f8be2 192
akkera102 2:62e6e22f8be2 193 switch(pspin_step)
akkera102 2:62e6e22f8be2 194 {
akkera102 2:62e6e22f8be2 195 default:
akkera102 2:62e6e22f8be2 196 case 4:
akkera102 2:62e6e22f8be2 197 pspin_step = 0;
akkera102 2:62e6e22f8be2 198 case 0:
akkera102 2:62e6e22f8be2 199 printf("|\b"); break;
akkera102 2:62e6e22f8be2 200 case 1:
akkera102 2:62e6e22f8be2 201 printf("/\b"); break;
akkera102 2:62e6e22f8be2 202 case 2:
akkera102 2:62e6e22f8be2 203 printf("-\b"); break;
akkera102 2:62e6e22f8be2 204 case 3:
akkera102 2:62e6e22f8be2 205 printf("\\\b"); break;
akkera102 2:62e6e22f8be2 206 }
akkera102 2:62e6e22f8be2 207 pspin_step++;
akkera102 2:62e6e22f8be2 208
akkera102 2:62e6e22f8be2 209 fflush(stdout);
akkera102 2:62e6e22f8be2 210 }