RSS Twitter Facebook


« 2012年12月 | 2013年01月のアーカイブ | 2013年02月 »

2013/01/31

IEでFlashプログラムをデバッグする時の罠


私もActionScriptでそんなにガリガリ書いてはいないので、その道のプロからすれば常識なのかも知れないのですが、IEでFlashのデバッグをする時はキャッシュの挙動を理解していないと結構はまります。

ActionScriptのコードを書き直してコンパイルしてリロード、しても何故か直らない。おっかしいなあと色々いじくりまわしている内にいつの間にか直っていて結局何が原因だったのか良くわからない状態になったり、というパターンですね。

要するにFlashプログラムを新しくコンパイルしても古いキャッシュがブラウザに残っているという単純な話なんですけど、じゃあいつ更新されるのかというと...

 (1)IEを起動しなおすと更新されます(ただし後述(8)インターネットオプションがデフォルトの時)
 (2)開発者ツール(F12)で「キャッシュ」-「常にサーバーから更新」が設定されているとリロードするだけで更新されます。
 (3)ただし「常にサーバーから更新」設定はIEを起動しなおすとチェックがはずれてしまいます。
 (4)その他のリロード、CTRL+リロード、F5、CTRL-F5、CTRL-Rなどでは更新されません。
 (5)ただし開発者ツール上でのCTRL-R(「ブラウザキャッシュを消去する」)ならば更新されます。
 (6)「ツール」-「閲覧の履歴」で一時ファイルを消しても更新されません
 (7)Adobeのサイトで案内されている方法「SWFファイルのキャッシュを防ぐ方法」はどれも効きません。(追記:方法の3番目はembedタグじゃなくてobjectタグ側をいじると更新されますが、いずれにしても毎回HTMLを変更する必要があり、あまり実用的ではないです)
  http://helpx.adobe.com/jp/flash/kb/228621.html
 (8)インターネットオプション-全般の閲覧の履歴、インターネット一時ファイルが「Webサイトを表示するたびに確認する」の場合は単にリロードするだけで更新されます。

私が把握しているのはこんな所です。実際のところ更新する方法は結構色々あるんですが、とにかくパターンが入り組んでいるのでちゃんと理解していないと駄目ルートばっかりループしかねないです。特に(4)(6)あたりはやばいですね。

たぶん一番使われるパターンは(1)で確認の時は起動しなおす、という方法ですが何回もやっているとだるくなってきます。開発者ツールの設定もいちいち切り替えるのがどうも面倒。いっそ(8)のインターネットオプションを切り替えておくのが確実ですけど、常用ブラウザとしては駄目でしょうね。

結局(4)のパターンでボタンとかキーとかから一発で消せる方法がない、というのが諸悪の根源な気がします。

特にJavascriptは普通にリロードするだけで最新状態で走りますので、Javascriptメインで使っている人がたまにActionscriptを書こうとした時とかは罠にはまりやすいのではないかと思います。ご注意を(と、自分が散々はまった後で...)

posted by g200kg : 2:24 PM : PermaLink

2013/01/29

Audio Data APIシミュレータ


Firefoxの AudioDataAPIのシミュレータを作ってみました。
これを入れるとIEとかOperaとかのオーディオ系APIが使えないブラウザでそれらしい動作をする、というものです。

ブラウザのオーディオ系アプリ環境は充実しつつあるのですが、とにかくIEで動かない事には誰でも使えると言える状態にはならないですね。残念ながらIE10でもまだオーディオAPIはサポートされていないので、結構先の話になってしまいそうなのがもどかしいです。という事でまだ実験的なものですけどやってみました。

Audio Data API仕様

■なぜ今更 AudioDataAPI なのか
すでにFirefoxもWebAudioAPIへの対応を表明していてAudioDataAPIは消え去る運命ですが、WebAudioAPIはかなり規模が大きいので、ちょっと作ってみるというわけには行きません。AudioDataAPIは非常にコンパクトですので、試すにはちょうど良いです。

■構造
 音を出すのはFlash経由でJavascriptのインターフェイスをかぶせてあります。サポートしているのは動的な音の合成で使う3つの関数だけです。oggなどのHTML上のリソースからデータを読むようなインターフェイスはありません。

■仕様など
 ・Flashプラグインがインストールされている必要があります。
 ・サポートしている関数
   mozSetup() 初期化
   mozWriteAudio() データ書き込み
   mozCurrentSampleOffset() 現在の再生位置取得
 ・また音関係ではFloat32Arrayを多用しますがIE9ではサポートされていないため、普通のArrayに割り当てます。さらにバッファの制御で使用するsubarray()はslice()に置き換えていますので、一般的なAudioDataAPI用のスクリプトはパフォーマンスはともかく大体そのまま動作するのではないかと思います。
 ・Flash側の仕様により最終出力は44.1KHzになりますが、リサンプリングしますのでAudioDataAPI側からは48KHzを指定しても構いません。ただし補間など一切しませんのでかなり荒れた音になります。
 ・ステレオのデータを突っ込んでも出力はモノラルになります。

■パフォーマンスなど
 無理やりやっていますので、音がぶつ切れになるなど結構問題があります。ぶつ切れを軽減するためにバッファも大きめですのでレイテンシーも大きくなっています。ActionScript<=>Javascript間のインターフェイス部分がやはりかなりつらいですね。本当はこれの上にさらにWebAudioAPIのレイヤーをかぶせてやりたい所なのですが、努力の割りに悲惨な事になるかも知れません。

■使い方
 ・adapisim.js と adapisim.swf をHTMLと同じ場所におきます。
 ・HTMLのbodyの最初に次の行を追加します。


<script type="text/javascript" src="adapisim.js"></script>

・また、ChromeなどWebAudioAPIをサポートしているブラウザではAudioDataAPIを動かしたくない場合は次の行をその前に入れます。

<script type="text/javascript">adapisim_DisableIfWAAPIAvailable=true;</script>

ファイル:
adapisim.js
adapisim.swf

Flashのソース:
adapisim.as
adapisim.mxml

■使用例
・Mozilla WikiにあるAudioDataAPIのチュートリアル(tonegen)にadapisimを追加したもの
ToneGen

・WebBeeperにadapisimを追加してみました。これはWebAudioAPIがある場合にはそちらを使います。
WebBeeper

■結果
 音を出す事に全力使って凝った事をやらなければなんとかならなくもない、という程度ですかね。
 まあ1行追加するだけで音が出るようになるという意味はあるかも知れません。
 なんとか実用レベルまで逝ければよいのですが、改善の余地があるかどうかはわかりません。

posted by g200kg : 6:27 PM : PermaLink

2013/01/25

戦闘力をデシベルであらわしてみる


いわゆる戦闘力インフレーションと言われる現象知ってますか?
バトル物のアニメなんかでストーリーが進むにつれてどんどん強い敵が現れてきて、強さの基準が何だか良くわからなくなるというあれです。よくネタにされている代表格はドラゴンボールだと思いますが、なにせ戦闘力が数値化されてますのでネタにもされやすいようです。ちょっと抜粋してみましょうか。

この数字が本当に正しいかどうかはわかりませんが世の中には色々数字を検証されている人がいるので、検索しつつ適当に抜粋しました。

鉄砲を持ったおっさん5
初期亀仙人100
悟空416
ラディッツ1,500
クリリン最強時30,000
ギニュー120,000
フリーザ530,000
悟空超サイヤ人150,000,000 (1億5000万)
18号1,300,000,000 (13億)
セル完全体15,000,000,000 (150億)
悟空超サイヤ人240,000,000,000 (400億)
悟空超サイヤ人3120,000,000,000 (1200億)
ブウ最強時600,000,000,000 (6000億)

おそらく作者としても想定以上の長期に渡る作品になってインフレーションに歯止めがきかなくなったのではないかと思いますが、作品中に数字を出しちゃったものでインフレぶりが目に付きやすいですね。桁が違いすぎて何となく一律に扱いにくいです。

という事でこういう場合はデシベルで表すのが定石です。自然界ってそういうもんでしょ。

とりあえず基準点を決めます。初期亀仙人を基準点として「0dB亀」としてみます。
そしてデシベルの計算は

dB亀 = 20 × log10(X/A) でAの部分が初期亀仙人の戦闘力=100になります。

