YAMAHAのMidRadio Player
にはXGlite相当のSoft Synthesizerが搭載されていますが、Linuxではwineのもとでは不安定です。
そこで、MidRadio.exeなしに使えるようにしてみました。要はVSTi Pluginを使えるようにしたわけです。
MIDIのイベントのhandlingが不完全なので、beta版です。
使う前に、LinuxMidRadio/src/midiplay[67].shで使用するDLLと初期化関数名(通常はmain)を指定して下さい。
詳しいことはソースを読んで下さい。
unhandled exceptionで終了する場合は、*.cppの#define BUFSIZE 0x10000
の数値を更に大きくすることで対処して下さい。ただし、この数値の上限は不明です。
VSTについてはMaking VST plugins with MinGW / MSYSを参考にして下さい。
midiplay6.sh #!/bin/sh export set SGP_DLL="/tmp/YAMAHA/MidRadio Player6/Addins/SGP.DLL" export set PROC=main export set ALSAPLAY="aplay -f FLOAT_LE -r 44100 -c 2 -" if [ "$1" = "" ]; then echo $0 midifile exit fi ./test6 "${SGP_DLL}" ${PROC} "$1" | ${ALSAPLAY}
teru@server ~/src/wine/LinuxMidRadio/src $ ./midiplay7.sh ~/midis/The\ Legend\ Of\ Heroes\ V/ED5GM118.MID Using /tmp/YAMAHA/MidRadio Player7/Addins/SGP2.DLL(main) file:/home/teru/midis/The Legend Of Heroes V/ED5GM118.MID [time_base = 480] [micro_tempo = 1500000] 再生中 raw データ 'stdin' : Float 32 bit Little Endian, レート 44100 Hz, ステレオ 0000fd03|0000f7a1|00000562| 0} [micro_tempo = 400000] 000197b2|00019642|00000170| 0}
LMR 1.0.0 for Wine/x86
uname -iはi386である必要があります。winegcc/wineg++が必要です。ちなみに、winegccバイナリは?.exe.soですが、?で実行します。
LMR 2.0.0 for Wine/x86
Freeverb+NReverbを組み込み、デフォルトのSampling Rateを96kHzに、
出力フォーマットをSigned 32 Bit Little Endianにし、
簡易的コンプレッサを追加しました。
以上のversionに関して、内蔵ソフトシンセサイザーに関する情報は不明。おそらくS-YG20相当だと思われる。
GSデータもほぼ代替発音される。S-YG20の仕様を参考までに。
-音源方式ウェーブテーブル合成
-最大同時発音数32音(SGP.DLLでは64音)
-音色数359楽器音+11ドラム/SFXキット
-フィルター各音毎の時変動フィルター
-エフェクトリバーブ11種類、コーラス11種類、バリエーションなし
-サンプリング周波数44kHz
-対応MIDIフォーマットXGlite/GM1/GM2/TG300B
リズム演奏用Channelがおかしいことがある。
SC-88 SC-88Pro SC-8850などの、SC-55より新しい機種のGSデータは殆んど代替発音されない。
-対応MIDIフォーマット XG Lite、GM1
-最大同時発音数32音
-音色数361ノーマルボイス + 12ドラムキット
-エフェクトタイプ リバーブ×17、コーラス×17
もしかしたら、sxgbnw6l.tblにあるUTGという文字列は、大昔のTGシリーズのことかもしれません。
1.0.0.20の時のバグが直され、GSも代替発音されるようになりました。
XGWorks STまたは
SOL2に附属しています。
Wine上でインストール作業を行なって、ライセンス情報がRegistryに入力されている必要があります。
-音源方式 AWM(ウエーブテーブル合成)
-最大同時発音数 128音(CPUの性能に依存)
-演奏パート数16パート
-音色数676音色+21ドラムキット/SFXキット(XGモード:480音色+11ドラムキット/SFXキット)
-演奏モード XG/TG300B
-サンプリング周波数 44.1KHz/22.05KHz/11.025KHz
-出力16ビットステレオ
-エフェクト3系統(リバーブ×11タイプ、コーラス×11タイプ、バリエーション×43タイプ)
S-YXG50 VSTi体験版自体はSOL2体験版かXGWorks ST体験版の中に入っています。
体験版の制限は以下の通りです。
==S-YXG50をご使用の際、周期的に音が出なくなり、10分後には完全に音が出なくなります。
==プラグインし直せば再度音は出ますが、使用期限経過後は使用できなくなります。
単体で買えないのは残念かもしれません。
完全にVSTiを実装していません。
MidRadio Player附属のSGP.DLL/SGP2.DLLがどの程度VSTi Pluginに準拠するかは不明です。
MidRadio Player 7以降ではGSデータをサポートしないようです。
pmidiのmidread.cを正しく使っていません。
少なくとも公開されている情報のみに基づいて作っているので、
SystemExclusiveの扱いが正しいかは不明です。
また、MidiEventFrame間隔の境界上でのイベントが正しくHandleされないことがあります。
テンポが変化する時のMidiEventFrameのhandlingに問題があるため、テンポ変化時に
いくつかのEventが無視される事があります。
MidRadio Player 7で一新された内蔵音源や如何に?
MidRadio Player 6 内蔵音源への誘い
Kobarinのホームページ - KbMedia Player
kbsmaf.kpiはMidRadio PlayerのOCXを利用しているようです。
Delphi VST sdk
VSTi開発概要
THE Yvan Grabit DEVELOPER RESOURCE (SDK入手先)
Frieve (Music Studio ProducerはVSTを扱えます。)
MUSIC eCLUB(ミュージックイークラブ) MidRadio Player Download
Player's Paradise MidRadio Player Download
SGP.DLL/SGP2.DLLは、audioMasterGetVendorStringが"YAMAHA"を返す、
SOL2や
XGworks ST
などのYAMAHA製VSTiホストアプリケーションで使用できることが確認されています。
この場合、*.tblはDLLと同じ場所にあることが必要です。使用する場合は*.tblも同時にコピーする必要があります。
MidRadio Playerでは、VSTiのDLLを、SGP.DLL(MidRadio Player6)またはSGP2.DLL(MidRadio Player7)
に変更してAddinsフォルダに入れることで、SGP.DLL以外のVSTiを利用できます。(例:S-YXG50.DLL、Hyper Canvas.DLL)
SGP2.DLLを改変して利用することは認められていないようです。
SGP.DLL/SGP2.DLL/S-YXG50.DLLは96kHzまではとりあえず正常に動く。
プシュケの屋敷 ... S-YXG50.DLL + libfreeverb
[96kHz][ogg]
使用無料MIDI素材「想い川」 ... SGP2.DLL + libfreeverb
[96kHz][ogg]
... S-YXG50.DLL + libfreeverb3 NReverb
[mp3]
<dazjorz> rindolf! <dazjorz> areth thou here? <rindolf> Hi dazjorz <dazjorz> :) <rindolf> dazjorz: yes, I are here. <dazjorz> isn't it kind of weird to have a programming channel when there are language specific channels around? <Zuu> Muhah! <rindolf> dazjorz: this is about programming in general. <rindolf> At least theoretically. <rindolf> And VB.NET questions. <joeyadams> Well, ##programming is a good place to ask C questions and actually get helpful answers :) <dazjorz> rindolf: did you intentionally make it look like vb.net is not programming? <rindolf> dazjorz: meet Zuu - he's into Windows and D and stuff. <dazjorz> ! <rindolf> dazjorz: no. <rindolf> dazjorz: VB.NET is programming. <dazjorz> hey Zuu, I'm dazjorz, I'm into linux and c and stuff. <rindolf> But it has its own channel. <Zuu> :> <dazjorz> rindolf: I've been thinking about changing nicks <rindolf> dazjorz: ah. so did I. * Zuu is into everything sane, except the boring stuff <rindolf> dazjorz: to what? <dazjorz> rindolf: my current one is waaaay too lame, but "sjors" is probably too generic <rindolf> dazjorz: I like dazjorz <dazjorz> rindolf: I don't, because when people see my name is sjors, da zjorz is just too lame to bear <dazjorz> rindolf: I was thinking about sjors, or some three-letter abbreviation of my name, sjg or so <Zuu> how about.... 'carrot' ? <dazjorz> I think I do prefer dazjorz over carrot <Zuu> no worries, i promise not to stuff you up rindolf's tomato nose <Zuu> hum :< <dazjorz> Zuu: when I first read your nick on Shlomi's site five minutes ago, I asked him whether you were a mix between Zorix and Buu <dazjorz> do you know the two? <rindolf> Zoffix and buu. <Zuu> nope <dazjorz> uh zoffix yeah <dazjorz> Zuu: okay, well, you don't know them, but believe me, I'm glad you're not a mix of the two, that would be horrible :P <Zuu> im a mix of much worse personalities im sure <Zuu> most of them just happen to cancel each other out -- Introudcing dazjorz to Zuu -- ##programming, Freenode * __you fart * __you say "oops" <rindolf> __you: heh * __you kick rindolf <__you> (rindolf, you're now being kicked by 435 people) <squeeks> __you need to go outside. <kspath> __you: Who owns you? * __you go outside * __you are pwned by dazjorz * __you is now known as we * we are having a useless off-topic conversation right now <rindolf> we: hahah * we we is now known as __you * __you decide this channel is now useless and decide to leave * simcop2387 is now known as we * we are not amused * __you and I are together simcop2387 * squeeks is now known as _I_ * _I_ need to tell __you something * __you listen * simcop2387 is now known as we * we need help * _I_ think we are getting a bit sick of the shenanigans <rindolf> I'm so making a fortune out of it. * we want to be on bash.org -- /me (or I, you or we) is finding it amusing -- #perl, Freenode