2017-02-24

2017 年度の音展は 5/13,14 開催

2017 年度の音展 -- OTOTEN -- は、GW 明けの 5/13,14 に開催される。概略は次の通り:

  • 日時: 2017-05-13 (土) 10:00-19:00
    2017-05-14 (日) 10:00-17:00
  • 場所: 東京国際フォーラム
  • OTOTEN

B1F ではカー・オーディオを体験できるようデモ・カーを用意しているとのこと。各階ごとに出展ブースが決まっている:

  • 4F: ヘッドホン・イヤホン・ポータブルオーディオ関連ブース
  • 5F: ホームオーディオ、ホームシアター関連ブース
  • 6F: ハイエンドオーディオ関連ブース
  • 7F: 総合イベントゾーン

気になるのは、5F と 6F。「最新スピーカー 6 機種比較試聴会」というのをやるらしいけど、6F かな? 7F かな? 基調講演は Spotify Japan の社長が「ストリーミングで広がる、オーディオの新たな可能性」というタイトルで話をするらしい。

OTOTEN にはほとんど顔を出したことがなかったのだけど、今年は行ってみようかな!

2017-02-23

Objective-C で文字列を join する

Objective-C で文字列配列の join をやるのは面倒と思っていた。Ruby の join みたいなことが出来ると楽なのにー、と。例えばこんなコード:

%w(This is an apple).join(' ') #=> "This is an apple"

で、Apple のマニュアルを見たらあったcomponentsJoinedByString というメソッド。

これを使えば、NSMutableString を使ったり

NSArray<NSString *> *strings = @[@"This", @"is", @"a", @"pen."];
NSString *separator = @" ";

NSMutableString *mResult1 = [NSMutableString new];
for (int i=0; i<strings.count; ++i) {
    [mResult1 appendString:strings[i]];
    if (i < strings.count - 1) {
        [mResult1 appendString:separator];
    }
}
NSString *result1 = [mResult1 copy];
NSLog(@"Text: %@", result1);

Text: This is a pen.

stringByAppendingString: を使ったり

NSArray<NSString *> *strings = @[@"This", @"is", @"a", @"pen."];
NSString *separator = @" ";

NSString *result2 = @"";
for (int i=0; i<strings.count; ++i) {
    result2 = [result2 stringByAppendingString:strings[i]];
    if (i < strings.count - 1) {
        result2 = [result2 stringByAppendingString:separator];
    }
}
NSLog(@"Text: %@", result2);

Text: This is a pen.

する必要がなくなって、シンプルに書ける。

NSArray<NSString *> *strings = @[@"This", @"is", @"a", @"pen."];
NSString *separator = @" ";

NSString *result = [strings componentsJoinedByString:separator];
NSLog(@"Text: %@", result);

Text: This is a pen.

便利。Objective-C には、意外とユーティリティ的なメソッドも用意されていると知る今日この頃。

オーディオ自宅オフ会 〜 会社の友達を招いて

2017-02-20 (月)、会社のクラシック音楽好きを 2 人招いてオーディオ・オフ会を開いた。

オーディオ・オフ会

1 人は 20:30 頃から、2 人目は 22 時過ぎから参加。23 時頃まで、クラシック音楽やらオーディオやら会社の話で盛り上がった。会社の友人を家に呼ぶのは 14 か月ぶり。先日、プリアンプが修理から戻って来たのが話題になって、今回のオフ会となった。

ポストモーテム

会社上がりでオーディオ・オフ会となると、どうしても開催時間が遅くなる。夕食をどのタイミングで取るか、が悩ましい。外食すれば食事している時間の分だけオフ会の開始が遅れるし、食べなければお腹が空く。コンビニで弁当やお菓子を買のは味気ない。今回は途中でピザハットに寄って、ピザの M を 2 枚買って帰った。ピザはちょっとしたパーティーっぽくなって、会話も弾むし、音楽を聴くのにも邪魔にならない。良い選択だった。3 人で M を 2 枚は多かった気もする。次回は L を 1 枚でも良いかもしれない。ピザ以外だとお寿司の出前 (銀のさらとか) や近所でデリバリーを探してみるのもアリかも。

会社の人だと、オーディオ・オフ会とはいえ必ずしもオーディオの話ばかりじゃなくなる。Philips Hue を家の照明として使っていて、Siri から操作したり、GPS 連携で帰宅したら自動点灯させてる話をした。こういう話は家で実演する方がウケる。ガジェット系では他に Apple TV とか、Kindle Oasis とか、JBL の Bluetooth スピーカーとか、Parrot の Bluetooth ノイズキャンセリング・ヘッドホンとかもネタになりそう。いつでも取り出せるようにしておこう。

せっかく来てもらったので、コーヒーをフレンチ・プレスでいれてみた。いつも 1 人で飲んでいるので、分量が分かりづらかった。というか、3 人分のお湯を沸かせるケトルが無い。コーヒー・グラインダーも 3 人分の豆をひくのは大変だったし。これは... どうしようかね。

