こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語でMIDIを鳴らしたいです。

C言語でMIDIを鳴らしたいです。

現在Microsoft Visual C++ Express Edition 2010(または2008)を使ってC言語(C++ではなく)の勉強をしているのですが、
Express EditionではMIDIを鳴らすことはできないのでしょうか?
midiファイルを読み込んで再生するのではなく、Win32APIなどで特定の音を鳴らすようにしたいです。

例えば、ボタンを押したらドの音が鳴るという程度のプログラムです。

サンプルプログラムをいくつか検索してコンパイルしてみたのですが、バージョンが古いからなのか、Express Editionでは無理なのかエラーが出てしまいます。

どのようなプログラムを作れば音を鳴らすことができるのでしょうか?
できればソースを示していただけるとありがたいです。

投稿日時 - 2010-06-11 20:02:23

QNo.5961536

すぐに回答ほしいです

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

プログラム全体を載せようとしましたが、文字数オーバーでした。

多分、「プリコンパイル済みヘッダー」の使用を許可しているためにおかしいのだと思う。
ちなみに以下のように設定を変更したら出来た。

●「プロジェクト」「プロパティ」「構成プロパティ」「全般」「文字セット」
  (Unicode文字セットをしようする。)を(マルチバイト文字セットを使用する)

●「プロジェクト」「プロパティ」「構成プロパティ」「コンパイル済みヘッダー」「プリコンパイル済みヘッダーの作成/使用」
 (プリコンパイル済みヘッダーを使用しない)に変更

ヘッダファイルの読み込みを修正

_tWinMainをWinMainに変更

以下の行の追加
#pragma comment (lib, "winmm.lib")

これで、vista + Express Edition2008 で音が出せています。

投稿日時 - 2010-06-13 00:03:35

補足

返答ありがとうございます。

今まで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では何か大きく変わったのでしょうか?

投稿日時 - 2010-06-13 09:39:56

このQ&Aは役に立ちましたか?

15人が「このQ&Aが役に立った」と投票しています

回答(3)

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

投稿日時 - 2010-06-15 12:03:44

お礼

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

投稿日時 - 2010-06-16 21:58:02

ANo.1

発生しているエラーが何なのか分からないので的確なアドバイスが出来ません。

しかし、MFC等を使わずにWindows-APIだけを使用して音を鳴らす例なら以下のURLに記載されているようです。

http://wisdom.sakura.ne.jp/system/winapi/media/mm11.html
http://eternalwindows.jp/winmm/midi/midi01.html

投稿日時 - 2010-06-12 09:09:22

補足

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-06-12 22:21:02