パソコンが再生している音楽を録音

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
メッセージ
作成者
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

パソコンが再生している音楽を録音

#1 投稿記事 by yu0627 »

 タイトルにもあるとおり、あるソフトでパソコンが再生している音楽を
録音しなければならなくなったのですが、どうやればいいか分かりません。
 どなたか方法を知りませんでしょうか。よければ録音品質も設定できる
ようにしたいです。教えてください。お願いします。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: パソコンが再生している音楽を録音

#2 投稿記事 by NoWest »

>  どなたか方法を知りませんでしょうか。よければ録音品質も設定できる
> ようにしたいです。教えてください。お願いします。
5秒間録音でき、再生もできるサンプルです。
コマンドボタン1が録音でコマンドボタン2が再生になっています。
説明するのは大変なので細かい部分は説明しません。
わからないことがあれば再度質問してください。


>  タイトルにもあるとおり、あるソフトでパソコンが再生している音楽を
> 録音しなければならなくなったのですが、どうやればいいか分かりません。

ご存知かもしれませんが初期設定のパソコンではパソコンが再生する音を録音できません。タスクバー右下のスピーカをダブルクリックして
ボリュームコントロールを起動して表示を録音にした後、WAVE出力ミックスの項を選択する必要があります。

これをプログラムの方から操作する方法はないことは無いので、
知りたい場合は、別に質問してださい。


あと、質問自体にファイルまでの書き出しが含まれているのでしたら
そのこともまた後で質問していただければ対応します。
最後に編集したユーザー NoWest [ 2005年12月09日(金) 13:18 ], 累計 1 回
mako20
記事: 26
登録日時: 2005年5月31日(火) 01:10
お住まい: 岡山県
連絡する:

僕のプログラム作成にも役立ちます^^

#3 投稿記事 by mako20 »

NoWestさん、僕にも役立ちました。

わからなかったのが、WAVEFORMATEX(後、WAVE_FORMAT_PCM)だったのでOggVorbis再生に一歩近づきました。ありがとうございます
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627

#4 投稿記事 by yu0627 »

NoWestさんありがとうございます。
こういうものを作れるなんて脱帽です。

僕が考えているのはMicrosoft サウンド マッパーを使って録音し、
それをWavファイルに書き出すということにしたいと思います。
しかし録音だけにかなりのAPI、構造体、定数が必要なんですね^^;
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 返信@yu0627

#5 投稿記事 by NoWest »

> NoWestさんありがとうございます。
> こういうものを作れるなんて脱帽です。
>
> 僕が考えているのはMicrosoft サウンド マッパーを使って録音し、
> それをWavファイルに書き出すということにしたいと思います。
> しかし録音だけにかなりのAPI、構造体、定数が必要なんですね^^;


mciSendString関数を使えばもっと使用する定数や構造体を減らせます。
何といてもmciSendStringで使用するのは文字列だけなので、、、
waveaudioデバイスをオープンした後
saveコマンドを送信すれば録音でき
saveコマンドを送信すればファイルに保存できます。
ただ、任意のタイミングで録音を開始したりするのが苦手なので
簡単ですが本格的なWave操作に向きません。
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627

#6 投稿記事 by yu0627 »

> mciSendString関数を使えばもっと使用する定数や構造体を減らせます。
> 何といてもmciSendStringで使用するのは文字列だけなので、、、
> waveaudioデバイスをオープンした後
> saveコマンドを送信すれば録音でき
> saveコマンドを送信すればファイルに保存できます。
> ただ、任意のタイミングで録音を開始したりするのが苦手なので
> 簡単ですが本格的なWave操作に向きません。

僕が考えているのはステレオorモノラルやビットレートが選べタイミングが
しっかり合わないとおかしくなるプログラムを考えています。
ですので、本格的な操作が必要だと思います。
その方法を教えてくれませんか。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 返信@yu0627

#7 投稿記事 by NoWest »

>
> 僕が考えているのはステレオorモノラルやビットレートが選べタイミングが
> しっかり合わないとおかしくなるプログラムを考えています。
> ですので、本格的な操作が必要だと思います。
> その方法を教えてくれませんか。

・どの程度のアプリケーションが作りたいのか具体的に分からないので
お教えしようがないです。

そりゃぁ何となくイメージで作ろうと思えば作れますが、
私が作っても仕方ないですし

具体的にどの辺りが分からないのか書いていただかないと、、、

