掲示板の書き込みで解決しました。
皆様ありがとうございました。
http://peace.2ch.net/test/read.cgi/tech/1181782128/366
OpenALもFM Sound Generatorもよくわからんけど
いろいろいじっててやっと解決したと思ったらすでに解決してた…
問題だったのはYM2203クラスのinit()に設定したクロック値が小さすぎたのと
下記みたいにYM2203クラスのcount()の前に音声波形をmix関数で生成しなければ
ならないってことかな
1.set_pitch、note_on等のイベント
↓
2.mixで必要な時間分だけ波形生成
↓
3.countで内部タイマーを進める(2で波形生成した時間分)
↓
4.以下1~3の繰り返し
C++
1#include "headers.h"
2#include "YM2203.h"
3
4#define CLOCK 8000000
5#define SAMPLERATE 44100
6
7#define ALUT_STATIC
8#include <AL/alut.h>
9
10#if defined(_WIN32) && defined(_MSC_VER)
11 #pragma comment(lib, "OpenAL32.lib")
12 #pragma comment(lib, "alut.lib")
13#endif
14
15static const short table[5][10] = {
16 {58, 15, 0, 0, 0, 0, 0, 0, 0, 0},
17 {31, 12, 4, 10, 1, 32, 0, 12, 0, 0},
18 {31, 2, 4, 6, 15, 57, 3, 15, 1, 0},
19 {31, 12, 4, 6, 0, 30, 0, 1, 0, 0},
20 {31, 5, 7, 7, 2, 0, 2, 3, -1, 0},
21};
22
23int main(void) {
24 YM2203 ym;
25 ALuint buffers[1];
26 ALuint sources[1];
27 alutInit(NULL, NULL);
28 alGenBuffers(1, buffers);
29 alGenSources(1, sources);
30
31 YM2203_Timbre timbre(table);
32
33 int sec = 3;
34 FM_SAMPLETYPE *buf = new FM_SAMPLETYPE[sec * SAMPLERATE * 2];
35 memset(buf, 0, sizeof(FM_SAMPLETYPE) * sec * SAMPLERATE * 2);
36
37 ym.init(CLOCK, SAMPLERATE);
38 ym.set_timbre(FM_CH1, &timbre);
39 ym.set_tone_or_noise(SSG_CH_A, TONE_MODE);
40 ym.set_volume(SSG_CH_A, 15);
41 ym.set_volume(FM_CH1, 15);
42
43 ym.set_pitch(FM_CH1, 4, KEY_C);
44 ym.set_pitch(SSG_CH_A, 5, KEY_C);
45
46 ym.note_on(FM_CH1);
47 ym.note_on(SSG_CH_A);
48 ym.mix(buf, SAMPLERATE);
49 ym.count(1 * 1000 * 1000);
50 ym.note_off(FM_CH1);
51 ym.note_off(SSG_CH_A);
52
53 ym.set_pitch(FM_CH1, 4, KEY_D);
54 ym.set_pitch(SSG_CH_A, 5, KEY_D);
55
56 ym.note_on(FM_CH1);
57 ym.note_on(SSG_CH_A);
58 ym.mix(buf + SAMPLERATE * 1 * 2, SAMPLERATE);
59 ym.count(1 * 1000 * 1000);
60 ym.note_off(FM_CH1);
61 ym.note_off(SSG_CH_A);
62
63 ym.set_pitch(FM_CH1, 4, KEY_E);
64 ym.set_pitch(SSG_CH_A, 5, KEY_E);
65
66 ym.note_on(FM_CH1);
67 ym.note_on(SSG_CH_A);
68 ym.mix(buf + SAMPLERATE * 2 * 2, SAMPLERATE);
69 ym.count(1 * 1000 * 1000);
70 ym.note_off(FM_CH1);
71 ym.note_off(SSG_CH_A);
72
73 alBufferData(buffers[0], AL_FORMAT_STEREO16, buf,
74 sizeof(FM_SAMPLETYPE) * sec * SAMPLERATE * 2,
75 SAMPLERATE);
76 alSourcei(sources[0], AL_BUFFER, buffers[0]);
77 alSourcePlay(sources[0]);
78 alutSleep(4);
79
80 alDeleteSources(1, sources);
81 alDeleteBuffers(1, buffers);
82 delete[] buf;
83 alutExit();
84 return 0;
85} // main