2017年11月03日

「よろこびの歌」(宮下奈都/実業之日本社)

 音楽家を目指していたが挫折した女子高校生と、その周囲のクラスメイト達の群像劇。帯に書いてある「校内合唱コンクールを機に、頑なだった玲の心に変化が生まれる……」という紹介を見て、「ああ、合唱コンクールに向けてクラスが一つになっていく話ね」と思った人、あんたは甘い。そんな単純な話じゃない。まあ、とはいっても、最後は「クラスが一つになる」んだけどね。

(クリックすると Amazon の商品ページに飛びます)

 千夏ちゃんがいいね。ストーリーを動かしているのはこの子だ。玲の心を溶かしたのも、「16にして余生を生きる」中溝さんが生き方を変えたのも、「まとめ役」をひたすら演じていたひかりが春を追いかける気持ちになったのも、みんな千夏ちゃんがきっかけになっている。続編「終わらない歌」でこの子達の後日談が書かれているそうだから、そちらも読んでみよう。

タグ:読書
posted by toshinagata at 14:48| 日記

2017年10月21日

Alchemusica で LinuxSampler を使う

 AlchemusicaLinuxSampler を使ってみた。以前から使うことはできたんだけど、内蔵エフェクトが実装できて、「LinuxSampler の音だけドライ」というアホっぽい音作りはなくなりました。

20171021-1.png

 Bosendorfer の音でシマノフスキやってみました。

 YouTube にアップロードしてから気づいたけど、こんなのが6年前に公開されてました。思い切りかぶってしまった(苦笑)。まあ、音はこっちの方がきれいだけど、音楽的にはうちの方が上だと思う…

posted by toshinagata at 14:50| 日記

2017年10月14日

パソコンミニ来ました!

 パソコンミニ MZ-80C が来ました!

20171014-1.jpg

 念のため説明しておくと、往年の8ビットパソコン MZ-80C の筐体を 1/4 スケールで再現し、その中に Raspberry Pi model A+ を収めたもの。キーボードと画面は「飾り」だけど、USB キーボードと HDMI モニターを使えば、SmileBASIC が動作します。

 SmileBASIC は、Raspbian の上に乗っているのではなくて、単体で立ち上がります。いわゆるベアメタル。ソフトウェアの利用許諾とか、バックアップコピーの取り扱いとか、どうなっているのかなと思っていたのだけど、内蔵されているラズパイのボードと1対1に紐付けられているようで、他のラズパイでは立ち上がらないらしい。これは合理的なやり方だ。将来は SmileBASIC の単体発売をぜひ検討していただきたいものだけど、紐付けの作業が煩雑になってしまうかな。

 筐体は愛でましたが、機能的には大して意味はないので、内蔵のラズパイを取り出して、単体で動作させる。お気に入りの5インチ HDMI モニターです。本体と一体化できるので、配線が煩わしくならないのがいい。

20171014-2.jpg

 …と思ったのだけど、画面が正常に表示できていない。右端が切れている。エミュレーションモードだとさらに顕著で、画面の左と上に余分な空白があって、右と下が途切れている。

20171014-3.jpg

 どうも、フレームバッファは 1280x720 と認識しているが、表示は液晶の解像度の 800x480 でされているようだ。SmileBASIC の画面で見えている範囲が 40x30 文字のようなので。config.txt をいろいろいじってみたけど、解決できなかった。例えば次のように指定すると、表示は 800x480 で、1280x720 のフレームバッファを縮小表示してくれるはずなのだけど、"Segmentation Fault" で落ちちゃうんだよね。

hdmi_group=2
hdmi_mode=87
hdmi_cvt=800 480 60 6 0 0 0
framebuffer_width=1280
framebuffer_height=720
20171014-4.jpg

 なお、同じ設定で、拙作の Daruma BASIC ベアメタル版だと、正常に立ち上がって、設定通りの表示になります(2ピクセル=1ドット扱いなので、BASIC 上での解像度は 640x360 になっている)。Daruma BASIC は circle を元にしていて、たぶん変わったことをやっているわけではないので、Smile BASIC でも動作させる方法はあるはずだと思うんだけど。