※ちなみに「戦闘力」と言うくらいだから電力的なものかとも思うのですが、敢えて信号レベルなんかで良く使う電圧をあらわす場合の式になっています。電力なら20 × log10(X/A)じゃなくて10 × log10(X/A)なんですけどね。まあ戦闘力はスカウターでリモート測定してますし、何かの圧力センサー的なものなんだろうと解釈するという事で。

戦闘力dB亀
鉄砲を持ったおっさん5-26.0
初期亀仙人1000
悟空41612.4
ラディッツ150023.5
クリリン最強時3万49.5
ギニュー12万61.6
フリーザ53万74.5
悟空超サイヤ人1億5000万123.5
18号13億142.3
セル完全体150億163.5
悟空超サイヤ人2400億172.0
悟空超サイヤ人31200億181.6
ブウ最強時6000億195.6

はい、随分扱いやすくなりました。これで3桁くらいに収まったので0が何個あるか数えなくて済みます。

この「dB亀」は初期亀仙人に対して何倍くらい強いかを対数的にあらわします。6dB違うと2倍強いんですけどね。

例えば「鉄砲を持ったおっさん」と「フリーザ」の差が100dBくらいですが、「ギニュー」と「セル完全体」の差も大体100dBくらいで近い値ですので、鉄砲を持ったおっさんがフリーザと戦った時の負けっぷりはギニューがセル完全体と戦った時の負けっぷりと同じくらいになる、という事ですね。

鉄砲を持ったおっさんからブウ最強時までダイナミックレンジは220dBくらいありますので、デジタルで表現するなら220/6 = 36.6... で37ビットくらいでなんとかカバーできそうです(正確には20*log10(2)=6.020...で割ります)。

まあインフレとか言われてますけど人間の感じ方も対数的と言われてますのでこうやってみると意外と自然な並びなのかも知れないですよ。人が聞き取れる最小の音とジェット機の轟音の間でも120dBくらいの差があるので宇宙的レベルの事象まで含めれば220dBのダイナミックレンジなんてどうって事ない...かも?

posted by g200kg : 3:17 PM : PermaLink

2013/01/24

NAMM 2013


さて、今年もNAMMショー始まりますねー。

事前情報もあって盛り上がってるのはやっぱり moog の Sub Phatty ですか。

http://www.moogmusic.com/products/phattys/sub-phatty
Moogの鍵盤付が$1099、と言われりゃ買ってみるか、って人は結構いるんだろうな。

ハード関係の製品はともかく、私としては気になるのはやっぱりiOS系がプラットフォームとしてどんな勢力を作っていくのかと言う所ですかねえ。別にiOS推ししてるわけではなく、身の振り方考えなきゃ的な意味で...。

とりあえずこの辺チェックしとく
Rock oN Company ショー・レポート!NAMM 2013

posted by g200kg : 5:54 AM : PermaLink

2013/01/19

アップローダーの運用を停止しました


著作権をクリアしていないと判断されるファイルが散見されるようになったため、残念ながら数日前から音源アップローダーの運用を停止しています。無制限にアップロードできる場を作るとなると起こりがちな問題かと思いますが、なかなかこういうのは難しいです。

ニコニコ動画やYouTUBEがJASRACと包括契約を結んだというのがニュースになってから結構経ちますけど、あれにしても許諾されている範囲がどこまでなのか一般にはほとんど理解されていないのではないですかねえ。ニコニコ動画が原盤利用まで手を付けかけているのは頑張るなあと思いますが、結構泥沼な世界ですよね。
音楽著作物及び音楽原盤の利用に関するガイドライン

自分で作曲したものを公開したい、というニーズよりもカラオケで歌ったりしたものをちょっと聴いてもらいたいという凄くカジュアルなニーズの方が桁違いに多いのは当然とは思いますが、今のところこういうニーズを満たすものは「歌スキ動画」とか「DAMとも動画」くらいしかなさそうです。

posted by g200kg : 8:15 AM : PermaLink

2013/01/17

なんてこった。またしても椅子が...ぶっ壊れたり直したり...


オカムラの「バロン」って椅子を使ってるんですがね...