例えば
「5秒以上録音したいときは?」とか
「録音の音質を途中で変えるには?」とか、


・ひとまず、私の掲載したサンプルがどういった動作をしているのか
よく理解してください。
ここから入らないと録音したデータを保存したりできませんし、
マルチバッファリングの説明も難しいので。。。


P.S.
WAVE操作(処理・制御)は
D-A変換、A-D変換、振動といった知識が必要になるので
ある程度、基礎知識がないと難しいです。
関連サイトとかをググってみてください。
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

Re: 返信@yu0627

#8 投稿記事 by yu0627 »

> ・どの程度のアプリケーションが作りたいのか具体的に分からないので
> お教えしようがないです。
> 具体的にどの辺りが分からないのか書いていただかないと、、、

ある音楽ファイルをwavに変換するソフトを考えています。
その音楽ファイルの再生部分はどうやればいいのか分かります。
ただ、それを録音するのがどうやればいいのか分からなかったからです。

> ・ひとまず、私の掲載したサンプルがどういった動作をしているのか
> よく理解してください。
> ここから入らないと録音したデータを保存したりできませんし、
> マルチバッファリングの説明も難しいので。。。

一部分かります。MainWndProcをいじるのは連続的にしないといけない処理だからでしょうか。
WavのマルチバッファリングはWavのバッファを複数持つということでしょうか。

> P.S.
> WAVE操作(処理・制御)は
> D-A変換、A-D変換、振動といった知識が必要になるので
> ある程度、基礎知識がないと難しいです。
> 関連サイトとかをググってみてください。

D-A変換はデジタル→アナログ変換、
A-D変換はアナログ→デジタル変換のことですよね!?
振動は音を出すために振動する時の「Hz」とかのことですか?
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 返信@yu0627

#9 投稿記事 by NoWest »

> ある音楽ファイルをwavに変換するソフトを考えています。
> その音楽ファイルの再生部分はどうやればいいのか分かります。
> ただ、それを録音するのがどうやればいいのか分からなかったからです。
なるほど、ある音楽ファイルというのは(こちらから詮索はしませんが)
何なのか分かりませんが
例えばmp3とかであれば変換アルゴリズムがありますのでそれを使えば
簡単に変換できますよ。著作の問題が付きまといますが。。。

と、まぁそんなことは置いといて
そうではないとして話を進めます。
例えば音楽CDとかの場合(そうだろ!、と決め付けてはいません)、
データ形式は16bit、44100HzのPCMである.cdaなどとなります。
これを直接CDイメージから読み取ってWaveに変換するとなると
やはりかなり高等な技術が必要となり正直アマチュアやビギナーでは
手が届きません。

ですのでパソコンが出している音をそのまま内部で録音すればよい
ということですよね。(やっぱり音質は劣化しますが・・・)

となると、やっぱりミキサー関連にも触れないといけないみたいですね。

昔作ったサンプルとか引っ張り出してきますので
少々お持ちくださいね。

折角、ご質問いただいたのですから、最後までお付き合いさせていただきます。

> 一部分かります。MainWndProcをいじるのは連続的にしないといけない処理だからでしょうか。
> WavのマルチバッファリングはWavのバッファを複数持つということでしょうか。
そういうことです。
録音や再生というのは勿論、再生から停止までバッファの長さ
きっかりになるのですが、実際の動作というのは再生開始時間から
終了時間までは多少ロスが入ったりと正確ではありませんし
録音では任意の長さで録音ができないと意味がありませんよね。
最初にのっけたサンプルでは最初からデータの長さは5秒と
決めていたので簡単なのですが、不定長のものを録音するとなると
やはりマルチバッファリングが必要となります。
マルチバッファリングというのは複数の小さいバッファを
順番に録音に使用して、1つのバッファが録音中である間に
他のバッファがファイルへの書き出しをおこなうというものです。

そういえばファイルへの書き出しもしないといけませんね。
こちらも少々お待ちください。

ついでにMCIでのやり方もご紹介しておきましょう。
もしかしたら、これで十分ということもあるかもしれませんし、
http://homepage1.nifty.com/MADIA/delphi ... I_Wave.htm
http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/9802/mci/
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627

#10 投稿記事 by yu0627 »

