C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: DirectSoundを使ったドラムマシンのサンプルを改良し


(過去ログ 77 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■45630 / inTopicNo.1)  DirectSoundを使ったドラムマシンのサンプルを改良し
  
□投稿者/ へもも (1回)-(2010/01/16(Sat) 23:32:44)

分類:[.NET 全般] 

VisualStudio2008 C#です。

http://msdn.microsoft.com/ja-jp/library/ms973091.aspx

このサンプルを改良したく思います。
改良点は
・音の変更ができる

現在音の準備を終えてそれぞれフォルダにはいっている状態です。

RythmMachineAppクラスで起動したときに音声ファイルを読み込みます。


public RythmMachineApp(Control control, IAudioPlayer player)
{
int measuresPerBeat = 2;

Type resType = control.GetType();
Mixer = new Chronotron.Rythm.Mixer(
player, measuresPerBeat);
Mixer.Add(new Track("Bass drum",
new Patch(resType, "media.bass.wav"), TrackLength)); ←ココ
Mixer.Add(new Track("Snare drum",
new Patch(resType, "media.snare.wav"), TrackLength));
Mixer.Add(new Track("Closed hat",
new Patch(resType, "media.closed.wav"), TrackLength));
Mixer.Add(new Track("Open hat",
new Patch(resType, "media.open.wav"), TrackLength));
Mixer.Add(new Track("Toc",
new Patch(resType, "media.rim.wav"), TrackLength));
// 事前に設定された値で初期化
Mixer["Bass drum"].Init(new byte[]
{ 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0 } );
Mixer["Snare drum"].Init(new byte[]
{ 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0 } );
Mixer["Closed hat"].Init(new byte[]
{ 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0 } );
Mixer["Open hat"].Init(new byte[]
{ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1 } );
BuildUI(control);
m_Timer = new Timer();
m_Timer.Interval = 250;
m_Timer.Tick += new EventHandler(m_Timer_Tick);
m_Timer.Enabled = true;
}


これをボタンを押すと用意しておいた別の音のファイルに変更したいです。
できればドラムマシン再生中にボタンを押すと入力していたリズムパターンはそのままで音だけ変わるようにしたく思います。

今やってみたのはボタンが押されたときに

「m_Machine.Add(this, new DSoundPlayer.StreamingPlayer(this, 22050, 16, 1));」

このような処理を行い新しくプレイヤーを作ってしまっていてリズムパターンの入力がおかしくなっています。

事前に初期化

Mixer["Bass drum"].Init(new byte[]
{ 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0 } );
Mixer["Snare drum"].Init(new byte[]
{ 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0 } );
Mixer["Closed hat"].Init(new byte[]
{ 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0 } );
Mixer["Open hat"].Init(new byte[]
{ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1 } );

の部分を何か音を変える前の配列を参照するなど方法はわかるんですが C#をはじめて間もないのでよく理解できていません。


どなたか助言お願いします。
引用返信 編集キー/
■45635 / inTopicNo.2)  Re[1]: DirectSoundを使ったドラムマシンのサンプルを改良し
□投稿者/ オショウ (504回)-(2010/01/17(Sun) 11:56:31)
No45630 (へもも さん) に返信
> これをボタンを押すと用意しておいた別の音のファイルに変更したいです。
> できればドラムマシン再生中にボタンを押すと入力していたリズムパターンはそのままで音だけ変わるようにしたく思います。

  ええ〜と・・・
  起動時に既に何かデフォルトの設定で初期化されていて
  後に(ボタンクリック時等)にMixerの内容を変更したい
  のであれば、以前のMixerをDisposeするか、Clearして、
  新たな設定でMixerを作ってやるだけで、何とかなりませ
  んか?

  未実験なので、Mixerが他の何かに依存等していた場合、
  それらも一旦CloseやDisposeして、再インスタンス化し
  てやる必要があると思います。

以上。参考まで
引用返信 編集キー/
■45698 / inTopicNo.3)  Re[1]: DirectSoundを使ったドラムマシンのサンプルを改良し
□投稿者/ gtk2k (151回)-(2010/01/19(Tue) 01:36:18)
用意したボタンのクリックイベントに
たとえばバスドラムの音を変えるとすると、
private void Button_Click(...)
{
m_Machine.Mixer["Bass drum"].Patch = new Chronotron.Rythm.Patch("open.wav");
}
とすればできます。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -