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

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

ただいまの
回答率

90.76%

  • C++

    3245questions

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

  • Windows 10

    848questions

    Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C言語で複数の音を同時に鳴らす。

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 413

tkazuse

score 1

 前提・実現したいこと

C言語を用いて、Beep関数を使用し、周波数と再生時間を指定して実装していましたが、同時に鳴らす場合はどの様にすればよいのだろうかと思い、質問させていただきました。

 該当のソースコード

#include "stdio.h"
#include "Windows.h"
#include "tchar.h"


#define ____FA 21.826764464562746//ファ
#define ____FAS 23.12465141947715//ファ#
#define ____SO  24.499714748859326//ソ
#define ____SOS 25.956543598746574//ソ#
#define ____RA 27.5//ラ
#define ____RAS 29.13523509488062//ラ#
#define ____SI 30.86770632850775//シ
#define ___DO 32.70319566257483//ド
#define ___DOS 34.64782887210901//ド#
#define ___RE 36.70809598967594//レ
#define ___RES 38.890872965260115//レ#
#define ___MI 41.20344461410875//ミ
#define ___FA 43.653528929125486//ファ
#define ___FAS 46.2493028389543//ファ#
#define ___SO 48.999429497718666//ソ
#define ___SOS 51.91308719749314//ソ#
#define ___RA 55//ラ
#define ___RAS 58.27047018976124//ラ#
#define ___SI 61.7354126570155//シ
#define __DO 65.4063913251//ド
#define __DOS 69.2956577442//ド#
#define __RE 73.4161919793//レ
#define __RES 77.78174459305//レ#
#define __MI 82.4068892282//ミ
#define __FA 87.3070578582//ファ
#define __FAS 92.4986056779//ファ#
#define __SO 97.9988589954//ソ
#define __SOS 03.82617439498628//ソ#s
#define __RA 110//ラ
#define __RAS 116.54094037952248//ラ#
#define __SI 123.47082531403103//シ
#define _DO 130.8127826502993//ド
#define _DOS 138.59131548843604//ド#
#define _RE 146.8323839587038//レ
#define _RES 155.56349186104046//レ#
#define _MI 164.81377845643496//ミ
#define _FA 174.61411571650194//ファ
#define _FAS 184.9972113558172//ファ#
#define _SO 195.99771799087463//ソ
#define _SOS 207.65234878997256//ソ#
#define _RA 220//ラ
#define _RAS 233.08188075904496//ラ#
#define _SI 246.94165062806206//シ
#define DO 261.6255653005986//ド
#define DOS 277.182630976//ド#
#define RE 293.664767917//レ
#define RES 311.126983722//レ#
#define MI 329.627556912//ミ
#define FA 349.228231433//ファ
#define FAS 369.994422711//ファ#
#define SO 391.995435981//ソ
#define SOS 415.304697579
#define RA 440//ラ
#define RAS 466.163761518//ラ#
#define SI 493.883301256//シ
#define DO_ 523.251130601//ド
#define RE_ 587//レ
#define MI_ 659//ミ
#define FA_ 698//ファ
#define SO_ 783//ソ
#define RA_ 880//ラ
#define SI_ 987//シ
#define DO__ 1046//ド
#define RE__ 1174//レ
#define MI__ 1318//ミ
#define FA__ 1396//ファ
#define SO__ 1567//ソ
#define RA__ 1760//ラ
#define SI__ 1975//シ
#define DO___ 2093//ド
#define RE___ 2349//レ
#define MI___ 2637//ミ
#define FA___ 2793//ファ
#define SO___ 3135//ソ
#define RA___ 3520//ラ
#define SI___ 3951//シ
#define DO____ 4186//ド
int main(void) {

    Beep(DO, 200);
    Beep(RE, 200);
    Beep(MI, 200);
    Beep(FA, 200);
    Beep(SO, 200);
    Beep(RA, 200);
    Beep(SI, 200);
    Beep(DO_, 200);
    Beep(DO, 200), Beep(RE, 200);

    return (0);
}

 試したこと

同時なので、カンマでやってみたが一つずつ処理された。

 補足情報(FW/ツールのバージョンなど)

Windows10 Home,Visual Studio 2017(コンソールアプリケーション)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+4

Beep関数は「単音を鳴らす」ことしかできないので、複数音同時に鳴らしたいのなら別のAPIを利用する必要があります。

幸い、WindowsはMIDIデバイスを標準でサポートしていて、それ用のAPIも用意されているので、(Beepに比べれば多少面倒くさいですが)比較的簡単に和音の演奏ができます。

MIDIで音を鳴らす最低限のサンプル

#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")

HMIDIOUT ghMidiOut;

void noteOn(unsigned iNote, unsigned iVelocity)
{
    unsigned packdata = 0x90 | (iNote << 8) | (iVelocity << 16);
    midiOutShortMsg(ghMidiOut, packdata);
}

void noteOff(unsigned iNote)
{
    unsigned packdata = 0x80 | (iNote << 8);
    midiOutShortMsg(ghMidiOut, packdata);
}

int main()
{
    MMRESULT mmres = midiOutOpen(&ghMidiOut, MIDI_MAPPER, NULL, NULL, CALLBACK_NULL);
    if(mmres != MMSYSERR_NOERROR)
    {
        fprintf(stderr, "MIDIが利用できません。\n");
        return 1;
    }

    // ドミソ同時押し
    noteOn(60, 127);
    noteOn(64, 127);
    noteOn(67, 127);
    Sleep(1000);
    noteOff(60);
    noteOff(62);
    noteOff(67);

    midiOutClose(ghMidiOut);
    return 0;
}


音階は「MIDI ノート番号」で検索すればいろいろ出てきますので、その値を#defineなどで定義すると良いでしょう。

上記サンプルは文字通り音を鳴らす最低限のことしかやっていないので、MIDIの知識を深めてAPIの使い方を理解すれば、より高度な演奏ができるようになるでしょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/26 18:19

    回答有り難うございます。試してみます。

    キャンセル

+1

リファレンスを見ると、

音が鳴り終わるまでは、呼び出し側へ制御を返しません。

とありますので、同時に音を鳴らすには不向きな関数のようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

同時には鳴らせないので、和音にするならそれぞれを短い間隔で交互に繰り返すってことになると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

ちなみに、C言語の標準関数には、音を鳴らす関数と言うのは用意されていません
beep関数というのはWindows上で動かす前提のVisualStudioで提供されているライブラリ関数ですね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/25 15:48

    カーネルなので、VisualStudio前提では無いですね

    キャンセル

  • 2018/04/25 23:56

    残念ながら、C言語のリンカはカーネルを直接リンクするようなことにはなっていません。
    あくまで、カーネルの同名の関数を呼ぶライブラリ関数を呼ぶようになっとります。

    キャンセル

  • 2018/04/26 00:41

    VisualStudioの環境で無いと音を鳴らす事は出来ないと言う内容に見えるので、コメントしました。
    因みに評価はしていませんので。

    キャンセル

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C++

    3245questions

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

  • Windows 10

    848questions

    Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。