ラベル プログラム の投稿を表示しています。 すべての投稿を表示
ラベル プログラム の投稿を表示しています。 すべての投稿を表示

2019年8月20日火曜日

ProcessingのPythonモードでスペクトルアナライザーをつくる

ここ最近は『ジェネラティブ・アート』を読んでいました。Processingを使って偶然性に頼ったプログラムによるアートをしてみよう、という内容です。Processingだと簡単にビジュアルを生成できて楽しいですね。ツールの選び方として「作業だけに没頭できるか?」の観点は大事だな、と思いました。

今回はPythonで音楽ファイルを読み込んで再生時にアニメーションを表示する、スペクトルアナライザーを作ってみます。下の図みたいな動画でよく見かけるアレを作ります。『ジェネラティブ・アート』の前半くらいまでの内容と、オーディオを扱うためのライブラリー「Minim」の組み合わせで充分です。

ProcessingはJavaでコードを書くのが通常ですが、モードの切替えでPythonを使うこともできます。ただ、Pythonモードが実装されてから比較的に日が浅いからなのか、書籍もWebもPythonによるサンプルはあまり見かけません……。ライブラリーもサンプルはJavaだけが多いので、JavaのコードをPythonで読み替えていく作業が必要です(大したことではないけれど)。

コード

コード全体は下に載せてあるとおり。Minimは事前に追加されていることが前提です。音楽ファイルはProcessingのエディターにドロップしておく(プロジェクトファイルと同階層にフォルダーを作ってコピーされる)と、ファイル名だけを記述すれば良くなってラクです。

add_library('minim')

def setup() :
    # 初期化
    size(640, 480, P2D)
    background(0)
    smooth()
    
    # 音楽取込み
    global _minim
    global _player
    _minim = Minim(this)
    _player = _minim.loadFile('test.mp3')

    # 描画用変数
    global _width_pad    # 幅/y方向のウィンドウパディング
    global _height_pad   # 高/x方向のウィンドウパディング
    _width_pad = 20
    _height_pad = 80
    global _width_div    # 幅/y方向の分割数
    global _height_div   # 高/x方向の分割数
    _width_div = 30
    _height_div = 20
    
    global _cell_width   # セル幅
    global _cell_height  # セル高
    _cell_width = (width - _width_pad * 2) // _width_div
    _cell_height = (height - _height_pad * 2) // _height_div

    # 周波数解析
    #    10[Hz]〜サンプリングレートの1/2までをカウント
    global _fft
    global _log_band    # _width_divに応じた対数の帯域
    global _band_base   # 10[Hz]
    _fft = FFT(_player.bufferSize(), _player.sampleRate())
    _band_base = 10.0
    _log_band = pow((_player.sampleRate() / 2.0) / _band_base, 1.0 / _width_div)


def draw() :
    background(0)
    stroke(255)
    
    # セットアップ
    _fft.forward(_player.mix)
    translate(_width_pad, height - _height_pad)
    
    # 描画
    for x in range(_width_div) :
        # 列ごとの周波数帯域を計算して平均値を得る
        band_start = _band_base * pow(_log_band, x)
        band_end = band_start * _log_band
        spec_ave = _fft.calcAvg(band_start, band_end)
        
        # 対数[dB]に変換する
        signal = -100
        if spec_ave > 0.0 :
            signal = 20.0 * log(spec_ave/255) / log(10)
        
        # 高/x方向の分割数へマッピングする
        pile_num = map(signal, -100, 0, 0, _height_div)
        
        PileUpRect(_cell_width, _cell_height, 3, int(pile_num))
        translate(_cell_width, 0)


def PileUpRect(width, height, padding, quantity) :
    pushMatrix()
    # quantityの数だけセルを積む
    for q in range(quantity) :
        rect(padding, -padding, width - padding, padding-height)
        translate(0, -height)
    popMatrix()


def keyPressed() :
    # キーで再生オン/オフ
    if _player.isPlaying() == True :
        _player.pause()
    else :
        _player.play()

2018年5月13日日曜日

PythonでMIDIを扱えるようにpretty_midiを導入する

Pythonで楽譜を扱うのが面白いです。ABC記譜法であれば、楽譜を「文字」として扱えるのでPythonだと比較的にラクに処理できます。ただ、楽譜のインプットやアウトプットのことを考えるとMIDIファイルを扱えるようにしたほうが便利なように思えます。

pretty_midiを使う

PythonでMIDIを扱う場合、パッケージ『pretty_midi』をインポートすれば良さそうです。MIDIファイル内のトラックごとに、ノートをリストとして取得できるようになります。

インストールはpipコマンドだけで済むのでラクチン。

pip install pretty_midi

MIDIを読み込む

PrettyMIDI()でファイル名を指定すれば、あとはトラックとノートがリストで取得できます。

import pretty_midi

# MIDIファイルのロード
midi_data = pretty_midi.PrettyMIDI('test.mid')
# トラック別で取得
midi_tracks = midi_data.instruments
# トラック1のノートを取得
notes = midi_tracks[0].notes
for note in notes:
    # ベロシティー、ノートナンバー、
    # ノートオンタイム、ノートオフタイム
    # の順でノート情報が渡される
    print(note)

pretty_midiを使うときに注意しなければいけないのは次の事項でしょうか?

  • 基本的にTickではなく、時間で位置が管理されている
    ※Tickへ変換するメソッドが用意されている
  • 楽曲開始位置はアーフタクトが考慮されていない
  • 分解能は480Tickへ変換される

ABC記譜法では存在していた休符情報がMIDIでは在りません。機械学習で休符情報も欲しい場合はロケーションの差分を求めて、擬似ノートを置いてあげる必要がありますね。

2017年11月4日土曜日

AudioUnit V3の作り方を調べる

AudioUnit V2の作り方をまとめたので、今度はV3についても調べたことをまとめてみます。

AudioUnit V3?

AudioUnit V3は拡張子「.appex」を持つファイルで、「App Extension」という拡張機能を利用しています。V2とは違い特定のディレクトリーに格納しておかなくてもDAWが認識してくれます。

「どうやってインストールするのか?」というと、AudioUnit V3を含むアプリケーションを起動することで勝手にインストールされます。V2ではプラグイン単体で存在できていたのですが、V3からはアプリケーションの付属品という扱いに変わっているようです。1度起動してしまえば、他のアプリケーションからも参照できるようになります。

AudioUnit V3をアンイストールしたいときは、AudioUnit V3を含んでいたアプリケーションと合わせて削除しないといけないってことになります。

V2との違いはWWDC2015の動画で述べられています。

大きな変更点は次の2つでしょうか?

  1. macOS、iOSのどちらでも共通して使用できる
  2. プラグインが異常終了してもホストを巻き込まない

異常時にプラグインだけを終了できるって良いことですよね!

V3(App Extension)の詳細は公式ドキュメントが一番詳しいような気がします。

開発するには?

Xcodeでプロジェクト作成後、AudioUnitのApp Extensionを追加することでプロジェクトテンプレートが開きます。このテンプレートに追記してプラグインを開発します。

AudioUnit V3については、開発チュートリアルがとくにありません。

基本的には下記にあるサンプルコードを参考にプログラミングをするしかありません。サンプルコードはmacOSとiOSの両方のコードを含んでいるので、正直なところ読みづらいです……。

AudioUnit(App Extension)のテンプレートには、AudioUnitとして必要な処理すらも書かれていない状態です。テンプレート選択直後にビルドしてDAWに認識させることもできましたが、音が一切鳴りません。in/outやチャンネルの設定も開発者が書き込む必要があります。

テンプレート選択時には「これから作るのはエフェクターなのか、インストゥルメントなのか」を設定しますが、インストゥルメントを選んでもMIDIを扱うライブラリーを設定してくれるわけでもないようでした……。

読みづらいけれどサンプルコードを改変してAudioUnitを作ったほうが、新規で作るよりも簡単かもしれません。

AudioUnit V3を新規に試しで作ってみて音が鳴るようになるまで四苦八苦しました……。その情報も追々まとめていこうと思います。

2017年11月3日金曜日

AudioUnit V2の作り方を調べる

LogicやGarageBandで使用できるAudioUnitを作ってみたくて、作り方を調べてみてました。情報があまりなかったので、わかったことをまとめておきます。

現在、AudioUnitにはV2とV3の2種類あります。何が違うのかはWWDC2015の動画がわかりやすいです。

今回はV2についてまとめてみます。

AudioUnit V2?

AudioUnit V2は拡張子「.component」を持つファイルです。「/Library/Audio/Plug-Ins/Components」にこのAudioUnitファイルを格納しておくとLogic ProなどのDAWがプラグインとしてロードしてくれます。

各メーカーが販売しているプラグインのほとんどはV2形式のようです。

チュートリアルがあるけれど……

AudioUnit V2には作り方のチュートリアルがあります。簡単なトレモロエフェクターを作る手順が載っています。

説明文は丁寧でわかりやすいのですが、最新のXcodeではAudioUnit V2用のプロジェクトテンプレートは廃止されているため、チュートリアルどおりには作成できません。Xcodeの画面も変わってるから、適宜読み替えも必要です。

作る方法はあるのか?

Xcodeから素直に作ることができないので、AudioUnit V2を作るためには次のどちらかの方法をとるしかなさそうです。

  1. 公式サンプルを改変する
  2. プロジェクトテンプレートを用意する

サンプルコードは下記のサイトで公開されています。V2のAudioUnitを作りたい場合は、ここからダウンロードしたサンプルを改変していくのが手っ取り早いかもしれないです。

プロジェクトテンプレートは、上記のサンプルコードを参考に自作することになります。探してみるとV2のテンプレートを公開してくれている人もいるので、有り難く使わさせていただくのも良いかもしれません。たとえば、こちらのブログとか。

2017年7月12日水曜日

Bloggerでカテゴリー別に記事を表示する簡単な方法について考える

ブログのトップからカテゴリー別の記事一覧をパッと表示できたら便利なのになーと思っていたところ、HTMLの編集で割と簡単にできたのでメモしておきます。

ページって機能があるんです

Bloggerには“内容をほとんど更新しないけれど、常に表示しておきたい記事”を「ページ」として特殊な記事を作成できます。サイトマップとかAboutを書くのに適してそうな機能です。ページ機能を使うとブログ上部にタブのようなものができて、簡単にページにアクセスすることができるようになります。

ただ、ヘルプページにもあるとおり“投稿をページとして使用することはできません”。ブログでよく書くカテゴリーの記事を一覧表示させたりするような使い方はできないのです。残念。

Bloggerでは、カテゴリー別に表示させるためには「ラベル機能」を使うように誘導されます。でも、ラベル機能はサイドバーにしか表示できないから、求めているものとはちょっと違う。スマホだとサイドバー見れないですし。

ページ機能のタブと同じ場所からカテゴリー別記事一覧に飛びたいんです。

HTMLを編集してみよう

ページ機能のタブをクリックすると、ページ記事に飛ばされるようになっています。ならば、タブをクリックした時のリンク先をラベル機能で記事を絞ったときの結果ビューに変えてやれば、求めている動きになるのでは?

以下、ページとラベルは既にあるものとして簡単に手順を書いていきます。試してみるときは、万が一に備えてブログのレイアウトをバックアップしておきましょう。壊れても自己責任。

まず、ラベル機能でカテゴリー別表示した時のURLをゲットします。

次にブログ管理画面からページ機能で、何も書かないページを追加します。タイトルはわかりやすいようにラベル名と同じにしておきます。

続いてテーマのHTML編集画面で、ページ部分に相当する箇所を探します。「title='ページ'」とか書かれているから探すのは簡単なはず(ページタイトルで検索すると速いかも)。見つけたらページのURL部分をラベル機能の結果ビューURLに置き換えます。