> なるほど、ある音楽ファイルというのは(こちらから詮索はしませんが)
> 何なのか分かりませんが
> 例えばmp3とかであれば変換アルゴリズムがありますのでそれを使えば
> 簡単に変換できますよ。著作の問題が付きまといますが。。。
いえ。変換もとの音楽ファイルがwavのように音自体を変換するものじゃなくて音階を記録する形式なので普通には変換できませんので。

> ですのでパソコンが出している音をそのまま内部で録音すればよい
> ということですよね。(やっぱり音質は劣化しますが・・・)
内部でA-D、D-A変換だからノイズ拾っちゃうからですよね。

> となると、やっぱりミキサー関連にも触れないといけないみたいですね。
>
> 昔作ったサンプルとか引っ張り出してきますので
> 少々お持ちくださいね。
>
> 折角、ご質問いただいたのですから、最後までお付き合いさせていただきます。
ありがとうございます。

> ついでにMCIでのやり方もご紹介しておきましょう。
> もしかしたら、これで十分ということもあるかもしれませんし、
> http://homepage1.nifty.com/MADIA/delphi ... I_Wave.htm
> http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/9802/mci/
見ました。Delphi(Object Pascal)でのソースですが大体分かります。
作ろうと思ったらmciSendStringがapi_mmsys.sbpに宣言がなくて自作関数の宣言も分からない...(⌒_⌒; タラタラ
あ、これは(mciSendString)は教えていただかなくて結構です。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 返信@yu0627

#11 投稿記事 by NoWest »

いえ。変換もとの音楽ファイルがwavのように音自体を変換するものじゃなくて音階を記録する形式なので普通には変換できませんので。
ということはMIDIとかを変換するんですね。
> > ですのでパソコンが出している音をそのまま内部で録音すればよい
> > ということですよね。(やっぱり音質は劣化しますが・・・)
> 内部でA-D、D-A変換だからノイズ拾っちゃうからですよね。
そうはいっても最近のサウンドチップは圧縮なんかよりは音質はいいです。
他の作業をしているとクリック音とか警告音とかがいつの間にかはいってたり
しますけど。。。
> 作ろうと思ったらmciSendStringがapi_mmsys.sbpに宣言がなくて自作関数の宣言も分からない...(⌒_⌒; タラタラ
それはうちのサイトに来ていただければapi_mmsysPro4をダウンロードする
だけで解決です。


と、いうことでWAVE録音と再生のサンプル乗っけます。
録音と再生は可変長であると考えてマルチバッファリングを使っています。
かなりデカいですが引かないでくださいね。

サンプルはコマンドボタン3つのRAD上で動くようにしてあります。
また、例によって分からないことがあれば質問してください。

mixer関連は必要があればということで今回はご勘弁を、、、
最後に編集したユーザー NoWest [ 2005年12月09日(金) 13:22 ], 累計 2 回
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627

#12 投稿記事 by yu0627 »

ということはMIDIとかを変換するんですね。
ギクッ...。

教えてくださりありがとうございます。しかし、録音しようとすると
強制終了してしまうのでデバッグすると「WaveHdr[49].dwUser = TRUE」の部分でアクセス違反が起きています。
長すぎて解析できないので確認してみてください。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 返信@yu0627

#13 投稿記事 by NoWest »

>
ということはMIDIとかを変換するんですね。
> ギクッ...。
>
> 教えてくださりありがとうございます。しかし、録音しようとすると
> 強制終了してしまうのでデバッグすると「WaveHdr[49].dwUser = TRUE」の部分でアクセス違反が起きています。
> 長すぎて解析できないので確認してみてください。


そいつはデバッグしたときのゴミですので削除してください。
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627

#14 投稿記事 by yu0627 »

教えてくださりありがとうございます。動作確認できました。
これからは色々と自分で試行錯誤してみます。もし乗り越えれない壁に当たったらまた返信するかもしれません。
ちなみに僕の環境で44100KHz 16bit Stereoで録音するとやばくなります。再生速度が遅いというか...。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 返信@yu0627

#15 投稿記事 by NoWest »

> 教えてくださりありがとうございます。動作確認できました。
> これからは色々と自分で試行錯誤してみます。もし乗り越えれない壁に当たったらまた返信するかもしれません。
> ちなみに僕の環境で44100KHz 16bit Stereoで録音するとやばくなります。再生速度が遅いというか...。


たぶんバッファサイズを大きくとれば改善するでしょう。
このサンプルでは1*1024bitいわゆる1Kbyteですが
6K~8K位に増やせばCPUの遅いパソコンでも大丈夫だと思います。
返信する