以前ぶっ壊れて修理してもらった事があったんですよ。
なんてこった、椅子が・・・ぶっこわれた

それがまた再発して座面のメッシュがはずれるというまったく同じ壊れ方をしてしまった。別に体重が200kgあるとかいう事ではないからね。
これは何か使い方に問題があるのだろうかとしばし考えるも、しょうがないので再びサービスに電話して2回目だと伝えるとずいぶん恐縮されてしまった。

そして、「今は改良も進みまして、もう同じ壊れ方はしません!」とずいぶん力強い言葉が。
検索すると同じような事例がちらほらと出てくるのでロットによって弱い部分があったのだろうなとは思う。

アーロンほど高いわけではないけどそれなりの値段のものなので頑張ってほしいです。
ちなみにオカムラって上大岡の隣の岡村地区に本社があるんですね。椅子界の大御所がこんな近くにあったのかとなんとなく応援しているのであった。


という事で数日椅子がないのだが、それも困るのでとりあえず何か対策をと思ってやってみたら意外といい感じになってしまった方法。

まず電線を用意します。

力づくでメッシュをはめてからさらに電線をすきまの溝にドライバーで押し込んでいきます。

これでなんか結構いけてる感じになってしまった。
今回は修理頼んだけどもし次に再発したらもうこれでいっちゃってもいいかと思うくらい。

posted by g200kg : 8:30 AM : PermaLink

2013/01/16

WebSequencerからSynth1を鳴らしてみる



とてもややこしい事になっていますが、順番に行くと、まずWebMidiLinkからWeb MIDI API経由でローカルPCのMIDIデバイスを鳴らす「MidiDevDrive」というものを作りました。


なお、Web MIDI APIはまだネイティブサポートでなく今のところシミュレータ「WebMIDIAPI Shim」ですので、この動作のために「Jazz-plugin」も必要です。

そしてSynth1は簡易VSTホストのCantabileに読み込んで、仮想MIDIケーブルのLoopBe1でMidiDevDriveとCantabileを接続します。仮想MIDIケーブルは色々ありますが64bitOSサポートを明記しているLoopBe1を使用します。これでWebSequencerで打ち込んだシーケンスがSynth1で鳴りますね。

接続は下の図のようになります。

まあまだ全然実用的ではないですが、こんな事もできるという事で。
使用したもの:
Cantabile : http://www.cantabilesoftware.com/
Synth1 : http://www.geocities.jp/daichi1969/softsynth/
LoopBe1 : http://www.nerds.de/en/loopbe1.html
WebSequencer : http://www.g200kg.com/websequencer/
MidiDevDrive : http://www.g200kg.com/webmidilink/mididevdrive/
WebMidiAPIShim : https://github.com/cwilso/WebMIDIAPIShim
jazz-plugin : http://jazz-soft.net/
伴奏用
MSDrum : http://aikelab.net/msdrum/
GMPlayer : http://www.g200kg.com/en/docs/gmplayer/

posted by g200kg : 11:07 AM : PermaLink

2013/01/14

雪...


これは...積もる...

そして4時間後このような状態に...

posted by g200kg : 10:07 AM : PermaLink

2013/01/13

最近のDTM用語アクセスランキング


まだ多少パラメータなど調整していますが「偏ったDTM用語辞典」に用語へのアクセスTOP10を入れるようにしてみました。

直近のアクセスほど重み付けを加算するような形で算出していますが、大体過去半日から1日分くらいのアクセス量に影響される感じではないかと思います。


posted by g200kg : 10:44 PM : PermaLink

2013/01/11

MovableTypeアップデート


MovableTypeを MTOS 5.0.4 から MTOS 5.2.2 にしました。
デフォルト状態ではMTIncludeタグが使えなくなっているので、mt-config.cgiに

>AllowFileInclude 1

を追加。とりあえずこれだけで問題なく移行できた模様。

WordPressにしようかという考えもなくはないのだが、MTタグに慣れてしまっているのでなあ。パーマリンクの移行とかも面倒そうだし...。たぶん当分MTOS。

posted by g200kg : 12:40 AM : PermaLink

2013/01/09

440Hz=A4なのかA3なのか