肝心のオーディオの音だけど、オフ会終わって聴き直してみたら音が左にズレていた。ある程度セッティングを詰めてはいるつもりだけど、上手くいかない。前日にスピーカー・セッティングを見直した時に、右のスピーカーを 2 cm ほど後ろに下げたのが良くなかった。その時は良かれと思ってやったことなんだけど。後で冷静になってみれば、余計なことをしていたってことがよくある。今回もソレ。自分の音が確立できていないんだろうなぁ。まだまだ未熟。

あとがき

音楽の好きな人を招いてオーディオ・オフ会をやるのも楽しい。またやりたいな!

現在のシステム

ラックは Quadraspire Q4D Vent、CDプレーヤー・プリアンプ間のケーブルは Jorma Design XLR No.2、プリアンプ・パワーアンプ間のケーブルは Jorma Design RCA No.2、スピーカー・ケーブルは Jorma Design No.3。

2017-02-19

Objective-C で 2 つの配列を比べた時同じ要素で最初に見つかったものを返す方法

2 つの配列がを比べて「同じ要素」があるかないか? あるなら、最初に見つかった要素は何か? を調べたいとする。

これを for 文で書くとこんな風に長いコードを書く必要が出てくる (Goto 文を使う是非は置いといて...)。

NSArray *numbers = @[@1, @2, @3, @4, @5, @6];
NSArray *targets = @[@3, @4, @9];

NSNumber *result = nil;
for (NSNumber *n in numbers) {
    for (NSNumber *m in targets) {
        if ([n isEqual:m]) {
            result = n;
            goto objectFound;
        }
    }
}
objectFound:;
NSLog(@"first object: %@", result);

first object: 3

実は Objective-C には、こういう目的に合ったメソッドが用意されている。それが firstObjectCommonWithArray:。これを使って上のコードを書き直すと、for 文が一行にまとめられる:

NSArray *numbers = @[@1, @2, @3, @4, @5, @6];
NSArray *targets = @[@3, @4, @9];

NSNumber *result = [numbers firstObjectCommonWithArray:targets];
NSLog(@"first object: %@", result);

first object: 3

もし見つからなかった場合は nil が返る。便利!

2017-02-18

Apple Music でコンサート用プレイリストを作ってみる

明日、荒川区民会館サンパール荒川で無料のクラシック音楽コンサートがある。曲目は次の通り:

  • ドボルザーク作曲交響曲第8番
  • スッペ作曲軽騎兵序曲
  • イバノビッチ作曲ドナウ川のさざなみ
  • サウンドオブミュージックメドレー

楽しみ。

さて、この手のコンサートがあると曲の予習・復習をするようにしている。これがコンサートによっては自分の知らない曲もあったりする。(今回は有名な曲ばかり。どの曲も CD を持っている。) 今までは CD を持っていない曲は予習なしでコンサートに挑んでいた。

最近は Apple Music (もしくはGoogle Play Music) のお陰で状況が一変した。新作やよっぽどの秘曲でもない限り、たいてい Apple Music に曲がある。なので、予習し損ねることがなくなった。

コンサートの曲目順にプレイリストを作っておくと一気に流すことができる。CD だと (コンサートの曲目順に曲が並んでいることはまずないので) 複数のCD を入れ替えないといけないんだよね。予習にも復習にも便利。コンサートごとにプレイリストを作ってるとゴチャゴチャしちゃうので、ぼくは一年分のプレイリストを作ってる。

2017-02-17

少し古い Git コミットを Zip にまとめる

「不具合の出たコード」が欲しいと言われた。

開発中に難しい不具合が出たので対応している時の話。ヘルプを求めていたら、上のようなリクエストが来た。

諸々の事情で Git のリポジトリーを共有できなかったので、Zip に固めて渡すことにした。けれど、手元のリポジトリーは別のコミットが 3 つくらい入っている。今の修正も stash に入れて作業するのは面倒だし、この前記事にした git worktree を使うほどでもない。

そこで使ったのが git archive コマンド。

$ ​git archive --format=zip コミット・ハッシュ値 > failed.zip

コミット・ハッシュ値は git log で調べた。

コマンド一つで .git ディレクトリーとか無視して欲しいファイルを除いて zip ファイルを作成してくれる。ハッシュ値を指定して、古い状態を直接 zip 化できるのもありがたい。

こういう、ちょい面倒な作業をシンプルにしてくれるコマンドはもっと覚えていきたい。

2017-02-15

Objective-C で NSArray から filter した配列を得る

配列を filter して新しい配列を得たい。Swift で言う所の、次のようなコード。

let array = [1,2,3,4,5,6]
let newArray = array.filter { $0 % 2 == 0 }

Objective-C で書こうとするとループを回すしかないのかな? なんて思ってた。こんな感じに。

NSArray *numbers = @[@1, @2, @3, @4, @5, @6];
NSMutableArray *tmp = [NSMutableArray new];
for (NSNumber *n in numbers) {
    if (n.integerValue %2 == 0) {
        [tmp addObject:n];
    }
}
NSArray *newArray = [tmp copy];
NSLog(@"even numbers: %@", newArray);
even numbers: (
    2,
    4,
    6
)

そしたら filteredArrayUsingPredicate: というメソッドがあることを知った。上のコードは次のように書ける。