20171014-5.jpg

 うーん残念。外付けの 10 インチモニタは坊に貸し出し中だし、しばらくはお蔵入りかな…。

posted by toshinagata at 22:24| 日記

2017年10月09日

Alchemusica: 内蔵エフェクトを実装中

 AudioUnit のプラグインとして使える音源の中には、エフェクタを内蔵していないものがある。顕著な例が Linuxsampler。Alchemusica は CoreAudio のグラフを作成してオーディオ信号を処理しているから、AudioUnit のエフェクトユニットが使えるはず。そこで、実装を開始した。

 何が面倒って、ユーザーインターフェイスなんだな。CoreAudio のグラフは非常に自由度が高いが、ここは割り切って、以下の仕様にした:「音源からのオーディオ信号を1つ以上のエフェクトユニットで順に処理する。複数系統のオーディオ信号を出せる音源の場合には、それぞれの信号を処理したあと、ミキサーでまとめる」。これだけ限定しても、自由度はまだ高く、ユーザーインターフェイスの設計は厄介だった。

 一応、こんな画面ができた。エフェクタのつながり方を保持するためのデータ構造も決めた。まだ内部の処理は何も書いてないので、外見だけだけど。

20171009-1.png
タグ:Mac DTM
posted by toshinagata at 23:24| 日記

2017年10月07日

ホークス千賀投手、初タイトル

 福岡ソフトバンクホークスの千賀投手、ホーム最終戦で勝敗つかずも最高勝率のタイトルがほぼ確定。おめでとう。西日本スポーツでは「強運」と冷やかされているけど、たぶん運だけじゃないと思う。6回3失点で降板したあと、チームが「千賀のために追いついてやろう」と思ったんじゃないかな。工藤監督も試合後にそういう内容のコメントをしていたし。

 本拠地最終戦とはいえ、チームとしては完全な消化試合。9回裏に執念で追いついて延長戦に持ち込むなんて、「このまま負けたくない」という気持ちの賜物。それだけ、チームに愛されているんだと思う。同点の場面でベンチの前に出て最敬礼している写真、愛嬌があっていいですよ。ポストシーズンでもぜひ活躍してほしい。

タグ:野球
posted by toshinagata at 00:50| 日記

2017年10月02日

Alchemusica いろいろトラブル…

 そこそこ完成度が高くなってきたかと思っていた Alchemusica だが、この週末はいろいろとやられた。

 まず、なぜか Sound Canvas VA のプラグインが立ち上がらない。プラグインを壊してしまったかと思って、OS の再インストールまでやってみたが、改善されなかった。(まあ、ついでに OS をアップグレードしてからサボっていた定期バックアップを再開したので、その点はよかったのだが。)SVN レポジトリでリリースをさかのぼって順に調べてみた結果、あまり深く考えずに AUGraphStart() を呼び出す位置を変更したのがまずかったと判明した。なお、同じ時の修正で、パッチ名(=音色名)を読み出す処理を付け加えたので、内蔵 DLS Synth の場合は下のようにプログラムチェンジをポップアップメニューで指定できます。

20171002-1.png

 Sound Canvas VA の Audio Unit プラグインは、この機能に対応していないようです。残念。パッチ名のリストを別途指定できるようにすればいいのだけど、今後の宿題だな。

 他にもいろいろありました。演奏中に Mute を ON/OFF するとフリーズするとか、Audio Device Settings メニューでプラグインを選択すると、前と同じものを選択してもプラグインがリセットされてしまうとか。まだまだだなあ。

タグ:Mac DTM
posted by toshinagata at 00:50| 日記

2017年09月27日

Polyphone でサウンドフォントを編集

 サウンドフォントエディタの Polyphone を試してみた。まだ少ししか触ってないけど、なかなか便利そう。

