約 3,104,264 件
https://w.atwiki.jp/mahjlocal/pages/2718.html
読み ミディおんいき 正式名称 別名 和了り飜 満貫(門前のみ) 牌例 1235671西一二三四五ロン4 解説 色Aで12345671、字牌1枚(10オクターブ)色Bで12345(C9~G9)で成立。 成分分析 MIDI音域の72%は魂の炎で出来ています。MIDI音域の20%は夢で出来ています。MIDI音域の6%は信念で出来ています。MIDI音域の1%は株で出来ています。MIDI音域の1%はお菓子で出来ています。 下位役 上位役 複合の制限 採用状況 参照 外部リンク
https://w.atwiki.jp/tokimekicn/pages/1470.html
MIDI POWER PRO.4 ~ときめきメモリアル~ 科乐美发售的本社游戏的MIDI音乐集系列,本辑中收录的是心跳回忆中的部分曲目。 CD信息 MIDI POWER PRO.4 ~ときめきメモリアル~ 发售时间 1997年9月26日 发售方 科乐美 销售方 King Record 主要演奏者 矩形波俱乐部 CD编号 KICA 7791 售价 3873日元 曲目信息 收录曲目 花に囲まれて ~望、花壇で出会う~ プラネタリウム ~プラネタリウムでデート~ 戦闘メドレー あれは何だ!?~敵との遭遇~痛い目見るゼ~ザコと戦闘~番長は俺だ!~番長と戦闘~ 昇り龍乱れ七変化 ~花火大会~ 遊園地メドレーwith ジャンク屋 ゴースト達の宴~ゴーストハウス~失神寸前~絶叫マシンビビール~ジャンク屋~ジャンク屋ショッピング~ 中央公園 ~中央公園でデート~ What are you talking Christmas Medley ホワイトクリスマス~詩織、ホワイトクリスマス~冷えた体を温めて~魅羅、コートを借りる~ クリスマス独りぼっち~孤独なクリスマス~ Epilogue 告白 回想 Psyth (non stop mix) POWER Disc内收录曲目 花に囲まれて (SC-88Pro) プラネタリウム (SC-88) 戦闘メドレー (SC-88) 遊園地メドレー (SC-88) 中央公園 (SC-88Pro) 简介 不知为何,这张CD里各曲目的标题非常暴走,长度惊人,中二气质十足…… 相关页面 CD目录 音乐
https://w.atwiki.jp/nicoratch/pages/1130.html
概要 3Band EQを搭載しUSBメモリ使用可能なDJコントローラー。virtual dj同梱。 スペック表 lnput microphone (jack/XLR),headphones 2_0 full speed built-in sound card,DAC sampling rate from 8kHz, 16kHz,44.1 kHz to 48kHz with 16bit resolution,Dynamic range 88db THD+N-79dB~84dB Unit dimensions 484*320*91 mm(W*D*H) Unit weight 3.8kgs MIDI 18A http //www.wjtch.com/content/?39.html
https://w.atwiki.jp/marowiki/pages/564.html
目次 【時事】ニュースMidi Musical Instrument Digital Interface 電子楽器デジタルインタフェース RSSMidi Musical Instrument Digital Interface 電子楽器デジタルインタフェース 口コミMidi Musical Instrument Digital Interface 電子楽器デジタルインタフェース 【参考】ブックマーク 関連項目 タグ 【時事】 ニュース Midi AKAI Professional、人気のUSB-MIDIキーボードコントローラーのグレーモデル「MPK mini Special Edition Grey」(BARKS) - Yahoo!ニュース - Yahoo!ニュース 連帯から生まれる新たなロックバンドのムーブメント black midi、BCNR……拡大続けるサウスロンドン・シーン中心に考察 - リアルサウンド MIDIキーボードを置いてるだけで、音楽作るモチベーションが高まるよね【Amazonブラックフライデー】 - GIZMODO JAPAN Studiologic、17鍵MIDI足鍵盤「MP-117」発売(BARKS) - Yahoo!ニュース - Yahoo!ニュース Raspberry Pi Picoを使ったMIDIキーボード自作キット「chromatoneminipico」、複雑なLED制御も可能 - AKIBA PC Hotline! フックアップ、星CMEのワイヤレスMIDIアダプターの複数セットを発売 - マイナビニュース Musicom LAB、プロ仕様をさらに極めたループ・スイッチャー&MIDIコントローラー「EFX MK-VI」(BARKS) - Yahoo!ニュース - Yahoo!ニュース 5000円のMIDIキーボードが楽しい!どこでも気軽に演奏できる(女子SPA!) - Yahoo!ニュース - Yahoo!ニュース MSX向けのMIDIインターフェイスカード自作キット「SCSG-MIF2」、カートリッジスロットに装着 - AKIBA PC Hotline! HOTONE、BluetoothとUSB接続に対応したコンパクトで堅牢なMIDIコントローラー「AMPERO CONTROL」(BARKS) - Yahoo!ニュース - Yahoo!ニュース MIDIケーブル ローランドが発売 エフェクター接続|あなたの静岡新聞 - @S[アットエス] by 静岡新聞 「iPhone 13 Pro」のオーディオ性能やMIDI互換性を検証する - AV Watch Akai Professional、MPC2ソフトウェアとの組み合わせでMPCワークフローを実現する第二世代モデル「MPC Studio」(BARKS) - Yahoo!ニュース - Yahoo!ニュース BOSSブランドより、3.5mmステレオミニプラグを採用したMIDIケーブル - マイナビニュース 70年代の記憶が蘇る Strymonから多彩なサウンドメイクが楽しめるマルチディメンショナル・フェイザー「Zelzah」(BARKS) - Yahoo!ニュース - Yahoo!ニュース ソニーCSL、“自分っぽいメロディー”を生成できる無料のAI作曲支援アプリ「Flow Machines Mobile」(PHILE WEB) - Yahoo!ニュース - Yahoo!ニュース BLACK MIDI、ジャパン・ツアーが延期に - Skream! Dos Monosが崎山蒼志やブラック・ミディ(black midi)ら参加の『Dos Siki 2nd Season』を発表、9月に自主企画Theater Dの開催も - Mikiki 世界初のワイヤレス対応MIDIエクスプレッション・ペダルを発売 ~さまざまなMIDI機器を足元のペダルでコントロール。豊かな演奏表現を可能に~ - アットプレス(プレスリリース) 脳のニューロンが音楽を作る? 神経の信号をMIDIに変換すると心地よいメロディーに - リアルサウンド 【Amazonプライムデー】いいとこ取りのMIDIキーボード「KeyStep Pro」が、僕の知る限り最安値だ! - GIZMODO JAPAN 【Amazonプライムデー最終日!】25鍵MIDIキーボードが3,000円台、骨伝導ワイヤレスヘッドホンが30%オフとお買い得 - GIZMODO JAPAN 【江戸川区】居心地の良いカフェ『CAFE&BAR MiDI』(カフェ&バー ミディ)のコレが美味しい! - 号外NET 江戸川区 ブラック・ミディ(black midi)を聴くと〈もっとやっていい〉と思える。Dos Monos荘子it × 崎山蒼志 対談 - Mikiki black midi ──ブラック・ミディ続報です - ele-king.net interview with Black Midi ロンドンの新世代ロック・バンド、クラシックについて語る | ブラック・ミディ、インタヴュー - ele-king.net BLACK MIDI、2ndアルバム『Cavalcade』携え9月にジャパン・ツアー決定 - Skream! Black Midi - Cavalcade | ブラック・ミディ - ele-king.net いま話題のMIDIオルゴール「CANADEON PW40」。 シンセサイザー・プログラマーの第一人者・松武秀樹氏が提案する 新世代楽器の計り知れない可能性。専用アプリで演奏も - Stereo Sound ONLINE 【今週のマストチューン】black midi、Mustafa、NEHANN〜5月第5週〜 - Fashionsnap.com ブラック・ミディ(black midi)の新作を機に改めて考える新世代UKロックの熱い流れ - Mikiki 【Amazonタイムセール祭り】始めるなら今!USB MIDIキーボードが4,189円、ウクレレが2,439円とお買い得 - Lifehacker JAPAN black midiのニューアルバム『Cavalcade』より最新シングル“Chondromalacia Patella”が本日公開! - Qetic テキストに書いたコード進行を演奏・MIDIファイルとして出力できる「TexChord 2」 - 窓の杜 black midi ──UKロック最前線、ブラック・ミディ入魂のセカンドが登場 - ele-king.net black midi(ブラック・ミディ)|無尽蔵の音楽隊列が戦慄の速度で駆け抜ける!次世代のカリスマ衝撃のセカンド・アルバム - TOWER RECORDS ONLINE - TOWER RECORDS ONLINE ピアノの演奏動画から楽譜を自動作成 ディープラーニングで 京大が技術開発 - ITmedia XSONIC、MIDI/USB/リレー/Bluetoothでデバイスを自在にコントロールできるフットコントローラー「AIRSTEP」&「AIRSTEP Lite」 - BARKS スマートコントロール、オートマッピング機能搭載88鍵ハンマーアクション・USB MIDIコントローラーM-AUDIO HAMMER 88 PROをリリース - Dream News CME、手軽にワイヤレスMIDI環境を構築できるアダプター第2弾「WIDI Jack」、外部電源供給でより多くの機器に対応 - BARKS 分解してコンパクトに持ち運べる!サイレントギターとしても楽しめるMIDIギター「Jammy G」|@DIME アットダイム - @DIME 音を操る指輪だと…? 手の動きで音を変化させる指輪型Midiコントローラー「Neova」 - GIZMODO JAPAN Nektar、演奏性を重視した61鍵/49鍵セミウェイテッド鍵盤搭載のUSB MIDI コントローラー「Impact GXP61」「Impact GXP49」 - BARKS 空中で手を動かし音を変化させる 指輪型MIDIコントローラ - AV Watch 引出構造を採用したHTPCケース「MIDI Project S」がオリオスペックでセール - AKIBA PC Hotline! ボタンを押すだけでコードを演奏——MIDIコードコントローラー「Chordmonger」 - fabcross ボタン式クロマティックアコーディオンを模擬したMIDIキーボード自作キットが入荷 - AKIBA PC Hotline! ★新商品★「Jammy G」ギターの演奏技術だけであらゆる楽器の音を奏でられるMIDIギター【様々な音色に対応/サイレント/折り畳み/ポータブル/高感度センサー】 - PR TIMES 「TR-808」や「MIDI」の開発秘話を描いた書籍の発売が決定 | クラベリア - clubberia PC版『ノスタルジア Op.3』プレイレポ─MIDIキーボードで誰でもピアニスト気分! 『BEMANI』のダークホースはトップに躍り出るか - インサイド 2台のMIDI機器間のワイヤレス接続やiOS/Mac、BLE機器との接続をサポート、CMEからワイヤレスMIDIアダプター「WIDI Master」登場 - BARKS M-AUDIO KEYSTATIONシリーズ最新USB MIDI キーボードコントローラーKEYSTATION 88 MK3発売のご案内 - Dream News ジョイスティックを39本利用したMIDIコントローラ - PC Watch ローランド、MIDIを無線化。電子楽器とiPadをBluetooth接続 - AV Watch ローランド、PCやiOS機器と無線接続して音楽制作が行えるMIDIツール - マイナビニュース 電子楽器とパソコンやiPadを無線接続して音楽制作/演奏できるワイヤレスMIDIツールを発売 ~独自技術で音の遅れを感じない、安定した動作のワイヤレス接続。より快適で自由な音楽制作や演奏を実現~ - アットプレス(プレスリリース) Blackstar、コンパクトで柔軟な設定ができる6ボタンMIDIフットコントローラー「Live Logic USB MIDI Controller」 - BARKS MIDI 1.0 規格書(日本語翻訳版)が国立科学博物館の「重要科学技術史資料(愛称:未来技術遺産)」に登録 - PR TIMES 夏休みの自由研究 - MIDI 楽器を作ろう (プログラミングと音楽と) - 後編 - builders.flash - 変化を求めるデベロッパーを応援するウェブマガジン | AWS - amazon.com IK Multimedia、オーディオアウトを備えたコンパクトな25鍵MIDIキーボード「iRig Keys 2 Mini」 - BARKS 次世代型モバイルMIDIキーボード「iRig Keys 2 Mini」、IK Multimedia国内代理店フォーカルポイントから! - PR TIMES MIDI対応電子楽器同士をワイヤレスで接続する「mi.1 Cable」登場 - BARKS 電子楽器同士をワイヤレスMIDI接続する「mi.1 Cable」の先行販売開始 - Dream News 夏休みの自由研究 - MIDI 楽器を作ろう (プログラミングと音楽と) - 前編 - builders.flash - 変化を求めるデベロッパーを応援するウェブマガジン | AWS - amazon.com black midi(ブラック・ミディ)|新曲「Sweater」と隠しトラック「7-eleven」を収録した限定盤12”を発売 - TOWER RECORDS ONLINE - TOWER RECORDS ONLINE フランスJoueのクラウドファンディングMIDI電子楽器に廉価版が登場 - TechCrunch Japan X68000向けの新作MIDIボード「midiori v2.2」が入荷、税込10,780円 - AKIBA PC Hotline! 1台で12トラックMTR、USBオーディオ/MIDIインターフェース、DAWコントロールに対応したサウンドクリエイターのためのデスクトップツール『Model 12』を3月27日より新発売 - PR TIMES Bluetooth MIDIは本当に遅延が大きい? 測定して比べてみた - AV Watch MIDI 1.0がMIDI 2.0へ待望のアップデート。規格書が完成、公開へ - PR TIMES MIDI規格が「MIDI 2.0」に進化。双方向通信や繊細な表現が可能に - AV Watch 38年ぶりにバージョンアップした「MIDI 2.0」によって音楽制作はどう変わるのか? - GIGAZINE IK Multimediaの次世代型MIDIキーボード「iRig Keys 2 Pro」、「iRig Keys 2」を国内代理店フォーカルポイントが発売! - 日刊工業新聞 black midi(ブラック・ミディ)数量限定ロゴTシャツ&激レアのライブ盤CDセットがタワーレコード限定で12月13日に発売 - TOWER RECORDS ONLINE - TOWER RECORDS ONLINE 電子ドラムが熱い中国、斬新なMIDIキーボードも。巨大展示会Music Chinaを見た - AV Watch black midi初来日インタビュー|彼らが世界に衝撃を与えたその理由を紐解く - Qetic 本格&おもしろシンセ集結! 空き缶のMIDI楽器、クマ型リズムマシンがMaker Faireに - AV Watch WaveBlaster互換のMIDIドーターカードをUSB音源化するキットが入荷 - AKIBA PC Hotline! ブラック・ミディ(black midi)『Schlagenheim』に聴く、恐れ知らずのロック・サウンド - Mikiki ブラック・ミディ(black midi)『Schlagenheim』と日本文化の奇妙でイビツな親和性 - Mikiki interview with Black Midi 自分自身を解体するアート | ブラック・ミディ、インタヴュー - ele-king.net MIDI Provocateur ──〈トラフィック〉からスタイリッシュなダンス・プロジェクト、ミディ・プロヴォケイターがデビュー - ele-king.net iPad/iPhoneがオシロスコープやMIDIモニターに! 2つのアプリで音を簡単測定 - AV Watch 歌声が楽器になるMIDIコントローラー「Dubler Studio Kit」--声でリアルタイム制御 - CNET Japan MIDI、38年後バージョンアップの「なぜ」?:NAMM 2019 - ITmedia 次世代MIDI「MIDI 2.0」発表、互換性維持しながら演奏の表現力向上 - AV Watch MIDI 2.0、始動 今も使われる電子楽器規格が38年後のバージョンアップ - ITmedia 一般社団法人音楽電子事業協会(AMEI)とThe MIDI Manufacturers Association (MMA)が「MIDI 2.0」の開発・規格化および実装作業を進めていくことを発表。 - PR TIMES 【懐パーツ】DTMを築き上げたMIDI音源の銘機「ローランド SC-88VL」 - PC Watch 「MIDIのゴッドファーザー」と呼ばれた男と、彼が遺した「TR-808」というレガシー - WIRED.jp TR-808、JUPITER-8、DTM、MIDIを生んだ梯郁太郎氏が死去 - ITmedia 【プレイバック2016】Bluetoothで“ワイヤレス演奏”できる「BLE-MIDI」への期待と課題 by 藤本健 - AV Watch ステージ映えする不思議な形のMIDIコントローラ「Mune」 - CNET Japan 音楽電子事業協会、MIDI 1.0規格書を無償ダウンロード提供 - PC Watch 柔らかいパッドで音楽を作る新型MIDIコントローラ「CMG」--日本企業が開発 - CNET Japan 【藤本健のDigital Audio Laboratory】 第669回 Bluetooth MIDI伝送で何ができる? 対応5製品とiPad連携などを試す - AV Watch ヴィンテージ楽器から最新技術まで、MIDIの歴史と未来に触れるイベント「Think MIDI ~MIDIがつなぐ時代と音楽~」レポート - BARKS 【藤本健のDigital Audio Laboratory】 第653回 Android 6.0でオーディオ/DTM機能はどう変わった? ハイレゾやMIDI対応をチェック - AV Watch 「ようこそヴェルディくんの部屋へ 」 MIDI音が流れる“ホームページ”にファン驚き - ITmedia MIDIシーケンサーと仮想音源を接続できるようにする仮想MIDIポート「loopMIDI」NOT SUPPORTED - 窓の杜 Musical Instrument Digital Interface BOSS、ギター/ベース用エフェクターのMIDI接続に最適なケーブルを発売(BARKS) - Yahoo!ニュース - Yahoo!ニュース BOSS、ワイヤレス対応MIDIエクスプレッション・ペダルを発売 - BARKS 屋外での演奏に最適なバッテリー駆動アンプが新機能を備えてBOSSブランドで登場 - アットプレス(プレスリリース) 「Enhancia」の指輪型ウェアラブルMIDIコントローラーの輸入販売を開始 - アットプレス(プレスリリース) ローランド、PCやiOS機器と無線接続して音楽制作が行えるMIDIツール - マイナビニュース 電子楽器とパソコンやiPadを無線接続して音楽制作/演奏できるワイヤレスMIDIツールを発売 ~独自技術で音の遅れを感じない、安定した動作のワイヤレス接続。より快適で自由な音楽制作や演奏を実現~ - アットプレス(プレスリリース) MIDI 1.0 規格書(日本語翻訳版)が国立科学博物館の「重要科学技術史資料(愛称:未来技術遺産)」に登録 - PR TIMES MIDI 2.0、始動 今も使われる電子楽器規格が38年後のバージョンアップ - ITmedia 【懐パーツ】DTMを築き上げたMIDI音源の銘機「ローランド SC-88VL」 - PC Watch 「MIDIのゴッドファーザー」と呼ばれた男と、彼が遺した「TR-808」というレガシー - WIRED.jp 音楽電子事業協会、MIDI 1.0規格書を無償ダウンロード提供 - PC Watch 電子楽器デジタルインタフェース ヤマハ 電子ドラム『DTX10シリーズ』『DTX8シリーズ』 - PR TIMES パソコンやスマホ直結で手軽に宅録やDTMを楽しめる!オーディオインターフェースいらずでボーカルやギターの録音ができるUSBケーブル、マイクとシールドの2タイプを新発売 - PR TIMES ソニー、体の動きで電子楽器にエフェクトをかける「MOTION SONIC」クラファン開始 - マイナビニュース RSS Midi #gnews plugin Error gnewsは1ページに3つまでしか使えません。別ページでご利用ください。 Musical Instrument Digital Interface #gnews plugin Error gnewsは1ページに3つまでしか使えません。別ページでご利用ください。 電子楽器デジタルインタフェース #gnews plugin Error gnewsは1ページに3つまでしか使えません。別ページでご利用ください。 口コミ Midi #bf Musical Instrument Digital Interface #bf 電子楽器デジタルインタフェース #bf 【参考】 ブックマーク サイト名 関連度 備考 Wikipedia ★★ 関連項目 項目名 関連度 備考 研究/音楽 ★★★ 研究/シンセサイザー ★★★ 研究/電子楽器 ★★★ 研究/デジタル ★★★ 研究/創作 ★★★ タグ 創作 冒頭へ
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/kakis/pages/1826.html
midiit /// / ミディート メテの使徒オキニスの支配地 \ sid \ [ kirs ] \ メテの使徒オキニスの支配地 \
https://w.atwiki.jp/nicoratch/pages/1135.html
概要 3Band EQとオーディオインターフェイスを搭載した2chDJコントローラー。Virtual DJ LE同梱。 スペック表 Rec, Master and Booth RCA outputs Balanced XLR output 1/4" and 1/8" (3.5mm) headphone out with volume control XLR and 1/4" mic input with mic volume control Unit dimensions 360*260*70mm (W*D*H) Unit weight 2.0kgs MIDI-7 http //www.wjtch.com/content/?38.html
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のサンプルソースコード全体(暫定版)