• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語でMIDIを鳴らしたいです。)

C言語でMIDIを鳴らす方法とは?

このQ&Aのポイント
  • C言語でMIDIを鳴らす方法を知りたいです。Microsoft Visual C++ Express EditionではMIDIが鳴らせないのでしょうか?
  • C言語で特定の音を鳴らすプログラムを作りたいです。バージョンが古いかExpress Editionでは鳴らせないエラーが出ています。
  • どのようなプログラムを作れば音を鳴らすことができるのでしょうか?ソースコードも教えて欲しいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

プログラム全体を載せようとしましたが、文字数オーバーでした。 多分、「プリコンパイル済みヘッダー」の使用を許可しているためにおかしいのだと思う。 ちなみに以下のように設定を変更したら出来た。 ●「プロジェクト」「プロパティ」「構成プロパティ」「全般」「文字セット」   (Unicode文字セットをしようする。)を(マルチバイト文字セットを使用する) ●「プロジェクト」「プロパティ」「構成プロパティ」「コンパイル済みヘッダー」「プリコンパイル済みヘッダーの作成/使用」  (プリコンパイル済みヘッダーを使用しない)に変更 ヘッダファイルの読み込みを修正 _tWinMainをWinMainに変更 以下の行の追加 #pragma comment (lib, "winmm.lib") これで、vista + Express Edition2008 で音が出せています。

django13
質問者

補足

返答ありがとうございます。 今まで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では何か大きく変わったのでしょうか?

その他の回答 (2)

回答No.3

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 にしておいたほうがいいかもしれません。

django13
質問者

お礼

2008では問題なく動くことを確認しました。 完結でわかりやすいサンプルありがとうございます。 参考にさせていただきます。

回答No.1

発生しているエラーが何なのか分からないので的確なアドバイスが出来ません。 しかし、MFC等を使わずにWindows-APIだけを使用して音を鳴らす例なら以下のURLに記載されているようです。 http://wisdom.sakura.ne.jp/system/winapi/media/mm11.html http://eternalwindows.jp/winmm/midi/midi01.html

django13
質問者

補足

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アプリケーションの制作を想定しています。

関連するQ&A