テーマの編集を終えて、ブログのタブを押してみると想定していた動きをしてくれるはず。欲を言えば、「ラベル○○の投稿を表示しています。」って文章を非表示にできると良いんですけれどね。

2016年12月24日土曜日

VOCALOID Editorで使用できるJobプラグイン APIを調べる

LUA言語を覚えるのも兼ねてJobプラグインを作ってみているけれど(コレとか)、「VOCALOID Editorで用意されているAPIって、もっとあるのでは? バージョンアップしてるのだし」と思ったので調べてみます。

APIを引き抜く

V3時代のリファレンスマニュアルによれば、LUAのグローバル変数【_G】にAPI名が一覧上に格納されているらしい。ここからAPI名っぽいものを探して引き抜くことにします。“探す”といっても、functionに該当するモノをfor文でクルクル回すだけなんですけどね。

for文を追加したJobプラグインを作成してVOCALOID Editorで実行すれば抜き出し完了。単純に抜き出しただけだと何故かLUA言語の関数も含まれていたので、VOCALOID APIっぽいもの(頭文字が「VS」)に絞ると、下記55個がヒット。

No.API名
1VSDlgAddField
2VSDlgDoModal
3VSDlgGetBoolValue
4VSDlgGetFloatValue
5VSDlgGetIntValue
6VSDlgGetStringValue
7VSDlgSetDialogTitle
8VSGetAudioDeviceName
9VSGetControlAt
10VSGetDefaultControlValue
11VSGetMasterTune
12VSGetMusicalPart
13VSGetMusicalPartSinger
14VSGetNextControl
15VSGetNextMonoWAVPart
16VSGetNextNote
17VSGetNextNoteEx
18VSGetNextNoteExpression
19VSGetNextStereoWAVPart
20VSGetNextTempo
21VSGetNextTimeSig
22VSGetNoteExpressionAt
23VSGetPitchSnapMode
24VSGetPreMeasure
25VSGetPreMeasureInTick
26VSGetResolution
27VSGetSequenceName
28VSGetSequencePath
29VSGetStereoWAVPart
30VSGetTempoAt
31VSGetTimeSigAt
32VSInsertControl
33VSInsertNote
34VSInsertNoteEx
35VSInsertNoteExpression
36VSMessageBox
37VSRemoveControl
38VSRemoveNote
39VSRemoveNoteExpression
40VSSeekToBeginControl
41VSSeekToBeginMonoWAVPart
42VSSeekToBeginNote
43VSSeekToBeginNoteExpression
44VSSeekToBeginStereoWAVPart
45VSSeekToBeginTempo
46VSSeekToBeginTimeSig
47VSSetMasterTune
48VSSetPitchSnapMode
49VSUpdateControl
50VSUpdateControlAt
51VSUpdateMusicalPart
52VSUpdateNote
53VSUpdateNoteEx
54VSUpdateNoteExpression
55VSUpdateNoteExpressionAt

新種?

抜き出したAPI55個の中で、気になったのは次の9個。「PitchSnapMode」はV4で追加された機能のはず。「NoteExpression」は何だろう? エクスプレッションピッチのことかな?

No.API名
1VSGetMasterTune
2VSGetNextNoteExpression
3VSGetNextStereoWAVPart
4VSGetNoteExpressionAt
5VSGetPitchSnapMode
6VSSetMasterTune
7VSSetPitchSnapMode
8VSUpdateNoteExpression
9VSUpdateNoteExpressionAt

元V3ユーザーとして気になったのは「MasterTune」と「NextStereoWAVPart」の2つ。

“MasterTune”ってことは、「全体の音程を調整できるってこと?」なのかと思って、VOCALOID Editorを見てみるとプリファレンスの[その他]に【マスターチューン】が追加されてました。いつの間にかできるようになってたんですね。

