約 5,654,857 件
https://w.atwiki.jp/vst_prog/pages/91.html
トップページ CMidiMsgクラスの実装 ここでは前項で定義したCMidiMsgクラスについて説明する。 CMidiMsgクラスの実装 CMidiMsgクラスではコンストラクタでclearMidiMsg()関数を呼び出し初期化している。 clearMidiMsg()関数はメンバー変数に初期値を代入している。終了処理はないため、デストラクタでは何もしていない。 CMidiMsg CMidiMsg(void){clearMidiMsg();} CMidiMsg ~CMidiMsg(void){} void CMidiMsg clearMidiMsg(){// メンバー変数を初期化するcur=0;num=0;memset(buf, 0, sizeof(MidiMessage)*MIDIMSG_MAXNUM);} CMidiMsgクラス addMidiMsg()関数 次にaddMidiMsg()関数について説明する。 メンバ関数 戻り値 引数 内容 addMidiMsg() int VstMidiEvent *midievent MIDIメッセージをMIDIバッファへの保存する関数。引数は受け取るMIDIメッセージ(VstMidiEvent型のポインタ)MIDIバッファへの追加に成功すると1、失敗すると0が返る。 この関数はVSTから受け取ったMIDIメッセージをMIDIバッファへ保存するための関数で、processEvents()関数内で、下記のように呼び出されることを想定している。 VstInt32 MyMidiSample2VST processEvents (VstEvents* events){// MIDIバッファを初期化。clearMidiMsg(); int loops = (events- numEvents); // VSTイベントの回数だけループをまわす。for (int i = 0;i loops; i++){// 与えられたイベントがMIDIならばMIDIバッファに追加する。if ((events- events[i])- type == kVstMidiType){VstMidiEvent *midievent = (VstMidiEvent*)(events- events[i]);if( !addMidiMsg(midievent) ){break;}}} // 1を返さなければならないreturn 1;} processEvents()関数内では、はじめにclearMidiMsg()関数でMIDIバッファ初期化している。 (clearMidiMsg()関数についてはコンストラクタの部分で説明したとおりである。) 次にVSTイベント(VstEvents* events)がいくつあるか確認し、VSTイベントの数だけ繰返し(for文)をおこない、VSTイベントがMIDIメッセージの場合にaddMidiMsg()関数を使用して、MIDIバッファへ保存している。 addMidiMsg()関数は下記のようにMIDIバッファに空きがあるかを確認し、空きがあればMIDIバッファに保管する。保管後は、MIDIバッファ内のMIDIメッセージ数を更新するようにしている。 また、VSTホストからMIDIメッセージを受け取る際はVstMidiEvent型で渡されることを想定し、簡単に処理できるようにaddMidiMsg()関数をオーバーロードしている。 int CMidiMsg addMidiMsg(VstMidiEvent *midievent){// VstMidiEventからMidiMessgeへデータをコピーするMidiMessage tmp;tmp.deltaFrames = midievent- deltaFrames;tmp.message = midievent- midiData[0] 0xF0;tmp.channel = midievent- midiData[0] 0x0F;tmp.data1 = midievent- midiData[1];tmp.data2 = midievent- midiData[2]; return addMidiMsg(tmp);} int CMidiMsg addMidiMsg(MidiMessage msg){// バッファがいっぱいなら0を返すif (num = MIDIMSG_MAXNUM)return 0; // バッファにMIDIメッセージを保存buf[num] = msg; // バッファに保存されているMIDIメッセージの数を増やす。num++;if (num MIDIMSG_MAXNUM) {num = MIDIMSG_MAXNUM;} return 1;} CMidiMsgクラス getMidiMsg()関数、getMidiMessageNum()関数、getNextDeltaFrames()関数 【作成中】 MIDIメッセージ処理用クラス定義 【作成中】 ここで作成するVSTサンプルのソースコード全体はここにある。 次へ 同一カテゴリのTips 項目 No. 概要 MIDIメッセージ処理 No.1 MIDIメッセージ処理で最小構成の自作VSTに追加する変数・関数 No.2 VSTの初期化とMIDIメッセージ処理関連の変数の初期化 No.3 ホストアプリケーションからMIDIメッセージを受け取る方法 No.4 MIDIメッセージをprocessReplacing()関数中で処理する方法 No.5 MIDIメッセージ処理で作成したVSTのサンプルソースコード全体(暫定版)
https://w.atwiki.jp/vst_prog/pages/80.html
トップページ MIDIメッセージを処理するVSTについて2 MIDIメッセージ処理 No1~No5で作成したVSTのMIDI処理については、どんなVSTでもほぼ共通の処理となる。 コードを再利用しやすいように、ここではシステムエクスクルーシブを除くMIDIメッセージに関する処理をクラスとしてひとまとめにする。 MIDIメッセージを処理するクラスは自作VSTクラスで下記のように継承できるように作成する。 class MyMidiSampleVST2 public AudioEffectX , public CMidiMsg // CMidiMsgが今回作成するクラス{: // 以下省略:}; ここで作成するVSTサンプルのソースコード全体はここにある。 MIDIメッセージ処理用クラス定義 MIDIメッセージ処理用クラスは以下のように定義する。(全体は長いので一部省略している。全体はここにある。) class CMidiMsg{protected int cur; //読み込み中のMIDIの位置int num; //受け取ったMIDIメッセージの数MidiMessage buf[MIDIMSG_MAXNUM]; //受け取ったMIDIメッセージを保管するバッファpublic CMidiMsg(void);~CMidiMsg(void); // バッファのクリア等を行う。virtual void clearMidiMsg(); // MIDIメッセージをバッファに追加する// バッファへの追加が成功すると1、失敗すると0を返すvirtual int addMidiMsg(VstMidiEvent *midievent);virtual int addMidiMsg(MidiMessage msg); // バッファからMIDIメッセージを取り出すvirtual MidiMessage getMidiMsg(); // バッファ中にあるMIDIメッセージの数を返すvirtual VstInt32 getMidiMessageNum(); // バッファから最初に取り出せるMIDIメッセージのDeltaFramesを返すvirtual VstInt32 getNextDeltaFrames(); // MIDIメッセージが何かを判断し、そのメッセージに対応した// onMidiKeyOn()関数、onMidiControlChange()関数等を呼び出す。// 引数なしの場合、内部でgetMidiMsg()が使用されるので注意。virtual void midiProc(MidiMessage mididata);virtual void midiProc() { MidiMessage mididata = getMidiMsg(); midiProc(mididata); }; // midiProc()関数から呼び出される。// それぞれのMIDIメッセージに応じて処理を行う// 以下6つはオーバーライドして使うvirtual void onMidiKeyOn (unsigned char channel, unsigned char noteNo, unsigned char velo) {}; // 関数の中身は空virtual void onMidiKeyOff (unsigned char channel, unsigned char noteNo, unsigned char velo) {}; // 関数の中身は空: // 長いので省略:}; 解説 まず、MIDIメッセージのや書き込みのためのバッファと読み出し位置や書き込み位置の変数を定義している。 これらは他のクラスから読み込まれることはないのでprotectedで宣言している。 protected int cur; //読み込み中のMIDIの位置 int num; //受け取ったMIDIメッセージの数 MidiMessage buf[MIDIMSG_MAXNUM]; //受け取ったMIDIメッセージを保管するバッファ 次に以下2つの操作を行うための関数を定義している ホストアプリケーションからのMIDIメッセージの受け取る際に使用する関数(processEvents()関数内で呼び出される関数) メンバ関数 戻り値 引数 内容 clearMidiMsg() なし なし MIDIメッセージを受け取るMIDIバッファを初期化する関数。 addMidiMsg() int VstMidiEvent *midievent MIDIメッセージをMIDIバッファへの保存する関数。引数は受け取るMIDIメッセージ(VstMidiEvent型のポインタ)MIDIバッファへの追加に成功すると1、失敗すると0が返る。 受け取ったMIDIメッセージを処理する関数(processReplacing()関数内で呼び出される関数) メンバ関数 戻り値 引数 内容 getMidiMessageNum() VstInt32 なし MIDIメッセージ有無のチェックに利用する関数。戻り値はMIDIバッファにあるMIDIメッセージの数。 getNextDeltaFrames() VstInt32 なし processReplacing()関数内で次のMIDIメッセージを処理するタイミングを返す関数。戻り値は処理すべきフレーム(0~sampleFramesの範囲の値) getMidiMsg() MidiMessage MIDIバッファからのMIDIメッセージの取り出す関数。戻り値はMIDIメッセージ構造体 midiProc()関数 なし MidiMessage mididata 引数のMIDIメッセージに応じて処理を実施する。引数は処理するMIDIメッセージ midiProc()関数では各MIDIメッセージ(KeyOn、KeyOff、ControlChange等)を処理するメンバ関数を呼び出す。 これらの関数(onMidiKeyOn()関数、onMidiKeyOff()関数 等)についても、定義している。 midiProc()関数から呼び出されるメンバ関数 メンバ関数 戻り値 引数 内容 onMidiKeyOn() なし MIDIメッセージがKeyOnの際に呼び出される。 onMidiKeyOff() なし MIDIメッセージがKeyOffの際に呼び出される。 onMidiProgramChange() なし MIDIメッセージがプログラムチェンジの際に呼び出される。 onMidiPoliKeyPress() なし MIDIメッセージがポリフォニックキープレッシャーの際に呼び出される。 onMidiChannelPress() なし MIDIメッセージがチャンネルプレッシャーの際に呼び出される。 onMidiPitchBend() なし MIDIメッセージがピッチベンドチェンジの際に呼び出される。 onMidiSystemMessage() なし MIDIメッセージがシステムコモンメッセージ、システムリアルタイムメッセージの際に呼び出される。システムメッセージに応じてさらにonMidiQuarterFrame()関数、onMidiSongPointer()関数などが呼び出される onMidiControlChange() なし MIDIメッセージがコントロールチェンジの際に呼び出される。コントロールチェンジメッセージに応じてさらにonMidiCC000()~onMidiCC127()の関数が呼び出される。 次へ 同一カテゴリのTips 項目 No. 概要 MIDIメッセージ処理 No.1 MIDIメッセージ処理で最小構成の自作VSTに追加する変数・関数 No.2 VSTの初期化とMIDIメッセージ処理関連の変数の初期化 No.3 ホストアプリケーションからMIDIメッセージを受け取る方法 No.4 MIDIメッセージをprocessReplacing()関数中で処理する方法 No.5 MIDIメッセージ処理で作成したVSTのサンプルソースコード全体(暫定版)
https://w.atwiki.jp/vst_prog/pages/77.html
トップページ MIDIメッセージをホストアプリケーションから受け取る関数 MIDIメッセージをホストアプリケーションから受け取るにはprocessEvents()関数を利用する。 processEvents()関数 VstInt32 processEvents (VstEvents* events) 戻り値と引数については以下のとおりである。 戻り値(型) 説明 VstInt32 戻り値についてはホストアプリケーションで無視される。ただし、念のため1を返すようにするとよい。 引数 説明 VstEvents* events イベントを保持しているVstEvents型変数(後述)へのポインタ processEvents()関数はMIDIメッセージだけを受け取る関数ではなく、VSTに関するホストアプリケーションからのイベントをすべて受け取る関数となっている。 ただし、実装されているメッセージは現在(2010年11月)のところMIDIに関する以下の2つだけである。 MIDIメッセージ MIDI System Exclusiveメッセージ processEvents()関数との関係 ホストアプリケーションはprocessReplacing()関数を呼び出す前に必ず1度だけprocessEvents()関数呼び出し、イベントをVSTに通知する。 また、processEvents()関数で渡されるイベントは直後に呼び出すprocessReplacing()関数に関連するイベントのみとなっている。 ホストアプリケーション側の処理のイメージとしては以下のような感じである。 【ホストアプリケーションの動作】 ①processEvents()関数呼び出し ↓ ②processReplacing()関数呼び出し ↓ ③いろいろ処理 ↓ ④processEvents()関数呼び出し ↓ ⑤processReplacing()関数呼び出し ↓ ⑥いろいろ処理 ↓ ⑦processEvents()関数呼び出し ↓ ⑧processReplacing()関数呼び出し ↓ : : ホストアプリケーションは①でprocessEvents()関数を呼び出した際に、②processReplacing()関数に関連するイベントのみをVSTに渡す。 (ホストアプリケーションは②に無関係のイベント(⑤や⑧に関連するイベント)については渡してはいけない。) サンプルコード processEvents()関数でMIDIメッセージを保存するサンプルコードは以下のとおり。 VstInt32 MyMidiSampleVST processEvents (VstEvents* events){// MIDIのリストを初期化します。midimsgnum = 0;memset(midimsgbuf, 0, sizeof(MidiMessage) * MIDIMSG_MAXNUM); // VSTイベントの回数だけループをまわす。int loops = (events- numEvents);for (int i = 0;i loops; i++){// 与えられたイベントがMIDIならばmidimsgbufにストックするif ((events- events[i])- type == kVstMidiType){VstMidiEvent *midievent = (VstMidiEvent*)(events- events[i]); midimsgbuf[midimsgnum].deltaFrames = midievent- deltaFrames;midimsgbuf[midimsgnum].message = midievent- midiData[0] 0xF0; // MIDIメッセージmidimsgbuf[midimsgnum].channel = midievent- midiData[0] 0x0F; // MIDIチャンネルmidimsgbuf[midimsgnum].data1 = midievent- midiData[1]; // MIDIデータ1midimsgbuf[midimsgnum].data2 = midievent- midiData[2]; // MIDIデータ2midimsgnum++; // MIDIメッセージのバッファがいっぱいの場合はループを打ち切る。if (i = MIDIMSG_MAXNUM){break;}}} // 1を返しておくreturn 1;} サンプルコードの解説 まず引数のVstEvents構造体は以下のように定義されている。 変数 型 説明 numEvents VstInt32 VSTイベントの数。 reserved VstIntPtr 使われていない変数。0で固定 events [2] VstEvent * VSTイベントへのポインタ。numEvents分だけVSTイベントが格納されている。 ホストアプリケーションからのVSTイベント自体は上記のVstEvents構造体のVstEvent * events[]に格納されている。 VstEvent構造体は以下のように定義されている。 変数 型 説明 type VstInt32 VSTイベントのタイプ。実装されているタイプは以下の2つのみ。kVstMidiType…data[ ]に保存されているデータがMIDIメッセージであることを示すkVstSysExType…data[ ]に保存されているデータがMIDI System Exclusiveメッセージであることを示す byteSize VstInt32 VstEvent構造体のtypeとbyteSizeを除いたバイト数。24固定。 deltaFrames VstInt32 processReplacing()関数内でMIDIメッセージの処理タイミング。0~sampleFramesの範囲の値を持つ。 flags VstInt32 使われていない変数。 data[16] char 実際のVSTイベントデータ。typeよって内容が変わる。 サンプルコードでは、最初にMIDIメッセージを保存するバッファを初期化している。(3~5行目) midimsgnum = 0; memset(midimsgbuf, 0, sizeof(MidiMessage) * MIDIMSG_MAXNUM); 次にVSTイベントの数だけ処理するループを作成している。(8~29行目) // VSTイベントの回数だけループをまわす。 int loops = (events- numEvents); for (int i = 0;i loops; i++) { : : } ループの中で与えられたVSTイベントがMIDIメッセージか確認し、MIDIメッセージならばバッファに保存する(12~28行目) バッファに保存する際、VstEvent構造体のままでは扱いにくいため、VstMidiEvent構造体(後述)に型変換している。 if ((events- events[i])- type == kVstMidiType) { VstMidiEvent *midievent = (VstMidiEvent*)(events- events[i]); midimsgbuf[midimsgnum].deltaFrames = midievent- deltaFrames; midimsgbuf[midimsgnum].message = midievent- midiData[0] 0xF0; // MIDIメッセージ midimsgbuf[midimsgnum].channel = midievent- midiData[0] 0x0F; // MIDIチャンネル midimsgbuf[midimsgnum].data1 = midievent- midiData[1]; // MIDIデータ1 midimsgbuf[midimsgnum].data2 = midievent- midiData[2]; // MIDIデータ2 midimsgnum++; } VstMidiEvent構造体については以下のように定義されている。 変数 型 説明 type VstInt32 VstEvent構造体と同じ。 byteSize VstInt32 VstEvent構造体と同じ。 deltaFrames VstInt32 VstEvent構造体と同じ。 flags VstInt32 使われていない変数。 noteLength VstInt32 用途不明 noteOffset VstInt32 用途不明 midiData [4] char MIDIメッセージ。midiData[0]…MIDIステータス(メッセージ)とMIDIチャンネルが入っている。midiData[1]…MIDIメッセージのデータ1midiData[2]…MIDIメッセージのデータ2midiData[3]…将来的な拡張のため予約。0が入っている。 detune char 用途不明。-64~+63の値が入っている。 noteOffVelocity char 用途不明。0~127の値が入っている。 reserved1 char 将来的な拡張のため予約。0が入っている reserved2 char 将来的な拡張のため予約。0が入っている 次へ 同一カテゴリのTips 項目 No. 概要 MIDIメッセージ処理 No.1 MIDIメッセージ処理で最小構成の自作VSTに追加する変数・関数 No.2 VSTの初期化とMIDIメッセージ処理関連の変数の初期化 No.3 ホストアプリケーションからMIDIメッセージを受け取る方法 No.4 MIDIメッセージをprocessReplacing()関数中で処理する方法 No.5 MIDIメッセージ処理で作成したVSTのサンプルソースコード全体(暫定版)
https://w.atwiki.jp/vst_prog/pages/74.html
トップページ MIDIメッセージ処理 MIDIメッセージにあわせて動作するVSTのサンプルである。 下記VSTはSynthとしてロードされ、常にノイズを発生させる。実行時は音量に注意してほしい。 ノイズのボリュームをMIDI CC7でコントロールできる。 サンプルコード全体 ソースコードのダウンロード→ここをクリック // ============================================================================================// インクルードファイル// ============================================================================================#include stdlib.h #include string.h #include "audioeffectx.h" // ============================================================================================// 設計情報の記入// ============================================================================================#define MY_VST_INPUT_NUM 2 //入力数。モノラル入力=1、ステレオ入力=2#define MY_VST_OUTPUT_NUM 2 //出力数。モノラル出力=1、ステレオ出力=2 #define MY_VST_UNIQUE_ID SMPL //ユニークID //公開する場合は以下URLで発行されたユニークIDを入力する。 //http //ygrabit.steinberg.de/~ygrabit/public_html/index.html #define MY_VST_PRESET_NUM 1 //プリセットプログラムの数#define MY_VST_PARAMETER_NUM 0 //パラメータの数 // ============================================================================================// MIDI処理用の定義// ============================================================================================#define MIDIMSG_MAXNUM 255 struct MidiMessage{VstInt32 deltaFrames; //MIDIメッセージを処理するタイミングunsigned char message; //MIDIメッセージ番号unsigned char channel; //MIDIチャンネルunsigned char data1; //MIDIデータ1unsigned char data2; //MIDIデータ2}; // ============================================================================================// VSTの基本となるクラス// ============================================================================================class MyMidiSampleVST public AudioEffectX{protected int midimsgnum; //受け取ったMIDIメッセージの数MidiMessage midimsgbuf[MIDIMSG_MAXNUM]; //受け取ったMIDIメッセージを保管するバッファ // ノイズのボリュームfloat volume;public MyMidiSampleVST (audioMasterCallback audioMaster); // 音声信号を処理するメンバー関数virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames); // MIDIメッセージをホストアプリケーションから受け取るためのメンバー関数VstInt32 processEvents (VstEvents* events);}; // ============================================================================================// このVSTのを生成するための関数// ============================================================================================AudioEffect* createEffectInstance (audioMasterCallback audioMaster){//newでこのVSTを生成したポインタを返すreturn new MyMidiSampleVST (audioMaster);} MyMidiSampleVST MyMidiSampleVST (audioMasterCallback audioMaster) AudioEffectX (audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM){//VSTの初期化を行う。 //以下の関数を呼び出して入力数、出力数等の情報を設定する。//必ず呼び出さなければならない。setNumInputs (MY_VST_INPUT_NUM); //入力数の設定setNumOutputs (MY_VST_OUTPUT_NUM); //出力数の設定setUniqueID (MY_VST_UNIQUE_ID); //ユニークIDの設定 isSynth (true); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。 //音声処理を行わないVSTはないので必ずこの関数を呼び出す。 //上記の関数を呼び出した後に初期化を行うmidimsgnum = 0;memset(midimsgbuf, 0, sizeof(MidiMessage) * MIDIMSG_MAXNUM); volume = 1.0f;} void MyMidiSampleVST processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames){//入力、出力は2次元配列で渡される。//入力は-1.0f~1.0fの間で渡される。//出力は-1.0f~1.0fの間で書き込む必要がある。//sampleFramesが処理するバッファのサイズfloat* outL = outputs[0]; //出力 左用float* outR = outputs[1]; //出力 右用 // midieventlistの読み込み位置int midimsg_cursol = 0; for (int i = 0; i sampleFrames; i++){//ここで音声処理を行う。 // MIDIメッセージがあるか確認if ( midimsgnum 0){// MIDIメッセージを処理するタイミングかどうかを確認する。if( midimsgbuf[midimsg_cursol].deltaFrames = i){// MIDIメッセージがコントロールチェンジのボリューム変更(CC7)であった場合if( midimsgbuf[midimsg_cursol].message == 0xB0 midimsgbuf[midimsg_cursol].data1 == 7){volume = (float)( midimsgbuf[midimsg_cursol].data2) / 127.0f;} // midimsgbufからMIDIメッセージを読み出したので// 読み込み位置を進め、MIDIメッセージの数を減らすmidimsgnum--;midimsg_cursol++;}} //出力バッファへ書き込む。outL[i] = volume * (float)((rand() % 256) -128) / 255.0f;outR[i] = volume * (float)((rand() % 256) -128) / 255.0f;}} // MIDIメッセージを処理するメンバー関数// processReplacing()の前に必ず1度だけ呼び出される。// VstInt32 MyMidiSampleVST processEvents (VstEvents* events){// MIDIのリストを初期化します。midimsgnum = 0;memset(midimsgbuf, 0, sizeof(MidiMessage) * MIDIMSG_MAXNUM); // VSTイベントの回数だけループをまわす。int loops = (events- numEvents);for (int i = 0;i loops; i++){// 与えられたイベントがMIDIならばmidimsgbufにストックするif ((events- events[i])- type == kVstMidiType){VstMidiEvent *midievent = (VstMidiEvent*)(events- events[i]); midimsgbuf[midimsgnum].deltaFrames = midievent- deltaFrames;midimsgbuf[midimsgnum].message = midievent- midiData[0] 0xF0; // MIDIメッセージmidimsgbuf[midimsgnum].channel = midievent- midiData[0] 0x0F; // MIDIチャンネルmidimsgbuf[midimsgnum].data1 = midievent- midiData[1]; // MIDIデータ1midimsgbuf[midimsgnum].data2 = midievent- midiData[2]; // MIDIデータ2midimsgnum++; // MIDIメッセージのバッファがいっぱいの場合はループを打ち切る。if (i = MIDIMSG_MAXNUM){break;}}} // 1を返しておくreturn 1;} VST Tipsトップページへ 同一カテゴリのTips 項目 No. 概要 MIDIメッセージ処理 No.1 MIDIメッセージ処理で最小構成の自作VSTに追加する変数・関数 No.2 VSTの初期化とMIDIメッセージ処理関連の変数の初期化 No.3 ホストアプリケーションからMIDIメッセージを受け取る方法 No.4 MIDIメッセージをprocessReplacing()関数中で処理する方法 No.5 MIDIメッセージ処理で作成したVSTのサンプルソースコード全体(暫定版)
https://w.atwiki.jp/puyokei/pages/835.html
ty制作の行き場のないMIDIを置いておく場所です。 PC閲覧者は下のほうへスクロールし、「添付ファイル一覧」から再生したいファイルをクリックして下さい。 ダウンロードは構いませんが、再配布は自己責任でよろしく。 制作者の想定している音源は「YAMAHA AC-XG WDM XG Synth」です。 それ以外の音源の場合、想定しないアレンジがなされる場合があります。 指定した音源で試聴すると原曲に近くなります。 「Dolls」 tyが作曲したMIDI。RPG用の曲。 特にこれといった特徴のない曲なのです。 主旋律はコードから連想して作ったのでかなり適当。 歌詞は募集してなくもない。 「K」(BUMP OF CHICKEN) まだMIDIをさわり始めたくらいの頃に制作したもの。 音楽会用に楽譜を買ったのだが、曲の変更により楽譜の存在意義がなくなったため制作。 最初に完成したときより何十回という修正が加えられて現在に至る。結構手間がかかってる。 ここに上げたバージョンは実は一つのパートを消去したものであり、そのパートはニコニコ動画に上がっている「MIDIアニメ」で見ることができる。 「Sticker of Puyopuyo」(ぷよぷよ) 初代ぷよぷよ、ぞう大魔王~ルルー戦で流れる曲。SEGAアレンジ版は「Request from Puyopuyo」。 SFCの音を再現するのを諦めてJ-POP調に音色を大幅アレンジした曲。 結構前に作っていたものの、音量調節を怠っていたため掲載が遅れた。1ループで終わっていたのも理由の一つ。 今回掲載にあたって放っておいた音量を調節し直し、4ループにしてみた。 「クラウンカジノ」(スーパーマリオRPG) 正式曲名は『ちょっとドキドキ』らしい。呼びやすいからファイル名はこれ。 RPGと銘打ってるにも関わらず参考にしたのはNewスーパーマリオブラザーズ(DS)のミニゲーム。 この曲はマリオシリーズでも結構多く出てるとか出てないとか。初出はマリオ3だし。 「プレリュード零式」(ファイナルファンタジーシリーズ) ファイナルファンタジーでおなじみの曲。 ストリングスのパートはFF4のメロディーを基準に多少アレンジ。 象徴とも言えるアルペジオは16分ディレイを無駄に3回もかけてみた。 ちなみにタイトルの「零式」はこれの前にディレイが1つだけの「プレリュード改」、 ストリングス修正前の「プレリュード」があり、FF7のバハムートにあやかって「零式」と付けた。要は「3」。 「下水道」(ロマンシング サ・ガ) 通称「世界一カッコイイ下水道」。元々はフィールドマップ用のBGMだったらしい。 ちなみにこのゲームはバグが異常に多いことで有名。 後ろのピコピコが…すんごい多くて疲れた… ちなみに主旋律は原曲ではサックスだがMIDIではトランペット。 「決戦」(ファイナルファンタジーVI) FF6の中ボス戦で流れる曲。いくら何でも中ボスにしては格好良すぎるだろう。 オルガンの音が一台だと聞こえづらいので二台用意して同時発音することで音量調節。 ちなみにこの手法は他の曲でも結構やってたりする。
https://w.atwiki.jp/wiki1_test/pages/3032.html
foobar - test. ul foobar/結 foobar/予 foobar/baz/bazzy ls a b baz/bazzy 予 結 ... ,,,
https://w.atwiki.jp/nicoratch/pages/520.html
概要 DJ TECHTOOLSで製作・販売されているアーケードゲーム筐体用ボタン(三和電子製)を使用したMIDIコントローラー。日本ではSTOKYOが代理店を務める。 Midi Fighter Classic DIYがコンセプトになっており自分で組み立てる製品である。(販売店舗によっては組立てサービスを行なっている所もある)当初“Classic”の名称は無かったが、Midi Fighter 3D等後続モデル販売に従い区別のため追加された。 +スペック表・Midi Fighter Classic 価格 15.000円前後(新品) Midi Fighter解説 http //www.stokyo.jp/?mode=f7 DJ TECHTOOLS Midi Fighter http //www.midifighter.com/ Midi Fighter 3D ●主な特長 16個の発光するハイパフォーマンス・アーケードボタンを使用 アーケードボタンの色をソフトウェアで完全コントロール可能 6 Axis モーションセンサー搭載 本体サイドには6つのファンクションボタンを配置 バンクボタンで即座に4つのモードを切り替え可能 MIDI を使用可能な全てのソフトウェアとの互換性あり USB バスパワーで動作 ドライバーのインストール不要 持ち運びに便利なコンパクトデザイン Remix Deck にも対応 ユーティリティソフトウェアで簡単にカスタマイズ 様々なマッピングをダウンロード可能 ブラック ホワイト +スペック表・Midi Fighter 3D ■ 必要システム MAC:OSX 10.6 以上 PC:WINDOWS XP SP3以上 USB:USB ポート2.0 ■ 本体サイズ・重量 縦:150mm 横:150mm 高さ:55mm 重さ:450g 内容物 MIDI FIGHTER 3D 本体 USBケーブル オーナー証明書 保証書 クイックスタートガイド ■価格 30.000円前後(当時) Midi Fighter 3D http //www.midifighter.com/#3d-features Midi Fighter Pro 4×4のボタンはもちろん、4つのバンクコントロールボタン、2つのスライダーと2つのエンコーダーノブが付いている。加えて、Ableton LiveにダイレクトにMIDIマッピングが行えるようになり、よりアクティブなライブパフォーマンスが期待できる。 Limited Edition(全50ユニットの限定品) ブラック ホワイト BEAT MASHER CUE MASTER SUPER KNOB +スペック表・Midi Fighter Pro Key Features Robust metal casing Chip proof surface High performance arcade buttons Bright blue LEDs MIDI controllable mode buttons Rugged faders and knobs Smooth high performance surface Analog controls send super knob values out of the box Digital buttons send super combo values out of the box Trade in program for existing Midi Fighter owners 価格 $349.99 MIDI FIGHTER TWISTER プッシュスイッチとLED装備が装備された16のロータリーエンコーダーを搭載したコントローラー。 ブラック ホワイト +スペック表・MIDI FIGHTER TWISTER Technical Details Features 16 high resolution encoders with integrated push switch and LED feedback. 6 side mounted function keys Highly portable form factor USB bus powered - no wall adapter required. Size + Weight Product Weight - 1.2 lbs | 0.55 kg Product Dimensions - 6 x 6 x 2.3 inches | 154 x 154 x 57 mm Shipping Weight - 2 lbs | 0.91 kg Shipping Dimensions - 8 x 8 x 4 inches | 200 x 200 x 100 mm 価格 $219.99 MIDI FIGHTER TWISTER http //www.midifighter.com/#twister-features MIDI FIGHTER 64 カスタマイズ可能な超高輝度のLEDを装備した64個のボタンが搭載されたコントローラー。 ブラック ホワイト +スペック表・MIDI FIGHTER 64 Key Features Specs Customizable, animated LED color rings Class compliant Size - 10x10x1.75 inches Weight - 3.28 pounds Connections USB B Type B - High reliability connector USB Powered - No wall socket required USB MIDI Class Compliant - No drivers required for Mac or PC Requirements Windows 7® (32/64 Bit) or higher Pentium®/Athlon® XP 1.8 GHz OR Core™2/AMD Athlon™ X2, 2 GB RAM Mac OS X® 10.10 or higher, Intel® Core™Duo 1.66 GHz, 2 GB RAM USB 2.0 port 価格 $499.00 http //www.midifighter.com/#64main
https://w.atwiki.jp/evangame_2nd/pages/24.html
よくRPGツクールはMIDIまわりのトラブルが多いと聞きます。 このページでは、MIDI関連の情報を記載する予定です。 MIDI関連のトラブル 有名なのは音化け(全部PIANO化)や無音、音程やエフェクトのかかり具合の異常等です。 ググって見たところこれらの多くの問題は、Harmony.dllの仕様によるもののようです。 RPGツクール2000 ver1.51以降 及び 2003 ver1.06以降 Harmony.dllの仕様変更にともない、トラブルが激減しました。 また余談ですが、BGM(Music)にmp3ファイルの使用も可能となりました。 上記のバージョンを使っている場合、トラブルは回避されると思います。 RPGツクール2000 ver1.50以下 及び 2003 ver1.05以下 闘グラフィック表示の優先順位の仕様の変更等で過去のバージョンを分けてインストールしていらっしゃる方もいると思うので掲載しておきます。 なぜ音化けが起こるのか RPGツクール200xでは「Harmony.dll」というファイルを使用し、MIDIデータの再生を管理しています。「Harmony.dll」は曲の再生と同時に自動的にGM Level 1で音源をリセットする仕様になっているようです。 ところが、多くの場合、MIDIファイルに初期化メッセージ(エクスクルーシブ)を挿入されています。これはMIDI製作者にとって常識だからです。 結果、「Harmony.dll」の音源の初期化処理とMIDI側の初期化処理が、ほぼ同時に行われてしまい、PC(又は音源)が処理し切れずにその後に配置してあるイベントまでもが無視されてしまうわけです。 一般的に初期化信号のあとには、トラックごとの情報(Program Change、Control Change等)が格納されているため、これらが送信されないと、全てのトラックがピアノのままになってしまいます。 補足 「Harmony.dll」は曲の再生と同時に音源のリセット(GM)をかけるのですが、 その後、一番最初のノートイベント(音符)迄を高速処理しているものと思われます。 MIDI創作者が曲の先頭にリセットを挿入していない場合には音化けしないのはその為 でしょう。 しかし、この高速処理の為に音源のリセット中に音色が指定されてしまい、上記の様な 事態を引き起こしていると考えられます。 対策 アップデートしてバージョンアップする 最も簡単かつ安全。だが他の仕様も変わるので注意。 音源初期化のエクスクルーシブを削除する トラックの初期化情報は当然残します。 MIDIデータ先頭(Meas 0 Tick 0000)にベロシティ0の無音ノートを挿入 補足にあるように、、一番最初のノートまで高速再生しますから、データの先頭に ノートイベントがあれば、高速読み込みは無効となります。 ですが、曲の読み込み速度が若干落ちる可能性もありますので注意してください。
https://w.atwiki.jp/vst_prog/pages/75.html
トップページ MIDIメッセージを処理するVSTについて ここでは最小構成のVSTで作成したVSTを基にMIDIメッセージにあわせて動作するVSTを作成する。 作成するVSTはロードされると常にノイズを発生させる(音量注意)。このノイズのボリュームをMIDI CC7でコントロールできるVSTを作成する。 最小構成のVSTのソースコード全体はここにある。 MIDIメッセージを処理するに当たって最小構成のVSTに以下の追加を行う。 受け取ったMIDIメッセージを確保するための変数の追加 ホストアプリケーション(Cubase,Sonar等)からのMIDIメッセージを上記変数に保存するprocessEvents()関数の追加 processReplacing()関数内に受け取ったMIDIメッセージを処理するコードの追加 なお、ここに記載している内容についてはMIDIメッセージについてある程度の知識があることを前提としている。 また、ここで作成するVSTサンプルのソースコード全体はここにある。 MIDIメッセージ用の構造体の定義 まず始めにMIDIメッセージ用の構造体を定義する。 MIDIメッセージ用の構造体ではMIDIメッセージ・チャンネル番号・MIDIデータ1・MIDIデータ2に加え、MIDIメッセージの処理タイミングを示すVstInt32型の変数を定義するとよい。 (MIDIメッセージの処理タイミングを示すVstInt32型の変数の詳細は後述。) 具体的には以下のようになる。 struct MidiMessage{VstInt32 deltaFrames; //MIDIメッセージを処理するタイミングunsigned char message; //MIDIメッセージ番号unsigned char channel; //MIDIチャンネルunsigned char data1; //MIDIデータ1unsigned char data2; //MIDIデータ2}; VSTのクラス定義 続いてVSTの基本となるクラスを作成する。 最小構成のVSTに、先ほど定義したMidiMessage型のバッファとホストアプリケーションからMIDIメッセージを受け取るためのprocessEvents()関数を追加で定義する。 具体的には以下のようになる。 #define MIDIMSG_MAXNUM 255 class MyMidiSampleVST public AudioEffectX{protected int midimsgnum; //受け取ったMIDIメッセージの数MidiMessage midimsgbuf[MIDIMSG_MAXNUM]; //受け取ったMIDIメッセージを保管するバッファ // ノイズのボリュームfloat volume;public MyMidiSampleVST (audioMasterCallback audioMaster); // 音声信号を処理するメンバー関数virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames); // MIDIメッセージをホストアプリケーションから受け取るためのメンバー関数VstInt32 processEvents (VstEvents* events);}; 次へ 同一カテゴリのTips 項目 No. 概要 MIDIメッセージ処理 No.1 MIDIメッセージ処理で最小構成の自作VSTに追加する変数・関数 No.2 VSTの初期化とMIDIメッセージ処理関連の変数の初期化 No.3 ホストアプリケーションからMIDIメッセージを受け取る方法 No.4 MIDIメッセージをprocessReplacing()関数中で処理する方法 No.5 MIDIメッセージ処理で作成したVSTのサンプルソースコード全体(暫定版)
https://w.atwiki.jp/rhythm-machine/pages/20.html
CMU-800のMIDI化 以下のRJBさんの記事を追試しただけです。 RJBlog CMU-800MIDI改造ドキュメント