20170927-1.png

 昔購入した Proteus Orchestral のサウンドフォントを開いてみた。ソロ弦の音が勝手に減衰していくのが使いにくいなあ、と思っていたのだが、サンプル音自体には減衰はかかっておらず、エンベロープジェネレータをいじってサステインレベルを 0 dB にしたら、減衰のない「ようかん型」の音になった。MIDI コントローラでアタックタイムやスタートオフセットをいじれるようにできるので、使いやすくなるんじゃないか。サウンドフォントプレイヤーが MIDI コントローラに対応しているかどうかが問題だけど。

タグ:Mac DTM
posted by toshinagata at 22:59| 日記

2017年09月25日

CCさくらの主題歌に水野良樹さん!

 CCさくらの新アニメ。オープニングソングを坂本真綾さんが歌うというのがニュースになっていましたが、よく見たら作曲者は水野良樹さんじゃないですか!

「カードキャプターさくら クリアカード編」OPテーマが坂本真綾さんに決定!

 いやー NHK さん、いい人選するじゃない。「プラチナ」の作曲者の菅野よう子さんも嫌いではないですが、水野さんの音使いは好きなんだよな。どんな曲になるか楽しみ。(もう見る気満々)

タグ:アニメ
posted by toshinagata at 22:39| 日記

2017年09月17日

ルトスワフスキ「パガニーニ変奏曲」公開

 ルトスワフスキの「パガニーニの主題による変奏曲」を YouTube で公開した。

20170917-1.png

 著作権保護期間中の楽曲の場合は、ブログに埋め込みをしたらいかんそうです。個人が収入を得ずに運営するサイトであればいいのだけど、このブログは Amazon のアフィリエイトがあるからダメ。アフィリエイト外してもいいんだけどね。何の収入にもなってないし、そもそもアフィリエイトリンクを貼っているのは収入目当てじゃなくて、書影と書名等の情報がまとめてあって便利だという理由なので。

JASRAC による規約の解説はこちら:「動画投稿(共有)サイトでの音楽利用 JASRAC」

 念のために JASRAC の作品コードを「作品データベース検索サービス」で調べてからアップロードしたのだが、別に何も聞かれなかった。特別な手続きは必要ないみたい。

 ところで、楽曲を含む動画を YouTube アップロードすると、結構な確率で「著作権侵害の報告」に引っかかる。誰が調べているのか知らないけど(AI か?)、もう少し精度を高くしてほしい。いちいち異議申し立てするの面倒臭いんだからさ。先日アップロードしたバルトークのピアノ協奏曲も、「アランフェス協奏曲」か何かの動画の著作権を侵害している、というクレームが来た。全然似とらんやろ。

posted by toshinagata at 14:49| 日記

2017年09月16日

Alchemusica のリビルド詳細

 Alchemusica のビルド環境を Xcode 3.2.6 → 8.2.1 に変えるため、あちこち手を入れた。SDK は 10.5 → 10.12, deployment target は 10.6(10.5 用のビルドはできなかった)。あまり必要ない気もするけど、作業内容を一応メモしておく。

 Cocoa 関連の API 変更への対応。

  • NSImagecompositePoint 系を drawInRect に置き換え。respectFlipped というパラメータがある。これを使えば、NSImagesetFlipped (deprecated) を使わなくてもよい。
    [[MyPopUpButton triangleImage] compositeToPoint: NSMakePoint(theRect.origin.x + theRect.size.width - 7, theRect.origin.y + theRect.size.height - 2) operation: NSCompositeSourceAtop fraction: fraction];
    →
    NSRect r;
    r.origin.x = theRect.origin.x + theRect.size.width - 7;
    r.origin.y = theRect.origin.y + theRect.size.height - 7;
    r.size.width = 5;
    r.size.height = 5;
    [[MyPopUpButton triangleImage] drawInRect:r fromRect:NSZeroRect operation:NSCompositeSourceAtop fraction:fraction respectFlipped:YES hints:nil];
    
  • NSWindowcacheImageInRect などが deprecated。NSViewbitmapImageRepForCachingDisplayInRect:, cacheDisplayInRect:toBitmapImageRep: を使えば代用できるが、結局キャッシュする際も各サブビューの drawRect: を呼び出しているので、それなら普通に描画しても一緒じゃん、ということで、キャッシュイメージを使わない方法で書き直してしまった。
  • NSFontdefaultLineHeightForFontdeprecated. これには定石があって、NSLayoutManager のインスタンスを一つ作っておいてそれに問い合わせる。NSWindowController の拡張クラスメソッドとして sharedLayoutManager を実装した。
    [font defaultLineHeightForFont]];
    →
    [[NSWindowController sharedLayoutManager] defaultLineHeightForFont:font];
    

 それから、CoreAudio 関連の API 変更に対応。一番大変なのは、AUMIDIController 関連の API の変更だった。10.11 では警告は出るものの一応動いているのだが、だいぶ前から deprecated なので、この機会に大修正。AUMIDIController は、MusicDevice を元に作成して、CoreMIDI から見えるようにするもの。CoreMIDI のイベントスケジュール機能が使えるので楽だった。これを使わないとなると、MusicDeviceMIDIEvent(), MusicDeviceSysEx() を使って、自分でイベントのスケジューリングをしないといけない。

 まず、MusicDeviceRenderNotify コールバック関数を作って、それを登録する。