V3時代にはステレオWAVEファイルは1つしか取り込めなかったのですが、V4では複数取り込めるようになってました。1つのVSQXファイルで複数楽曲分のボーカルを作成できるようになったわけですね。そんな作り方はあまりしないでしょうけれど。。。利用シーンとしては、Aメロだけのオケ/Bメロだけのオケ/サビだけのオケをそれぞれ個別に取り込むような使い方ですかね? 1曲分フル尺でWAVEファイルを用意しなくてもよくなった、と。「VSGetNextStereoWAVPart」は次々にステレオWAVEファイルを参照するイメージでしょう、たぶん。

おまけ

API名を抜き出せたので、あとは使用方法を見つけ出さないといけないですね。「NoteExpression」については何を指してるのかも不明ですが。エクスプレッションピッチはVOCALOID Editorが自動で調整するパラメーターのはずだから、ユーザーが勝手に触れられないんじゃないかな?

2016年11月20日日曜日

Bloggerに音楽ファイルを貼り付ける方法を考える

音楽ファイルをBloggerに貼り付ける方法を変更したので、そのメモ書きです。

Blogger単体では無理

Bloggerでは画像については一括で管理して記事中に貼り付けることができます。でも、MP3のような音楽ファイルについては同様な機能が無くて、外部のサービスを使って参照するようにしないとダメ。これまでは『TmBox』に音楽を投稿して、そのリンクをブログ記事に貼り付けるようにしてました。

ところが、最近になって『TmBox』は仕様変更をしていたようで、自分のブログ記事を眺めてると音楽ファイルのリンクが途切れていたり、再生プレイヤーが非表示なってしまっていたり、とレイアウトが崩壊しているではないですか! どうやら外部サイトへの貼り付け機能も削除されてしまったみたいです。これは困った。。。実験的に作ってみた音源を貼り付けるのに便利だったのになぁ。

外部のサービスが仕様変更するたびにレイアウトに気を配るのはメンドウです。でも、わざわざ他サイトに移動してもらって聞いてもらうより、ブログ記事内で聞けるほうが便利だと思うので諦めたくもない。自分でコントロールできるようにするには、自サーバーを用意して、そのサーバーに音楽ファイルを置き、プレイヤーをブログに設置する、というのが良さそうです。最近だとHTML5のaudioタグを使うともっとラクチンになりそう。

DropBoxの出番

自サーバーを用意するのは大変なので、DropBoxの共有機能で代用してみることにします。次の手順でプレイヤーを設置できます。

  1. DropBoxに音楽ファイルを置く
  2. 音楽ファイルを共有設定オンにしてリンクを取得する
  3. ブログ記事内でプレイヤーを設置したい場所にaudioタグを置く
  4. audioタグの属性srcに音楽ファイルのリンクを入れる
  5. 音楽ファイルのリンクの末尾「?dl=0」を「?dl=1」に変更する

この作業を繰り返して全ファイルを移しました。思ってたよりファイル数が少なくて良かった。。。こんなかんじになりました。

おまけ

全てのブラウザでHTML5の対応がされているわけではないから、JavaScriptで場合分けする必要があるかもですね。IEに関してはバージョン判定するようにしてはいるけれど、それ以外は後々かな。

2016年8月28日日曜日

PITパラメーターを設定するJobプラグインを作成する

アナログシンセサイザーのオシレーターを2基重ねるときに、ピッチを調整するパラメーター[FINE]が“一致しているはずなのに一致していない”現象というのがあるそうです。デジタルみたく何段階とかガウス記号的な処理ができないために発生するのだそう。KORGのMS20 miniの紹介動画でそんなトークがされてました。

「VOCALOIDでもトラックを複製して[PIT]パラメーターを少しだけ弄ったら似たような効果が得られるんじゃないの?」と思ったので、やってみます。

残念だ。

