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

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

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

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

C++

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

Q&A

解決済

4回答

11856閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Windows 10

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

C++

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

0グッド

0クリップ

投稿2018/04/25 03:52

前提・実現したいこと

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

該当のソースコード

C

1#include "stdio.h" 2#include "Windows.h" 3#include "tchar.h" 4 5 6#define ____FA 21.826764464562746//ファ 7#define ____FAS 23.12465141947715//ファ# 8#define ____SO 24.499714748859326//ソ 9#define ____SOS 25.956543598746574//ソ# 10#define ____RA 27.5//ラ 11#define ____RAS 29.13523509488062//ラ# 12#define ____SI 30.86770632850775//シ 13#define ___DO 32.70319566257483//ド 14#define ___DOS 34.64782887210901//ド# 15#define ___RE 36.70809598967594//レ 16#define ___RES 38.890872965260115//レ# 17#define ___MI 41.20344461410875//ミ 18#define ___FA 43.653528929125486//ファ 19#define ___FAS 46.2493028389543//ファ# 20#define ___SO 48.999429497718666//ソ 21#define ___SOS 51.91308719749314//ソ# 22#define ___RA 55//ラ 23#define ___RAS 58.27047018976124//ラ# 24#define ___SI 61.7354126570155//シ 25#define __DO 65.4063913251//ド 26#define __DOS 69.2956577442//ド# 27#define __RE 73.4161919793//レ 28#define __RES 77.78174459305//レ# 29#define __MI 82.4068892282//ミ 30#define __FA 87.3070578582//ファ 31#define __FAS 92.4986056779//ファ# 32#define __SO 97.9988589954//ソ 33#define __SOS 03.82617439498628//ソ#s 34#define __RA 110//ラ 35#define __RAS 116.54094037952248//ラ# 36#define __SI 123.47082531403103//シ 37#define _DO 130.8127826502993//ド 38#define _DOS 138.59131548843604//ド# 39#define _RE 146.8323839587038//レ 40#define _RES 155.56349186104046//レ# 41#define _MI 164.81377845643496//ミ 42#define _FA 174.61411571650194//ファ 43#define _FAS 184.9972113558172//ファ# 44#define _SO 195.99771799087463//ソ 45#define _SOS 207.65234878997256//ソ# 46#define _RA 220//ラ 47#define _RAS 233.08188075904496//ラ# 48#define _SI 246.94165062806206//シ 49#define DO 261.6255653005986//ド 50#define DOS 277.182630976//ド# 51#define RE 293.664767917//レ 52#define RES 311.126983722//レ# 53#define MI 329.627556912//ミ 54#define FA 349.228231433//ファ 55#define FAS 369.994422711//ファ# 56#define SO 391.995435981//ソ 57#define SOS 415.304697579 58#define RA 440//ラ 59#define RAS 466.163761518//ラ# 60#define SI 493.883301256//シ 61#define DO_ 523.251130601//ド 62#define RE_ 587//レ 63#define MI_ 659//ミ 64#define FA_ 698//ファ 65#define SO_ 783//ソ 66#define RA_ 880//ラ 67#define SI_ 987//シ 68#define DO__ 1046//ド 69#define RE__ 1174//レ 70#define MI__ 1318//ミ 71#define FA__ 1396//ファ 72#define SO__ 1567//ソ 73#define RA__ 1760//ラ 74#define SI__ 1975//シ 75#define DO___ 2093//ド 76#define RE___ 2349//レ 77#define MI___ 2637//ミ 78#define FA___ 2793//ファ 79#define SO___ 3135//ソ 80#define RA___ 3520//ラ 81#define SI___ 3951//シ 82#define DO____ 4186//ド 83int main(void) { 84 85 Beep(DO, 200); 86 Beep(RE, 200); 87 Beep(MI, 200); 88 Beep(FA, 200); 89 Beep(SO, 200); 90 Beep(RA, 200); 91 Beep(SI, 200); 92 Beep(DO_, 200); 93 Beep(DO, 200), Beep(RE, 200); 94 95 return (0); 96} 97

試したこと

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

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

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

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

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

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

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

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

guest

回答4

0

ベストアンサー

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

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

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

C

1#include <stdio.h> 2#include <windows.h> 3#include <mmsystem.h> 4#pragma comment(lib, "winmm.lib") 5 6HMIDIOUT ghMidiOut; 7 8void noteOn(unsigned iNote, unsigned iVelocity) 9{ 10 unsigned packdata = 0x90 | (iNote << 8) | (iVelocity << 16); 11 midiOutShortMsg(ghMidiOut, packdata); 12} 13 14void noteOff(unsigned iNote) 15{ 16 unsigned packdata = 0x80 | (iNote << 8); 17 midiOutShortMsg(ghMidiOut, packdata); 18} 19 20int main() 21{ 22 MMRESULT mmres = midiOutOpen(&ghMidiOut, MIDI_MAPPER, NULL, NULL, CALLBACK_NULL); 23 if(mmres != MMSYSERR_NOERROR) 24 { 25 fprintf(stderr, "MIDIが利用できません。\n"); 26 return 1; 27 } 28 29 // ドミソ同時押し 30 noteOn(60, 127); 31 noteOn(64, 127); 32 noteOn(67, 127); 33 Sleep(1000); 34 noteOff(60); 35 noteOff(62); 36 noteOff(67); 37 38 midiOutClose(ghMidiOut); 39 return 0; 40}

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

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

投稿2018/04/25 06:15

編集2018/04/25 06:35
catsforepaw

総合スコア5938

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

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

退会済みユーザー

退会済みユーザー

2018/04/26 09:19

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

0

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

投稿2018/04/25 06:38

y_waiwai

総合スコア87774

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

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

sazi

2018/04/25 06:48

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

2018/04/25 14:56

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

2018/04/25 15:41

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

0

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

投稿2018/04/25 04:22

sazi

総合スコア25184

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

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

0

リファレンスを見ると、

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

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

投稿2018/04/25 04:08

kazto

総合スコア7196

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問