オクターブの表記がメーカーによってズレているというのは割と知られた話で、一般的にはヤマハ系は 「440Hz=A3」 その他は 「440Hz=A4」という分類になってたりするのですが、別にヤマハだけが孤立しているわけではなく結構混沌とした状況です。

440Hz=A4は米国ASA(Acoustical Society of America)が標準として提唱していて「国際式」と呼ばれますが、絶対これにあわせなきゃという雰囲気でもないんですね。MIDI規格的に言えば中央Cはノートナンバー60とだけ定められていて、これを「C3」と表記するか「C4」と表記するかという問題で演奏データがズレるわけではなく単に表示上の問題だけなのであまり気にされていないという事かも知れません。

それで最近気がついたのはImageLineのFLStudioでは 「440Hz=A5」 となっている事です。そうだったのか!

国際式の根拠となったのが楽器の代表である88鍵の鍵盤上でマイナス表記が発生するのは好ましくない、として88鍵の最低音が「0」表記になる440Hz=A4を採用したらしいのですが、おそらくImageLineとしてはMIDIのノート番号上でマイナス表記が出ない440Hz=A5にしたのではないかと思われます。ImageLineのgol氏あたりはいかにも言いそうですね。


FLちゃん、最低音は「C0」

という事で勢力分布的にどうなってんのかなと思って調べてみるとこんな感じ。DAW製品ではこの状況を鑑みて表示の切り替えができたりするものもありますがこれはデフォルトの状態です。いや、「440Hz=A3」全然孤立してないじゃん、DAW関係ではなかなか健闘してるよ。

440Hz=A5:FLStudio
440Hz=A4:国際式、Roland製品(Sonar)、ProTools、SSW、Reaper、Korg製品
440Hz=A3:ヤマハ製品(Cubase)、Logic、Reason、StudioOne、Live

ちなみにヤマハとしては用語のページにちょっと開き直りっぽいこんな記載もあったり。用語 Hz

別にそんなに困らないしどっちでもまあいいか。

ついでにこのページに追記:
MIDI技術情報 - 6.MIDIノートと周波数の関係

posted by g200kg : 6:03 PM : PermaLink

WebSequencerアップデート


どこに向かっているのかという気がしないでもないが、WebSequencerにトラックのオーバービューとかイベントリスト表示とかを追加。

数値入力はとりあえず表示だけなので、ガツガツ数値入力できるわけではないのだけど、そういう方向の需要がまだあるんだったら、そっち方向もありかなと思ったりもするのだが...どうだろう?

後Web MIDI API経由でローカルPCのMSGSとかハードウェアMIDI音源とかを鳴らせるようにすれば、ひと昔かふた昔前のネイティブのMIDIシーケンサーくらいの所までは能力的にはいけてしまうのではないかなあ。

そもそもムーアの法則が今どうなってるのかは良くわからないけど、2年で性能2倍として今のPCは10年前のPCの32倍くらいの性能はあるはずなのでスクリプト言語とは言えJITコンパイラ付だし同等くらいの性能は出そうではあるね。

唯一不利なのはオーディオ系処理がタイムクリチカルな所で、こればかりはスクリプト系言語では不得意と言わざるを得ないかな (まあ、似たような話はDOSからWindowsに移行する時もあったのでそのうち問題にならなくなっちゃうのでしょうけど)。

WebSequencer

posted by g200kg : 8:14 AM : PermaLink

2013/01/07

WebBeeper 2A03 C++版


WebMidiLink用にJavascriptで書いた簡単なシンセWebBeeper2A03に以前@mohayonao氏がコメントを付けてくれたのですが、今度はそれをもとにMatsushima氏がOpenFrameworksのアドオン ofxRP2A03 としてC++に移植してくれました。

githubにてMITライセンスでの公開になっています。
https://github.com/shintaro4

シンセと言えるほどの構成も持っていないものすごく単純なものなんですが、その分ソースはとても短くて把握しやすいと思いますので、楽器プログラミングを始めてみたいという方のとっかかりには良いのではないでしょうか。

ちなみに「RP2A03」というのはNES (ファミコン)に搭載されていたリコーのチップの型番です。完全にちゃんとエミュレーションしているわけではないのですが、特徴的な階段状三角波や矩形波デューティの選択肢など大体の雰囲気は合わせてあります。