VOCALOID Editorで[PIT]を調整しようと思ったのですが。[PIT]は-8192から8191までの大きい数字を設定できるようになっているせいで、画面上のマウス操作だと【1】とか小さい数字を入力できないんですね。どうしても2桁以上の値になってしまう。。。60インチとかの大画面なら1桁操作できるのかな?

Jobプラグインの出番

仕方がないので、好きな値に設定できるようなJobプラグインを作ります。

最終的には、もう少し使いやすいように「もう書き込んでる部分を反映するのか?」「選択範囲全域を上書くのか?」を選択できるようにしました。[GEN]バージョンを作ってみるのもいいかも。

試す

作ったJobプラグインを使って、ピッチを微妙に変えたトラックを重ねたときの音を聴いてみます。

[PIT]=11 あたりから「あぁ、ピッチがズレてるのね」のウネウネ感が出てきます。重ねてるのが分からない程度にするには1桁台~15くらいが良さそうです。[PIT]=600 くらいで重ねるとシンセサイザーみたいな面白い音になってきます。ロボットみたいな音になってくると調声がヘンでも誤魔化せそうw

サンプルボイスを置いておきます。最初から順番に「[PIT]=0」「[PIT]=7」「[PIT]=600」をメイントラックに重ねたモノです。あと、作ったJobプラグインも置いておくので、興味があれば試してみてください。


ダウンロードはこちら⇒DL:PITを変更するJobプラグイン

おまけ

PiaproStudioだとJobプラグインを使えないからVOCALOID Editorを経由しないといけないのがツライですね。。。

2016年8月24日水曜日

VOCALOID Jobプラグインの作り方を覚える

VOCALOID Editorで使用できる『Jobプラグイン』。「Jobプラグインは『Lua言語』というプログラム言語で作ることができる」とのことなので、夏季休暇の工作(?)のつもりでJobプラグインを作ってみることにしました。

Jobプラグインの中に必ず記述しなければならないモノは下記の2つ。この2つさえあれば、あとは自由に弄れる。Lua言語に用意されている関数、VOCALOID Editor側が提供している関数を駆使してノートやパラメーターを操作できる。

  • function main(processParam, envParam)
    Jobプラグインの心臓部。ここでノートやパラメータに効果を付与する。
  • function manifest()
    Jobプラグインの定義部。プラグインの名前やバージョンを記述しておく。

プログラム言語を勉強するとき、最初に作るのはやっぱりコレだと思うのです! Lua言語って文字列の扱い方が独特ですね! 面白い。

せっかくなので、作ったJobプラグインを置いておきます(DL:BowlRoll)。Jobプラグインのファイル(.lua)はただのテキストだから、テキストエディター(メモ帳とか)で中身を見ることができます。ムダにコメントを付けてみたけど、参考になるかな?

おまけ

今更になって気付いたこと。パートを選択するだけでなく、Musical Editorでノートをピアノロール上に表示していないとJobプラグインを実行できないんですね。この制約のせいで“Jobプラグインのできること”が減っているように思えます。たとえば、メインのトラックを複製してハモリを自動生成したり、トラック複製後にノートの発声タイミングをズラして輪唱を自動生成したり、みたいなことができない。そういうのが作りたい(ほしい)んだけどなぁ。

2016年7月24日日曜日

GUID 生成ツールの居場所をメモしておく

Windows10にする前は[すべてのプラグラム]からGUID生成ツールを直接起動できたような思い出があるのですが、気のせいでしょうか?ひとまず下記の場所に居たのでメモしておきます。

  • [C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\guidgen.exe]

「guidgen.exe」がPCにインストールされているということはVisualStudioもインストールされていると思うので、その場合はVisualStudio(2015 Community)のツールバー[ツール]→[GUIDの作成]でも起動できます。

GUID生成ツールなんて探し始めたのは、VOCALOID Jobプラグインが気になったから。VOCALOIDの販売サイトがリニューアルされたり統合されたりの影響なのか、APIリファレンスマニュアルが無くなってます。。。今後はVocaloid Editorと一緒にインストールされるJobプラグインを参考に読み解いていくしかないのかな?