質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3246閲覧

FM音源をあやつって正しく音を出したい

katahiromz

総合スコア186

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2015/11/29 03:06

編集2015/11/30 07:21

こんにちは。

OpenAL+ALUTと、ciscさんのFM音源エミュレータ「FM Sound Generator」を使って、正しく音を出したい。

https://github.com/katahiromz/fmgengen2/blob/master/sample.cpp
https://github.com/katahiromz/fmgengen2

おかしな音が出ます。たぶんFM音源の使い方が間違っています。修正方法を教えて下さい。よろしくお願いします。

(補足)
ガーっ、ジーっというノイズ音がします。起動するたび違う音です。
ビルド・実行するためには、OpenAL32.dllとALUTのライブラリが必要です。

間違っているとすれば

YM2203.cpp
YM2203.h
YM2203_Timbre.h
YM2203_Timbre.cpp
sample.cpp

のどれかです。

YM2203*は、

http://d.hatena.ne.jp/licheng/20131207

を参考にして作りました。

sample.cppは、自力で作りました。

ドレミの音を順番に出力したいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

T.Kanno

2015/11/30 01:59

おかしな音って、どんな音でしょうか?使い方と言うのはsample.cpp の方ですか?
T.Kanno

2015/11/30 10:35

ノスタルジックな話題につい反応してしまったのですけども、問題が少し絞り込めないですかね? ハードの問題は無いのでしょうか?実績のあるハードでしょうか? あと、ソフトは実績のあるコードでしょうか?なんらかのポーティングを行ったとして、どこをどう変えたかとかの情報はないでしょうか?
guest

回答1

0

自己解決

掲示板の書き込みで解決しました。
皆様ありがとうございました。

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

投稿2015/12/01 03:04

katahiromz

総合スコア186

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問