- ベストアンサー
C言語でMIDIを鳴らす方法とは?
- C言語でMIDIを鳴らす方法を知りたいです。Microsoft Visual C++ Express EditionではMIDIが鳴らせないのでしょうか?
- C言語で特定の音を鳴らすプログラムを作りたいです。バージョンが古いかExpress Editionでは鳴らせないエラーが出ています。
- どのようなプログラムを作れば音を鳴らすことができるのでしょうか?ソースコードも教えて欲しいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
プログラム全体を載せようとしましたが、文字数オーバーでした。 多分、「プリコンパイル済みヘッダー」の使用を許可しているためにおかしいのだと思う。 ちなみに以下のように設定を変更したら出来た。 ●「プロジェクト」「プロパティ」「構成プロパティ」「全般」「文字セット」 (Unicode文字セットをしようする。)を(マルチバイト文字セットを使用する) ●「プロジェクト」「プロパティ」「構成プロパティ」「コンパイル済みヘッダー」「プリコンパイル済みヘッダーの作成/使用」 (プリコンパイル済みヘッダーを使用しない)に変更 ヘッダファイルの読み込みを修正 _tWinMainをWinMainに変更 以下の行の追加 #pragma comment (lib, "winmm.lib") これで、vista + Express Edition2008 で音が出せています。
その他の回答 (2)
- yosiyosi25
- ベストアンサー率25% (1/4)
C言語でMIDIを鳴らすということから少しずれてるかもしれませんが、いちおうC言語を使っている ということで、まあ参考までに。新規作成でwindowsフォームアプリケーションを選択。フォーム上にボタンを一つ 配置してそのボタンをダブルクリック。自動生成されたコードのなかに private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { HMIDIOUT hMidi; midiOutOpen(&hMidi,0,0,0,0); midiOutShortMsg(hMidi,0x603c90); System::Threading::Thread::Sleep(500); midiOutShortMsg(hMidi,0x003c80); midiOutClose(hMidi); } Form1.h で一番上に #include <windows.h> //#include <mmsystem.h> //これも必要なはずだけど自分の環境vc++2008express editionでは //省略できた。 #pragma comment(lib, "winmm.lib")//これは必要 いちおうプロジェクトのプロパティーを構成プロパティー>全般ー>共通言語ランタイムサポート を /clr にしておいたほうがいいかもしれません。
お礼
2008では問題なく動くことを確認しました。 完結でわかりやすいサンプルありがとうございます。 参考にさせていただきます。
- toda hiro(@hiro_knigh)
- ベストアンサー率39% (59/151)
発生しているエラーが何なのか分からないので的確なアドバイスが出来ません。 しかし、MFC等を使わずにWindows-APIだけを使用して音を鳴らす例なら以下のURLに記載されているようです。 http://wisdom.sakura.ne.jp/system/winapi/media/mm11.html http://eternalwindows.jp/winmm/midi/midi01.html
補足
http://eternalwindows.jp/winmm/midi/midi01.html のほうのサンプルをビルドしてみたのですが、 1>e:\nuages\software\midi\midi3\midi3\midi.cpp(7): error C2065: 'HMIDIOUT' : 定義されていない識別子です。 1>e:\nuages\software\midi\midi3\midi3\midi.cpp(7): error C2146: 構文エラー : ';' が、識別子 'hmo' の前に必要です。 1>e:\nuages\software\midi\midi3\midi3\midi.cpp(7): error C2065: 'hmo' : 定義されていない識別子です。 1>e:\nuages\software\midi\midi3\midi3\midi.cpp(9): error C2065: 'hmo' : 定義されていない識別子です。 1>e:\nuages\software\midi\midi3\midi3\midi.cpp(9): error C2065: 'MIDI_MAPPER' : 定義されていない識別子です。 1>e:\nuages\software\midi\midi3\midi3\midi.cpp(9): error C2065: 'CALLBACK_NULL' : 定義されていない識別子です。 1>e:\nuages\software\midi\midi3\midi3\midi.cpp(9): error C3861: 'midiOutOpen': 識別子が見つかりませんでした 1>e:\nuages\software\midi\midi3\midi3\midi.cpp(14): error C2065: 'hmo' : 定義されていない識別子です。 1>e:\nuages\software\midi\midi3\midi3\midi.cpp(14): error C3861: 'midiOutShortMsg': 識別子が見つかりませんでした 1>e:\nuages\software\midi\midi3\midi3\midi.cpp(18): error C2065: 'hmo' : 定義されていない識別子です。 1>e:\nuages\software\midi\midi3\midi3\midi.cpp(18): error C3861: 'midiOutShortMsg': 識別子が見つかりませんでした 1>e:\nuages\software\midi\midi3\midi3\midi.cpp(22): error C2065: 'hmo' : 定義されていない識別子です。 1>e:\nuages\software\midi\midi3\midi3\midi.cpp(22): error C3861: 'midiOutClose': 識別子が見つかりませんでした という結果になりました。 これをどうすれば修正できるのかよくわかりません。 ちなみにコンソールアプリケーションではなく、Windowsアプリケーションの制作を想定しています。
補足
返答ありがとうございます。 今まで2010で行っていたのですが、2008でやってみたところ、次のソースで再生ができました。 #include <windows.h> #pragma comment (lib, "winmm.lib") int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow) { HMIDIOUT hmo; if (midiOutOpen(&hmo, MIDI_MAPPER, 0, 0, CALLBACK_NULL) != MMSYSERR_NOERROR) return 0; midiOutShortMsg(hmo, 0x00703C90); // 発音 Sleep(1000); // 1秒休む midiOutShortMsg(hmo, 0x00703C80); // 消音 MessageBox(NULL, TEXT("消音しました。"), TEXT("OK"), MB_OK); midiOutClose(hmo); return 0; } 2010では以前述べたエラーが出るようです。 設定は「プリコンパイル済みヘッダーを使用しない」「Univode文字を使用する」にしてあります。 2010では何か大きく変わったのでしょうか?