static OSStatus
sMDAudioSendMIDIProc(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData)
{ ... }
/*  登録方法  */
CHECK_ERR(result, AudioUnitAddRenderNotify(ip->unit, sMDAudioSendMIDIProc, ip));
/*  登録解除方法  */
CHECK_ERR(result, AudioUnitRemoveRenderNotify(ip->unit, sMDAudioSendMIDIProc, ip));

 このコールバック関数の中で、MusicDeviceMIDIEvent() を使ってイベントを送る。

OSStatus MusicDeviceMIDIEvent(MusicDeviceComponent inUnit, UInt32 inStatus, UInt32 inData1, UInt32 inData2, UInt32 inOffsetSampleFrame);

 inOffsetSampleFrame は、コールバック関数に渡される inTimeStamp からのオフセット。これで、発音を開始するタイミングを指定することができる。サンプリング間隔の整数倍しか指定出来ないのが残念。ここは double で設計して欲しかった。(どうせ内部的には補間処理をしているはず)

 また、MusicDeviceSysEx() にはこの引数がない。SysEx を使って発音を制御する場合もあるので、ここもオフセットが指定できるように設計すべきだったと思う。

OSStatus MusicDeviceSysEx(MusicDeviceComponent inUnit, const UInt8 *inData, UInt32 inLength);

 コールバック関数は CoreAudio から呼ばれる。一方、MIDI イベントを送る関数は独立した pthread から呼ばれる。間にリングバッファを置いて、送り側からタイムスタンプ+MIDI データをバッファに書き出し、コールバック関数ではそのデータを取り出して処理するようにする。送り側の pthread はだいたい 0.1 sec 間隔ぐらいでまとめて処理しているので、リングバッファが一杯になることがある。そのとき、送ろうとしたMIDIイベントを取り下げて、次の処理のときにもう一度送れるようにしないといけない。また、コールバック関数の方は、基本的にはオーディオバッファ1回分の処理しかしないので、リングバッファ中のイベントがずっと先のタイムスタンプを持つ場合には、そのイベントを待たせないといけない。このあたりの処理がちょっとあいまいだったので、CoreMIDI を使うところも含めてかなり書き直した。

 一応 32bit では動くようになった。喜ばしいことに、前におかしかった SoundCanvas VA もちゃんと動作するようになった。Alchemusica 側で何か変な処理をしていたに違いない。

 64bit に移行しようとしていろいろ苦労したが、結局断念した。断念したのは、CoreAudio プラグインの CarbonView が表示できないんじゃないか、という懸念から。やってみたらできたのかもしれないけど、そのために必要な作業量を考えると、別に 32bit のままでいいんじゃない、と思った。10.11 でも 32bit で普通に動いてるしな。32bit アプリが一切動かなくなってから考えてもいいだろう。

タグ:Mac Alchemusica
posted by toshinagata at 20:04| 日記