それから「OpenFrameworks」はオーディオ・ビジュアルなどのアート系作品を簡単に作るためのC++ライブラリで、プログラマよりもコンテンツクリエーターにとっていかに使いやすくするかという方向にフォーカスされているという事です。
時々名前を聞くし、こいつにはちょっと興味はあるのだけど、中身を把握するまで手が回っていない...。

http://openframeworks.jp/

posted by g200kg : 7:16 PM : PermaLink

2013/01/06

Webアプリの多言語対応って


もしかしてブラウザで勝手に翻訳してもらえば、何もしなくて良いんじゃない?
って思って翻訳してみたら結構惜しい事になった。

もう少し翻訳の精度が上がれば本当にローカライズ作業なんか不要な環境になっちゃうのではないかなあ。
Javascriptからcanvasに書いてる奴とかは何とかしないといけないけどね。使う文字列はHTML上にid付けてリソースとして置いておけばいけるんかな。

ドキュメントなんかを日本語で書くだけで済ませられれば凄く楽になるんだがな。

posted by g200kg : 5:45 PM : PermaLink

2013/01/03

WebSequencerでMIDIキーボードのリアルタイム録音


さて、WebSequencerでMIDIキーボードからのリアルタイム録音を実験的に実装してみました。録音じゃなくてとりあえずWebシンセをMIDIキーボードで鳴らしたいという場合にも結構役立つかも知れません。

ブラウザでMIDIを扱う「Web MIDI API」はまだブラウザがネイティブにサポートしていませんので、プラグインでMIDIをサポートする「Jazz plugin」のインストールが必要になります。これとWeb MIDI APIをシミュレートする「WebMIDIAPIShim」の組み合わせでMIDIキーボードからの入力が可能になります。

使い方はWebSequencerのページの「使い方の詳細」を見てください。


WebSequencer

Web MIDI API
Jazz-soft
WebMIDIAPIShim

posted by g200kg : 4:21 PM : PermaLink

2013/01/02

Renoid!?


Renoise-Gateのサトーさんが「Renoid」と言う何やら面白い取り組みをされています。

簡単に言えばボーカロイド的な事をRenosieのインスツルメント(XRNI)やサウンドフォント(SF2)でできるようにするというもので、ポイントは日本語のひらがなの各音をノートに割り振っちゃてる所ですね。これだけだと棒読みになってしまうので、後ろにピッチシフター(Keroveeとか)を繋いで音程はそっちでコントロールするという組み合わせになります。

※ちなみに「Renoise」はMODトラッカー由来のフリーな(すみません間違えました。無償のデモ版では機能制限があります)DAWで最近の機能の充実ぶりは結構凄いです。が、まあこの「Renoid」は「Renoise」本体とは別にどんなDAWでも使えるようなものを目指しているらしいです。

ボーカロイドのようなものをDAWで使えるようにする場合はどうしても歌詞入力関係をどうするかというのが問題になりますが、これならちょっと入力に苦労するかも知れませんが何とかなりそうです(更にRenosieで使う場合にはひらがな⇒ノートの入力支援ツールも準備されているようです)。
サウンドフォントなら再生できるサンプルプレーヤーが色々あるのでどこでも使えますね。

またボイスファイル本体としてはサトーさん自身の声(!)を元にしたスターターパックの他にUTAU用ライブラリを提供している方の協力で何種類かが準備されています。

Renoid
Renoise-Gate

posted by g200kg : 9:34 PM : PermaLink

2013/01/01

今年もよろしくお願いします


平常運転すぎるけど年末からWebSequencerをいじっていて、少し使い方の説明とかを書き足しました。
WebSequencer

ついでにWebMidiLink対応シンセのテスト用のページを作りました。コマンドを手動で1つずつ送れるので動作確認用に。
WebMidiLink Test

タイミングを逃してしまいましたが、こちらは@offset_shin13氏が作ってくれたWebModularによる除夜の鐘のパッチ。
http://t.co/jZyyvhFp

書初め。

posted by g200kg : 5:01 PM : PermaLink

« 2012年12月 | 2013年01月のアーカイブ | 2013年02月 »


g200kg