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

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

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

Re[3]: C#でのMIDI制御


(過去ログ 124 を表示中)

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

■73872 / inTopicNo.1)  C#でのMIDI制御
  
□投稿者/ VC (1回)-(2014/11/11(Tue) 23:43:09)

分類:[C#] 

開発環境:Visual C# 2010 Express

こんにちは。はじめての質問になります。
大学のグループ演習で、僕はC#を使いMIDIファイルを再生し、再生中に外部入力によってテンポや楽器別の音量の変更をするという機能の実装をまかされました。
しかしググってもC/C++でのMIDIファイル制御はいくらか出てくるのですが、どうしてもC#でのこういったMIDIファイル制御の方法がわかりません。

どなたかこの機能の実装の仕方を教えてもらえないでしょうか?
直接コードを書く、詳しいサイトのアドレスを載せる等どんな情報でも結構です。おねがいします。
引用返信 編集キー/
■73879 / inTopicNo.2)  Re[1]: C#でのMIDI制御
□投稿者/ daive (33回)-(2014/11/12(Wed) 09:20:28)
2014/11/12(Wed) 09:30:49 編集(投稿者)

検索ワードが示されていませんので、
どういう検索をしたのか不明ですが、

検索ワード:Google サーチサイト
C# MIDI
C# MIDI プログラミング
C# MIDI toolkit
C# MIDI 制御
C# MIDI API
などで、かなり検索可能な様子ですが?

PC単独での再生で、Windows XP 迄と、VISTA以後での問題がある様子。
(PCでの、MIDIファイル再生時のWindows 内臓音源:ソフト音源の問題、再生先指定の問題)

MIDI機器&機材が不明、PC単独なのか、MIDI音源はどうするのかやら、
ケーブル類は、環境によるでしょうし:小っちゃい部屋、学校の体育、ライブハウス、コンサート会場
外部入力は、何時、何処で、誰が、何を、どのように、どうするか?という基本部分が不明
(Mbed / Arduino / GR-SAKURA / STM-Mbed / raspberry pi などで、簡易入力?、MIDI機器の機能を使う?
 スイッチ使う?その場合、構造は?絶縁は?距離は?電源は?とか。)
使用PCでスコア編集をどうするか、使用するシーケンスソフトとの相性、取合いはどうするかとか
物作りから考えていたら、年末まででは時間が足らないでしょうし、3月まででも不足かも。
人、物、金、時間、場所、方法、手段やら
引用返信 編集キー/
■73885 / inTopicNo.3)  Re[2]: C#でのMIDI制御
□投稿者/ VC (2回)-(2014/11/12(Wed) 13:27:51)
返答ありがとうございます。質問に不備があったようで申し訳ありませんでした。もういちどその検索ワードで調べてみます。


ちなみに現在
http://www.eonet.ne.jp/~maeda/cs/mcimidi.htm
上のサイトのコードを少しだけ変えて、一度だけ右クリックテンポを半分にするという以下のコードを記述したところです。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;


namespace mci
{
    public class MyForm : Form
    {
        [DllImport("winmm.dll")]
        extern static int mciSendString(string s1, StringBuilder s2, int i1, int i2);
        // 返り値 = 0 @正常終了
        // s1     = Command String
        // s2     = Return String
        // i1     = Return String Size
        // i2     = Callback Hwnd

        public MyForm()
        {
            this.Text = "MCI Function";
        }


        protected override void OnMouseDown(MouseEventArgs e)
        {
            int ret;
            if (e.Button == MouseButtons.Left)  //マウスの左ボタンで再生する
            {
                //ret = sound_open(@"C:\DATA\Test\Chimes.wav");
                ret = sound_open(@"C:\DATA\Test\Chimes.wav");
                Console.WriteLine(ret);
                sound_play();
            }

            if (e.Button == MouseButtons.Middle) //マウスの中間ボタンで停止する
            {
                sound_stop();
                sound_close();
            }

            if (e.Button == MouseButtons.Right) //マウスの右ボタンでテンポを60にする
            {
                sound_slow();
            }
        }


        // ファイルを open
        private int sound_open(string file_name)
        { return mciSendString("open \"" + file_name + "\" alias my_sound", null, 0, 0); }

        // ファイルを close
        private void sound_close()
        { mciSendString("close  my_sound", null, 0, 0); }

        // 再生を開始
        private void sound_play()
        { mciSendString("play   my_sound", null, 0, 0); }

        // 停止
        private void sound_stop()
        { mciSendString("stop   my_sound", null, 0, 0); }

        // 一時停止
        private void sound_pause()
        { mciSendString("pause  my_sound", null, 0, 0); }

        // 一時停止解除
        private void sound_resume()
        { mciSendString("resume my_sound", null, 0, 0); }

        //テンポを60にする
        private void sound_slow()
        { mciSendString("set my_sound tempo 60", null, 0, 0); }

        StringBuilder sb = new StringBuilder(32);  // mciSendString() の Return String 格納用
        // 状態を取得
        private string sound_get_mode()
        {   //   返り値: 再生中          = "playing"
            //           停止中/再生終了 = "stopped"
            //           一時停止中      = "paused"
            mciSendString("status my_sound mode", sb, sb.Capacity, 0);
            return sb.ToString();
        }

        // play 中のファイルの位置を ms単位 で返す
        private int sound_get_position()
        {
            mciSendString("status my_sound position", sb, sb.Capacity, 0);
            return int.Parse(sb.ToString());
        }

        // open 中のファイルの曲長を ms単位 で返す
        private int sound_get_length()
        {
            mciSendString("status my_sound length", sb, sb.Capacity, 0);
            return int.Parse(sb.ToString());
        }
    }


    class form01
    {
        public static void Main()
        {
            MyForm mf = new MyForm();
            Application.Run(mf);
        }
    }
}

引用返信 編集キー/
■73886 / inTopicNo.4)  Re[3]: C#でのMIDI制御
□投稿者/ VC (4回)-(2014/11/12(Wed) 14:16:58)
どうやらmciをつかった上のコードでは、再生中に楽器別に音量を変更することはできないみたいです。すいませんでした。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -