109 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			109 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*============================================================
 | ||
|  | 
 | ||
|  |   Test code for emu2413.c | ||
|  | 
 | ||
|  |     Write 2 seconds of the piano tone into temp.wav | ||
|  | 
 | ||
|  |   gcc -Wall -lm sample2413.c emu2413.c | ||
|  |   (The author had tried to compile on Solaris7 with gcc 2.8.1) | ||
|  | 
 | ||
|  | =============================================================*/ | ||
|  | #include "emu2413.h"
 | ||
|  | #include <stdio.h>
 | ||
|  | #include <time.h>
 | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * Standard clock = MSX clock | ||
|  |  */ | ||
|  | #define MSX_CLK 3579545
 | ||
|  | 
 | ||
|  | #define SAMPLERATE 44100
 | ||
|  | #define DATALENGTH (SAMPLERATE * 8)
 | ||
|  | 
 | ||
|  | static void WORD(char *buf, uint32_t data) { | ||
|  | 
 | ||
|  |   buf[0] = data & 0xff; | ||
|  |   buf[1] = (data & 0xff00) >> 8; | ||
|  | } | ||
|  | 
 | ||
|  | static void DWORD(char *buf, uint32_t data) { | ||
|  | 
 | ||
|  |   buf[0] = data & 0xff; | ||
|  |   buf[1] = (data & 0xff00) >> 8; | ||
|  |   buf[2] = (data & 0xff0000) >> 16; | ||
|  |   buf[3] = (data & 0xff000000) >> 24; | ||
|  | } | ||
|  | 
 | ||
|  | static void chunkID(char *buf, char id[4]) { | ||
|  | 
 | ||
|  |   buf[0] = id[0]; | ||
|  |   buf[1] = id[1]; | ||
|  |   buf[2] = id[2]; | ||
|  |   buf[3] = id[3]; | ||
|  | } | ||
|  | 
 | ||
|  | int main(void) { | ||
|  | 
 | ||
|  |   static char wave[DATALENGTH * 2]; | ||
|  |   char filename[16] = "temp.wav"; | ||
|  |   char header[46]; | ||
|  |   int i; | ||
|  |   clock_t start, finish; | ||
|  | 
 | ||
|  |   FILE *fp; | ||
|  |   OPLL *opll; | ||
|  | 
 | ||
|  |   /*
 | ||
|  |    * Create WAVE header | ||
|  |    */ | ||
|  |   chunkID(header, "RIFF"); | ||
|  |   DWORD(header + 4, DATALENGTH * 2 + 36); | ||
|  |   chunkID(header + 8, "WAVE"); | ||
|  |   chunkID(header + 12, "fmt "); | ||
|  |   DWORD(header + 16, 16); | ||
|  |   WORD(header + 20, 1);               /* WAVE_FORMAT_PCM */ | ||
|  |   WORD(header + 22, 1);               /* channel 1=mono,2=stereo */ | ||
|  |   DWORD(header + 24, SAMPLERATE);     /* samplesPerSec */ | ||
|  |   DWORD(header + 28, 2 * SAMPLERATE); /* bytesPerSec */ | ||
|  |   WORD(header + 32, 2);               /* blockSize */ | ||
|  |   WORD(header + 34, 16);              /* bitsPerSample */ | ||
|  |   chunkID(header + 36, "data"); | ||
|  |   DWORD(header + 40, 2 * DATALENGTH); | ||
|  | 
 | ||
|  |   opll = OPLL_new(MSX_CLK, SAMPLERATE); | ||
|  |   OPLL_reset(opll); | ||
|  |   OPLL_writeReg(opll, 0x30, 0x30); /* select PIANO Voice to ch1. */ | ||
|  |   OPLL_writeReg(opll, 0x10, 0x80); /* set F-Number(L). */ | ||
|  |   OPLL_writeReg(opll, 0x20, 0x15); /* set BLK & F-Number(H) and
 | ||
|  |                                     * keyon. */ | ||
|  | 
 | ||
|  |   start = clock(); | ||
|  | 
 | ||
|  |   i = 0; | ||
|  | 
 | ||
|  |   for (i = 0; i < DATALENGTH; i++) { | ||
|  |     WORD(wave + i * 2, OPLL_calc(opll)); | ||
|  |   } | ||
|  | 
 | ||
|  |   finish = clock(); | ||
|  |   OPLL_delete(opll); | ||
|  | 
 | ||
|  |   printf("It has been %f sec to calc %d waves.\n", (double)(finish - start) / CLOCKS_PER_SEC, DATALENGTH); | ||
|  |   printf("%f times faster than real YM2413.\n", | ||
|  |          ((double)DATALENGTH / SAMPLERATE) / ((double)(finish - start) / CLOCKS_PER_SEC)); | ||
|  | 
 | ||
|  |   fp = fopen(filename, "wb"); | ||
|  | 
 | ||
|  |   if (fp == NULL) | ||
|  |     return 1; | ||
|  | 
 | ||
|  |   fwrite(header, 46, 1, fp); | ||
|  |   fwrite(wave, DATALENGTH, 2, fp); | ||
|  | 
 | ||
|  |   fclose(fp); | ||
|  | 
 | ||
|  |   printf("Wrote : %s\n", filename); | ||
|  | 
 | ||
|  |   return 0; | ||
|  | } |