NSArray *numbers = @[@1, @2, @3, @4, @5, @6];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"modulus:by:(SELF, 2) == 0"];
NSArray *evenNumbers = [numbers filteredArrayUsingPredicate:predicate];
NSLog(@"even numbers: %@", evenNumbers);
even numbers: (
    2,
    4,
    6
)

7 行のコードがたったの 2 行になった。頑張れば 1 行でも書けそう。

Swift ほどのシンプルさはないし、NSPredicate を使いこなせないといけないけれど、極めれば便利に使えそう。

modulus:by: は NSExpression.h の中に載っていた。

2017-02-14

AMN 10 周年感謝飲み会に参加してきた

昨日、AMN の 10 周年感謝飲み会があったので参加してきた。

  • 日時: 2017-02-13 (月) 19:30-22:00
  • 場所: AMN 会議室

会社を出たのが 19 時半頃だったので、開始から約 1 時間遅れて到着。

AMN の場所が分からなくてマップで検索。虎ノ門 33 森ビルの中に入って、フロア・リストを見ると... 4F にあった!

Agile Media Network

エレベーターで 4F へ。AMN の受け付けに白い紙。

Agile Media Network

近づいてみると、10 周年記念の会議室の案内。

AMN 10th Aniv.

中に入ると徳力さんが AMN の歩みを話していた。途中入場なので話も後半。2012 年頃が話題になっていた。最初から聞きたかったなぁー。AMN の話でもある「アンバサダー・プログラム」。これを「アンバサダー」と決めるまでに別の案もあったとか。話し合いの末に (徳力さんの案が敗れて?) アンバサダーに決まったとか。裏話も色々聞けた。

巨大なバームクーヘンも登場。参加者がカメラを取り出す。みんなブロガーなんだなぁ。

巨大バームクーヘン

もちろん、ぼくも。

久しぶりな顔、名前だけしか知らないような人。様々。引っ込みじあんで、あまり声をかけられなかったけど、楽しかった。

2017-02-13

The Wikisinger — ロケーションによる天然サウンド・エフェクト付ミュージック・ビデオ

The Wikisinger は 2015 年 7 月に公開されたミュージック・ビデオ。

1 人の男性がオリジナル曲を「いろいろな場所」で歌う。「いろいろな場所」とは、普通の部屋・屋根裏部屋・ホール・トンネル・工事現場... そして無響室。計 15 か所のロケーションで撮影・録音している。場所によって音の響き方が変わるので、シーンが切り替わるたびにまるでサウンド・エフェクトを変更したかのように聞こえてしまう。例えば普通の部屋はいくぶんデッドでホールは反射音が多くリバーブ (残響) が強い。工事現場のように開けた場所では、室内より更にデッドで、無響室に至ってはリバーブが 0 になる。

サウンド・エフェクトを「機器」を使って付与することは難しくないけれど、それをあえて排しているのが、このビデオの面白いところ。

このビデオを他の人に見せたら、「背景(ロケーション)は合成で、実際は機器でサウンド・エフェクトを付けてるんじゃないの?」と疑われた。そこで見つけたのが、このビデオのメイキング。

シーンが切り替わっても、画面に映る調度品が同じ位置に見えるよう、メジャーで位置を測って配置している様子などを見ることができる。

本編とメイキング。二本合わせて見ると面白さが倍になる。

なお、このビデオを良いオーディオで聴くと、ホールで手をパァーンと叩いた音が目の前に広がって行く。オーディオ的な面白さも味わえて楽しい。Bluetooth や AirPlay、Chromecast の使える環境の方は是非観てみて欲しい。

2017-02-12

JVC Kenwood が企業プロモーション・ビデオを作ってた

古巣の JVC Kenwood が企業プロモーション・ビデオ「JVCKENWOODancing」を作っていた。元同僚から教えてもらった。

横浜赤レンガ倉庫 1 号館 (公益財団法人横浜市芸術文化振興財団) との連携による企業・地域プロモーションとのこと。制作の経緯によると、

このたび「横浜赤レンガ倉庫1号館」から参画をご提案いただいたダンスの楽しさに触れる、「横浜赤レンガ倉庫1号館」という劇場を知る、地域と劇場がつながることを目的とした「企業・地域と劇場をつなぐ 赤レンガ・ダンスプロジェクト」は、当社が「JK3.0」で推進する「新たな企業文化の構築」への取り組みとの親和性が高いため、風土改革活動の一つとして位置付け、“社員自らが表現者(ダンサー)として出演する”企業プロモーションビデオの制作に至りました。

2017年 | ニュースリリース | 株式会社JVCケンウッド より引用

ビデオは 6 分 59 秒。楽曲は広瀬香美の「ロマンスの神様 2016」(新アレンジ)、ダンス振付は伊藤千枝。ビデオはニュース・リリースやダイバーシティページで観ることができる。YouTube にもアップするってニュース・リリースには書いてあったけど、2017-02-12 現在見つけることは出来なかった。

ビデオを見てたら元同僚の姿も見つけることができた。頑張ってるんだなぁ、と感概ひとしお。