歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【LSDj】ゲームボーイでDJをする(音作り編)

こちらの記事で、LSDjというゲームボーイ用のトラッカー・ソフトを導入し、ゲームボーイを楽器として演奏する準備は整いました。

kiito.hatenablog.com

しかし、「仏作って魂入れず」ということわざの通り、楽器があっても曲を用意しなければ意味がありません。私は作曲自体の経験が元々ないのと、音の制約の中で理想に近い音を出さなければいけないことで躓いており、何か曲を作れる状態にはまだまだほど遠い状態です。

本当は『曲作り編』というタイトルで一度まとめたかったのですが、中途半端な状態ながら、一度ブログ記事の形で情報を整理する必要を感じたので書いています。

まあ難しいながら、音が出るだけで今は楽しいんですけどね!

暫定の目標

とはいえ趣味でやっているので、少しずつ大きな目標を立ててモチベーションを保ちながら勉強する必要があります。

ちょうどchibi-tech先輩に会う機会があったのでどうやって曲作りを勉強すればいいのか質問したところ、「オレたちストリート系耳コピで勉強するもんだぜ」というアドバイスを頂きました。

そこで私は「chibi-techさんの巫女みこナースカバー風で、けものフレンズ主題歌『ようこそジャパリパークへ!』をカバーする」という目標を立てました。

www.youtube.com

(※後で気づいたのですが、この曲はベースの音程が難しいのと、chibi-techさんの技術をLSDjで再現できるのかどうかそもそも分からないのとで、けっこう無謀な目標を立ててしまっていました)

バンドマンの知り合いからは「パンクバンドは楽曲が比較的単純なものが多いから、コピーしたいならそういうのがいいんじゃない?」というアドバイスを頂けたので、挫折したらそうします。

曲の要素を分解する

LSDjに触る前に、ちょうど無料の音楽学習サイト『Learning Music』の案内が流れてきたので、2~3日こちらのサイトで遊んでいました。

こちらのサイトで良かったのは、「ドラム」「ベース」「コード」「メロディー」の4要素のチャプターがあり、「ドラム」から勉強が始まることです。作曲のノウハウ本は大抵「コード」の説明から始まるため、音数の制限がある実機のチップチューンを作りたいというニーズからは外れるように感じていたので。

また、だいたいこの4要素で曲を捉えればOKというのが分かったのも良かったです。…たまにこれに当てはまらないスゴい音楽があるようにも思うのですが、最初からそんなのを目指しているわけではないので一旦考えないようにします。

ベースを耳コピする

こちらの本の、特に実践編の『バンドスタイルの曲の耳コピ』が役に立ちました。

耳コピ力アップ術 〜理論と実践と聴き分けのコツ

耳コピ力アップ術 〜理論と実践と聴き分けのコツ

  • ベースまたはドラムからコピーすると良い
  • ベースが聞き取れない場合は、低音を強調すればいい
  • ベースの音があるのか無いのか分からない場合もあるが、最後は「自分だったらこの音を演奏するかどうか」という観点で決める

聞き取れない場合も多いので「弾いてみた」やカバー曲の動画等も参考になるのですが、自分の担当楽器がかっこよく魅せるアレンジしていたり、自分が聞いても音が間違っていたりする場合もあるので、あくまで参考程度かなと思います。

私は低音を強調するためにPCDJで使っているTraktorを利用しているのですが、もっと良い方法がある気はしています。キューやループの機能は便利なんですけどねw

また、WaveToneという耳コピ支援フリーソフトも、知り合いに教えてもらいました。

forest.watch.impress.co.jp

音声をスペクトル解析し、強く出ている音の音程をピアノロール風に表示できる耳コピ支援ソフト。音程をピアノロール風に表示するだけではなく、曲のテンポや鳴っているコードを自動で解析可能。

LSDjの音作りを勉強する

LSDjはデフォルトの楽器音源は殆ど無く、自分自身で工夫して理想の音を作る必要があります。 特に今後は迫力のあるキック(ドラム)の音を作る方法を勉強する必要を感じています。

他人の.savファイル(GBのセーブデータ)が公開されている例があるので、そちらを元に勉強しています。

esctrax.bandcamp.com

また、ここ数日はYouTubeの動画も見ています。実際に音を聞きながらチュートリアルできるので良いです。

www.youtube.com

また、LSDjは4系から5系になる際にキック音の迫力が失われる変更があったそうで、こちらの記事も参考になるそうです。というのを@to6okegaoさんのツイートで見ました。

chiptuneswin.com

PWMの波形で声を作る

私はchibi-techさんの音色に憧れているので、日本語のボーカル音声をゲーム機の音で再現したいと思っています。特に「うー!がおー!」という声を作りたいです。

www.nicovideo.jp

ただ、チップチューン・ミュージシャンの中にも他に同様の音を指向している人はほとんど見かけず、方法も分からなかったのですが、ニコニコ大百科の懐音ミオの記事に参考になりそうな記述を見かけました。

矩形波によるボーカル再現:Chibi-Tech氏のお家芸といえるテクニックである。矩形波のduty比を細かく変更することにより、ボーカルを再現させる。ドッP氏の「FC音源による護法少女ソワカちゃんショートメドレー」が公開されるまで、謎の技術とされてきた。(ねここ氏による考察)例:FAMCOMPO Entry No.10 「Miko Miko Nurse」 - Chibi-Tech

d.hatena.ne.jp

上の記事ではファミコン用のチップチューン制作ソフトのFamiTrackerのコマンドで説明されていますが、以下のFamiTrackerとLSDjの対応表を参考になんとか進められそうです。

LSDj - FamiTracker Command list

ただし、この記事を参考にしてもchibi-techさんのような鮮やかな音は出せていません。

ひとまず.nsfファイル(ファミコンで再生できる形式)を.gbファイル(ゲームボーイ用ソフトの形式)に変換するツールで、ゲームボーイカラーエミュレータ上で巫女みこナースを再生できたので、原理的に不可能ではないと踏んでいます。ただし、細かく矩形波を制御しているせいか、ボーカル音声の出る部分では再生がやや遅くなっていました。

もしLSDjで再現することが難しいことが分かれば、プログラミングをがんばってゲームボーイ上で音を再生するソフトを書こうと思います。実用的なものが作れるかは分からないですが。

C言語超入門―Windowsでゲームボーイのプログラムを作ろう! (CompuBooks)

C言語超入門―Windowsでゲームボーイのプログラムを作ろう! (CompuBooks)

シンセサイザーやゲーム機の構造を勉強する

先輩に質問すると「この音はNES(海外版のファミコン)のDPCM音源で作っていて、GBの波形メモリ音源ならクオリティ落ちるかもしれないができると思う」というような返答をもらいます。そのため英語の他に、一般的なシンセサイザーの知識や、ゲームボーイファミコンの音声処理の知識が必要です。

一般的なシンセサイザーの知識は、『シンセサイザーの全知識』という本が役に立ちました。ただし、これ以上は「アナログシンセサイザーを作る」みたいなことをしないと分からない気がしていて、さすがにyak shavingなんじゃないかと悩んでいます。

シンセサイザーの全知識 本格派を目指すキミに!

シンセサイザーの全知識 本格派を目指すキミに!

ゲームボーイファミコンについては、いろいろ探しましたが、結局はニコニコ大百科の記事が一番まとまっているように思います。

dic.nicovideo.jp

dic.nicovideo.jp

つまり、ファミコンの音源と比べるとどこが違うのか。大きな違いは以下の通り。

  • ステレオである。(ファミコンはモノラル)
  • 波形メモリ音源があり、その音量も変えられる。(ファミコン三角波・音量固定)
  • PCM関連の音源が無い。(ファミコンDPCMがある)
  • 全体の出力が左右別々に調整できる。これにより、曲のフェードアウトなども容易に。(ファミコンにはない)

まとめ

道のりは遠いですが、無理せずやっていきます。

【メモ】PyCon 2017で勉強になったこと、これから勉強すること

プログラミング言語PythonのカンファレンスPyCon JP 2017に参加してきました。そこで勉強になったこと、これから勉強したいことをまとめた個人的なリストです。

いろいろなセッションの内容については、既にいろいろな方が素晴らしい記事を書いているので、私は特に包括してまとめるつもりはありません。そういう目的であれば、特に以下の記事がおすすめです。

qiita.com

ベンリに使おう変数アノテーション - typing.pyとの楽しいお付き合い

一言でまとめると「Python3.6から変数アノテーションが導入された。それを使って型を使って安全に(バリデーションした上で)jsonを読み込むライブラリを作った」という発表です。Pythonの最新機能と、Python自体の機能をハックして、言語設計者が考えている以上に便利にアノテーションを使うという楽しさのある発表でした。

speakerdeck.com

私はPythonの型アノテーションが導入された時に、「プログラムを安全にするための型」を理解したくてHaskellを勉強し始めたのですが、実際に簡単なCLIを作ろうとした際にJSONを読み込む手間が煩雑すぎて(たしか、jsonから値を取る場合に全てMaybe型で取得され、明示的に処理する必要があるような感じ)、結局Pythonで書いてしまったことがあります。

それに比べると、読み込み時に指定の値が入っていない場合にtypedmarshalや、その元ネタのGo言語の仕組みは分かりやすくて良いなと思います。

ただ、実際にjsonオブジェクトのバリデーションを行うとき、私は今のところCerberusライブラリを使うと思います。こちらは文字列の正規表現や、数値の範囲のチェックまで行えるためです。

qiita.com

もし「型」で同じようなことをやるにはどうすればいいのでしょうか?私は詳しくないのですが、依存型という概念でリストの長さも制限できる言語があるらしく、同じような用途に使えるんじゃないかと思います。もしPythonでやるなら、辞書をアノテーションに渡す形式にしたほうが分かりやすい気もしますが。

数理最適化モデラー(PuLP)チートシート

2日目のポスターセッションも素晴らしい展示が多く、特に数理最適化(数理計画)のこの発表が良かったです。

qiita.com

私は、同僚の書いたpulpを使った雰囲気でレビューしている(他にPythonに詳しいプログラマーが少ないんです…)ので、いろいろ質問してしまいました。

いや、もちろん全く理解していないのではなく、「目的関数と制約条件を定義して〜」みたいなレベルの話とかプログラミング一般の話(インプットアウトプットが妥当かとか、読みやすいコードなのか)はできるのですが、「どういう問題が難しい」とか「モデリングが妥当か」みたいなところはほとんど話できていません。

今日から使える!組合せ最適化 離散問題ガイドブック (KS理工学専門書)

今日から使える!組合せ最適化 離散問題ガイドブック (KS理工学専門書)

この本を含め、数冊おすすめしていただきました(上記のQiitaの記事に書いてあります)。ポスターセッションで話をした感じでは、「どういう問題が難しい」みたいな話は、NP困難などの話が出て来るようなので、普通のプログラマーとしての力を上げていけば議論できるようになる気がします。

私と同じ時間に質問していた方が「pulpって分散処理できるんですか?」という質問をしていて、「pulpPythonから商用やフリーの最適化のソルバーをラッピングしているだけなので、対応しているソルバーに差し替えればできます」って答えていたのが面白く感じました。

数理計画の専門家は「何を解くか」に注目していて、エンジニアは「どうやって処理するか、そもそも現実的に使える時間に処理が終わるのか」みたいなところに注目している気がします。

Python におけるドメイン駆動設計(戦術面)の勘どころ

Pythonドメイン駆動設計(DDD)の知見あんまり無いよね」「一つサンプルケース作ってみたから参考にしてよ」という発表です。

www.slideshare.net

ただし、私はDDDや設計の話はほとんど学んだことがなく、全体としてそこまで理解できてはいません。ただ、それでも「クエリとコマンドを分けて考えるといいよー」って話など、部分部分で「なるほど」と思う箇所はありました。

もうちょっと設計などの話を勉強したいです。ただ、結局は実践しなくては理解出来なさそう(ベストプラクティスとアンチパターンの区別がつかなさそう)なのと、DDDのクソ分厚い本に躊躇して手が出せていません。

Pythonはどうやってlen関数で長さを手にいれているの?

www.slideshare.net

Pythonの仕組みに一歩深く踏み入れられる素晴らしい発表でした。「Pythonには公式ドキュメントにもプロトコルをまとめられてないよね」って話には納得感があります。with構文を使いたい場合などに特に…。

collections.abcがある今となっては、mixinで実現して欲しかったような気がする」とTwitterで言っている方がいて、私もそれには同感でした。この点、RubyEnumerableモジュールを使ったイテレーターの実装のほうが綺麗ですね。

Pythonをとりまく並行/非同期の話

Pythonをとりまく並行/非同期の話

並行・並列処理や、GIL(Global Interpreter Lock)についてまとまっている発表です。並列処理によって高速化したいプログラムのボトルネックがI/Oバウンドやメモリバウンドかによってやり方違うよね、という目的の話から始まっているので、非常に分かりやすかったです。

参考文献(記事)も紹介されているので、ここから広げていけば並行処理/非同期処理は攻略できると思います。

pandasでのOSS活動事例と最初の一歩

pandasのコミッターの @sinhrks さんによる基調講演です。

speakerdeck.com

Pythonの科学技術計算の歴史や、OSSコミュニティの様子などが紹介されています。個人的には、様々な環境でのパフォーマンステストが用意されているのが、様々な環境で使われうる科学技術計算ライブラリならではだと、印象的でした。

OSS活動するなら、まずは気になるプロジェクトのリポジトリをウォッチしてみよう!」と仰っていたので、私もその通りにやってみます。

【本】エンジニアが合理的にコミュニケーションしていくために

私は、データ分析を多く取り持つ部署で仕事をしています。そのため、普段関わりのない他の部署とやり取りする必要があったり、 最近では個人情報を取り扱う際には色々とお伺いを立てる必要があります。 システム化する際には技術に詳しい先輩に協力を仰ぐ必要もあります。

ということで、最近はいろいろな人とのやり取りが多く、自分のコミュニケーションがボトルネックとなってしまいつらい状態になっていました。 私は気分がふさぎ込むと本を読みふける習性があるので、友人やネット経由で知った本をいろいろ読んでました。

今回の記事はそんな中、次の2冊を読んで考え方が分かった、対策の打ち方が考えられるきっかけになった、という話です。

合理的なコミュニケーションのための『医療とコミュニケーション』

一冊目が『医療とコミュニケーション』という本です。医者と患者のコミュニケーションの話ですが、開発者とシステム利用者など、専門的な知識を持っている人と、知識を提供される人との関係に置き換えて読むことができます。

レジデント初期研修用資料 医療とコミュニケーションについて

レジデント初期研修用資料 医療とコミュニケーションについて

私は、こちらの紹介記事を介して知りました。こちらの記事自体も素晴らしいので、ぜひ読んでください。

medium.com

本書では、まずコミュニケーションの定義から始まります。それは端的に

「状況のコントロール」を達成するための技術

とされています。さらにそれは2つに分解され、

  • 事実に対して自分の見解を持つこと
  • 事実の改変を防ぐこと

となります。

どの章も学ぶことが多かったのですが、上の引用の2点の思想が一貫して感じられます。

私の上司も理性的な人なので、同じように「事実に基づいて議論してほしい」という趣旨のことを言います。私がいろいろと「大変だったからなんとかしてほしい」みたいな文句を言っているときも、「お前の言い分だと自分の印象しか言ってないじゃん。どこが悪いのかどんな事実をまとめておかないと、もし改善しようにもどこを直せばいいのかわかんないよ」と思っていたに違いありませんw

また、「これくらい困っている、という事実が共有できてれば、協力してあげられてたのに」ということもよく言われました。私は今のプロジェクトは1人で進めている時期が長かったので、不正確でも見積もりを立てる(見積もりは大抵不正確なものです)メリットが分からなかったのですが、上のような考え方だと「これくらいで終わると踏んでいる」というのを最初に合意しといて「これくらい遅れ気味だから助けてくれ」って言えばスムーズだったのかなと思います。

そして、私はコミュニケーションに苦手意識を持っていたのですが、「面白い話はしなくていい」という話にはちょっと救われました。「インターネット等の場では『動物を見た』話を『狼が襲ってくるぞ!』とセンセーショナルに伝える意見が多く共有されるけど、現実では合意形成ゲームだから、事実を伝えて信頼を積み上げていけばいい」という話です。

そういう意味で、私は給与交渉などの場での自己アピールも苦手に思っていた(自分には××なところが足りてないし…)のですが、「きちんと出た結果を記録しておいて、事実を事実として伝える」だけでいいんじゃないかと思うようになりました。幸い、私の上司はそうすればきちんと評価してくれる人だと思っています。

「『悪い人』は目的が決まっており、適切に対処すれば撤退してくれるからある意味付き合いやすい。『いい人』は目的がはっきりしないし、一方的に期待を積み上げてくるので交渉の余地がない」という話にも考えさせられました。

私自身、「できるだけ迷惑・負担をかけまい」という発想で八方美人になろうとして、交渉の場を自分で潰していた部分も大きかったと思います。

自分というメディアを高めるための『あなたの話はなぜ「通じない」のか』

もう一冊は、友人のマーケッターから薦められた『あなたの話はなぜ「通じない」のか』です。

マーケッターの彼は意識が高く、普段ヤバいレベルで働き続けているし、休日も「自分はこんな事やりたい」「こういうことやればうまくいくんじゃないか」と考え続けているヤバい人です。

あなたの話はなぜ「通じない」のか (ちくま文庫)

あなたの話はなぜ「通じない」のか (ちくま文庫)

Kindle版なら500円です。↑のリンクはアフィリエイトですw

特に印象的だったのが「自分のメディア力を高める」という言葉です。端的にいうと「外から見ると自分は他人から何をやってるのか分からないし、同じ言葉でも信頼のある人が言ってるものはやっぱり信頼されるよね」という話です。

私も先輩のアドバイスで、プロジェクトの早い段階で、簡単な、分かりやすいデモを作って見せていました。プログラムの難しい部分はできていないおもちゃのようなコードだったのですが、関係部署の方には意外にウケて、それ以来、ある意味自分というメディアを信頼してもらえ、社外とのミーティングに同席させてもらったり、いろいろな頼みを聞いてもらったり、仕事を進めやすくなったと感じています。

先輩からすると、「信頼されると次の話をしやすくなる」「他の人には意外に伝わらないので、ちゃんとイメージを伝えないといけない」ということを知っていたんだと思います。(もう一つ、「細かくアウトプットを出していかないとモチベーションが持たない」ということもあるんだと思います)

また、私の今の悩みとは直接関係ないですが、「問題の答えより、『問い』を立てて考えられたものかのほうが大事。それを広げるには『時間軸』『空間軸』『人の軸』を元に考えよう」という話も興味深かったです。技術に関しても、「こんなすごい技術があるよ!」というより「こういう問題があって、それを解決するために産まれた技術だよ」と説明される方が、個人的には覚えやすいと感じていたので。

また、「ピアノで賞を取った」という「点」の説明より、「10歳からピアノを勉強しており、高校のときは〜」と時間軸を入れた「線」の説明のほうが説得力があるという話も興味深かったです(そのため、この本は就活生にもよく読まれているそうです)。私は自分自身について「過去と今と未来にやってることに整合性がない」と感じている部分もあるので、個人的には痛い部分を突かれた気分になりました。

medtoolz著 『レジデント初期研修用資料 医療とコミュニケーションについて』 | 身近な一歩が社会を変える♪

「患者の立場になって聴く・話す」とか、共感的なコミュニケーションとか、そういう「ケア」に相当する部分。そういったことは、病院では、もしかしたら看護師さんの役割になるのかもしれない。(医師はどこまでもcureの立場の人だ。)

実はこの本にも、印象的なエピソードが出てきた。事故現場で亡くなった子どもの遺体を前にして、親御さんはその死を受け止められず、「あの子の顔の傷を何とかしてくれ」と叫び続けたと言う。しかし、看護師さんが亡くなった子どもの顔に絆創膏を貼ったら、親御さんは、そこで初めて子どもの死を受け入れられた―――とのこと(P.23)。

おそらく、「亡くなった子どもの顔に絆創膏を貼る」ようなコミュニケーションは、この本を百回読んでも実践できないだろう。

私も先程紹介した「医療とコミュニケーションについて」には『共感』という視点がどうしても欠けていたと思うのですが、こうすれば共感しやすい/されやすい、説得力があるよね、と考えるための側面は、もしかするとこちらの趣旨の本で補えるのかもしれません。

まとめ

私がコミュニケーション周りで苦労していて、なんとかやり方を考えなきゃヤバいので本を読んでがんばっている話をしました。

特に、『医療とコミュニケーション』の「事実を基に自分の意見を持って、誤解がないように伝える」ようなスタンスで一貫している点は自分にとって新鮮でした。一方で、身近にも似た考え方の人がいるし、WEBエンジニアでも医者でも悩みが変わんないなあという点にも勇気づけられました。

個人的には、エンジニアなら『SOFT SKILLS ソフトウェア開発者の人生マニュアル』の後に、給与交渉について考えるときに読むのが良いと思いますw

当然、本を数冊読んだだけで解決できれば誰も苦労してないはずなので、これからも似たようなことで悩み続けるとは思いますが、問題解決のための考え方の基は掴めたのかなと思います。というか、そもそも私は手を動かすのが遅いほうなので、そっちも(そっちのほうを)なんとかすべきなのかもしれません。

【自然言語処理】電話対応のデータ分析で乱読したときのメモ

最近、電話対応のデータ分析を行っていたので、周辺分野と思える書籍や記事を乱読していました。

結論から言うと、最近のクラウド上の汎用の自然言語処理エンジン(LUISやapi.ai)を使えば、もう少し発展させてシステム化するときも汎用の検索エンジンを組み合わせれば済みそうだったので、それぞれのサービスのドキュメントを読むだけで解決できそうでした。

ですので、勉強しようと思っていたことがほとんど無駄になってしまったのですが、折角なのでメモとして残しておきますw

これらのサービスはチャットボット用途でよく使われていますが、

qiita.com

インテントはその発言が、どういった意図を持っているのか をカテゴリー分けしていく概念です。

エンティティはその発言のなかにある、意味のある単語 をカテゴリー分けしていく概念です。 (※2)

私の仕事の要件では『自然言語処理の本を探しています』という会話文から「商品を探している」というインテントと「探している商品: 自然言語処理」のエンティティと紐付けて、どのような商品が多く探されているか集計すればOKでした(もちろん、多少の表記ゆれの名寄せや試行錯誤は必要でしたが)。

各サービスの比較などは次の記事を、利用方法は公式ドキュメントを読めば充分だと思います。

gizin.co.jp

自然言語処理がどんな分野か概観する

自然言語処理というか、「日本語の入力に対して動作するアプリケーションにどんなものがあるか」という部分を知る必要がありました。

そこで、知り合いから「自然言語処理で有名な研究室がおすすめの書籍一覧を公開している」と教えてもらった記事から数冊流し読みしました。

自然言語処理を学ぶ推薦書籍 - 首都大学東京 自然言語処理研究室(小町研)

私は言語処理というと統計寄りの部分(クラスタリングや評判分析)の部分に発想が偏ってしまいがちだったので、情報検索や日本語入力(IME)もまとめてあるのが個人的には少し驚きました。そのおかげで、今回の仕事では「情報抽出をしたい」→「汎用のクラウドサービスを使うのが一番サクッと作れて、システム化も楽そう」という順でやり方を調べることができました。

特に以下の2冊が(研究者ではなく)エンジニアの立場である私には良かったです。

自然言語処理の基本と技術

自然言語処理の基本と技術

自然言語処理 (放送大学教材)

自然言語処理 (放送大学教材)

電話対応業務について学ぶ

IBM那須川哲哉さんが2000年代からコールセンター向けのデータ分析の研究で有名だそうです。

やや古いですが、実際に次の本が自分がやりたいことに近い事例が多く、もっと細かい分析が必要になった場合にはこの本や彼の論文が参考になるかもしれません。もう一冊、ビッグデータを活かす 技術戦略としてのテキストマイニングという本もあったのですが、こちらは技術ドキュメントの解析の話だったので私の欲しい知識ではありませんでした。

テキストマイニングを使う技術/作る技術―基礎技術と適用事例から導く本質と活用法

テキストマイニングを使う技術/作る技術―基礎技術と適用事例から導く本質と活用法

また、ちょうど秋葉原の書泉に立ち寄ったとき、ちょうどCALL CENTER JAPANのAI特集の号が売られており、こちらでも各会社の苦労話が聞けて良かったです。

callcenter-japan.com

また、コールセンター向けのソリューションを提供している会社のセミナーに同席させてもらったりもしていました。

もちろん電話対応を行っているオペレーターの方に話を聞くことも大事なのですが、自分のヒアリング能力が乏しいせいか、毎回「あ、これ知らなかった!メモしとこw」って話がポロッと出て来るのでまだまだ精進が足りないなあと思っています。

その他で読んだ本

「顧客の声分析」みたいなことができるんじゃないかと思って流し読みしたのですが、直接は役に立てられそうにありませんでした。KH Coderというテキストマイニングソフトの説明も非常に丁寧だったのですが、私は一応プログラマーPythonでゴリゴリ書くつもりだったので、そういう点にあまり魅力を感じなかったということもありそうです。

社会調査のための計量テキスト分析―内容分析の継承と発展を目指して

社会調査のための計量テキスト分析―内容分析の継承と発展を目指して

次の本は(仕事と関係なく)めちゃめちゃ面白かったです。

例えば文字コードなどからページで利用されている言語を同定する手法を作ったり、クローラーを数秒おき(日本の一般的なサーバーなら充分すぎるほど捌ける量)に動かしていたところ、アフリカのサーバー管理者から「我々の国はネットのインフラが貧弱なので数秒おきでもつらいのでなんとかしてくれ」と苦情が入ってしまったことなど、『Googleを支える技術』をもう少し社会科学寄り・現場寄りにしたような本です。

言語天文台からみた世界の情報格差

言語天文台からみた世界の情報格差

Googleを支える技術 ?巨大システムの内側の世界 (WEB+DB PRESSプラスシリーズ)

Googleを支える技術 ?巨大システムの内側の世界 (WEB+DB PRESSプラスシリーズ)

【LSDj】ゲームボーイでDJをする(調査・環境構築編)

世の中にはチップチューンという音楽ジャンルがあり、ゲーム機やレトロPCで音楽を作ったり、パフォーマンスしたりして楽しくやっている人たちがいます。(さらに詳しくはCHIP UNION等の専門サイトや、チップチューンのすべてを読んでください)

この記事に書いてあるようなことをやろうと思ったのは、偶然TORIENAさんの初代ゲームボーイを使ったパフォーマンスを見たのが大きなきっかけです。ゲームボーイ実機2台とミキサーを繋げて曲を流しながら、歌ったり踊ったりしていて超ヤバい感じでした。

www.youtube.com

実はチップチューンを聞くのは初めてではなく、友達のchibi-techが、アメリカ版のゴツいファミコン2台とミキサーを繋げてDJをするのを見て、超かっこいいなと思っていました。ただ、個人的にはファミコンにあまり思い入れがない(友達のオヤジのものを勝手にプレイした思い出がある程度)で、自分がやろうとは思ってませんでした。

www.youtube.com

また先日、バンドマンとラッパーのセッションのイベントにDJ(というかBGM係)として参加させて頂いて、イベント自体はすごく楽しかったのですが、楽しくセッションしている中で「人よりMP3を多少持っているだけなんじゃないか」と感じてしまい「何か楽器をやりたいなあ(特にバンド界隈の人と被らないもの)」と思っていたという理由もあります。

余談になりますが、チップチューンのすべてには、今となっては当たり前の「音の出るコンピュータ」の歴史や、ファミコンエミュレータOSS(?)コミュニティ、MML(Music Macro Language)という音楽記述用のドメイン特化言語の話などは、音楽ファンだけではなくITエンジニア心もくすぐる内容なのでおすすめです。

ひとまず、「ゲームボーイ2台で」「ポップスやアニメソングのカバー曲を自分で打ち込んだものを」「交互にミックスする」という方法でDJをするために必要最低限の機材やスキルについて調べてまとめておこうという趣旨です。

ゲームボーイを用意する

実際に機種を調べたわけではありませんが、こちらの動画を見る限り、初代ゲームボーイの音が良さそうだと判断しました。

www.nicovideo.jp

メルカリやヤフオク等を調べましたが、どこも2000円程度だったのでAmazonで買いました。

ゲームボーイ(旧タイプ本体)

ゲームボーイ(旧タイプ本体)

次に、中古で買ったゲームボーイは黄ばんでいて汚いので漂白します。こちらの記事を参考に、一度分解して、プラスチック部分を漂白剤に漬けて数日放置し、組み立て直しました。

www.tee-suzuki.com

外側の分解にはY字ドライバーが、内部の分解に+ドライバーが必要なので気をつけてください。上の記事に紹介されていたドライバーで全く問題ありませんでした。

エンジニア 特殊ネジ用ドライバー DTY-02

エンジニア 特殊ネジ用ドライバー DTY-02

漂白中の様子です。

ゲームボーイを改造する

私は今のところまだ改造していませんが、今後のために記事をメモしておきます。

TORIENAさんにイベント後に質問してみたところ、主に次の2つの改造を行っているそうです。

  • モニターのバックライト化
  • プロサウンド化

初代ゲームボーイはバックライトが付いていないため、そのままでは薄暗いところで行うことの多いDJには不向きです。そのため、バックライトを増設しているようでした。

はんだ付け自体はそこまで難しくないようですが、「分解中に液晶が割れてしまうことがある」ようです。この作業の前に、ゲームボーイのジャンク品を何台か買っておき、代替が効く状態にしておいたほうが良さそうですね。

www.tee-suzuki.com

また、標準のイヤホン端子で音をアウトプットすることもできますが、別途出力端子を用意し、音質を良くすることもできるようです。

blog.ch3cooh.jp

www.youtube.com

ソフトを用意する

ゲームボーイ上で音楽を作るには、以下の2つのソフトが有名です。また、ファミコン等の他のゲームハードでも同様のソフトウェアがあるようです。

私はTORIENAさんが使っているということでLSDjを選び、nanoloopのほうは詳しく知らないのですが、Yahoo!知恵袋によるとLSDjのほうがトラック作成に向いているため、「ポップスのカバーを打ち込みたい」という自分の要望には向いていたようです。

nanoloopは公式サイト上でカートリッジが販売されていますが、一方でLSDjはROMイメージの形式で販売されているため、実機で使用するにはPCからROMを転送してGBメモリなどに書き込むいわゆるマジコンが必要なので実機で使用する上では若干ハードルが高くなっています

また、nanoloopが直感的に操作し偶発的にフレーズを生み出すことに重きを置かれている反面で、LSDjはフレーズを細かく編集し長いトラックを作るのに長けているなどの違いもあります

LSDjを使う場合、公式サイトで購入したソフトウェアをGB USB SMART CARDなどで書き込む必要があります。実際のやり方はこちらの記事が参考になるでしょう。

LSDJを買って実機のゲームボーイで動かしてみた | kyo5884's blog

また、WindowsではGUIで操作するソフトがあるのですが、私のようにMac OSXやLinuxのユーザーは、EMS flasherというCLIツールを使わなければいけません。

日本語での最低限の使い方は、このブログで紹介されています。

www.lanches.co.jp

また、コンピュータ上でゲームボーイを操作するエミュレータも必要になると思います。LSDjの公式サイトでいくつか紹介されており、私はその中のKiGBを利用しています。

PCのキーボードでゲームボーイを操作するのに違和感がありゲームパッドを買ったのですが、結局慣れてしまって使っていません。

DJについて調べる

LSDjには通信ケーブル)を介して音を同期させる機能があるそうですが、TORIENAさんの話を聞くと、音を出した後にBPMを±10して調整して拍を合わせているようです。

というわけでゲームボーイ以外に特別な機材やスキルは必要なく、カットインとフェードイン・フェードアウトができればひとまずは問題なさそうです。

私はPCDJ用のコントローラーしか持っていないので、安くてそれなりに良いDJミキサーが必要になるかもしれないです。

PCで始めるDJ 新装改訂版 (GROOVE for begginers)

PCで始めるDJ 新装改訂版 (GROOVE for begginers)

曲の打ち込み方を覚える

一番参考になりそうなのは、LSDjの公式ドキュメントです。ややバージョンは遅れていますが、日本語版(jp)もあります。

また、LSDjwiki上には初心者向けのチュートリアルや動画がまとめられたページもあります。

littlesounddj.wikia.com

ところが、私は音楽のノウハウが全く無いため、これらの情報を見ても、どこをどういじれば曲が作れるのか判断つきませんでした。

ひとまず今は、こちらの日本語のブログを参考にチュートリアル感覚で進めています。

ameblo.jp

キックの音とメロディーの音が別々の楽器の音として用意されているわけではなく、音色や音の長さを変えて調整してるだけということが分かったのが良かったです。一応、公式のドキュメントにも次の記載があったのですが、何も知らない状態で見ると「???」と思ってしまったと思います。

サンプル音源のドラムキットを使用せずに魅力的なドラム音を作成する事は、もしこれまでにそうし た経験が無ければ 、少しトリッキーです。とはいえ、ここで一度学べば便利なテクニックになるでしょう。

また、他人とLSDj用のセーブデータを共有するためのサイトもあるようです。ただし、サイトの利用方法と、.sav形式のファイルをKiGBで読み込む方法がよく分かっていないので調べています。

Songs | LSDSNG Swap

まとめ

まだまだ学ぶべきことは多いですが、いずれはchibi-tech先輩みたいにチップ音にセリフを言わせてフロアを沸かせたいです。

www.nicovideo.jp

以前読んだ記事に「低レイヤーな分野を知りたいならエミュレータを触ってみるのがいいかも」というようなことが書かれており、

まず一つはエミュレータ開発です。汎用PCアーキテクチャ向けの自作エミュレータを作ってLinuxなりWindowsを動かしてみても面白いでしょうが、 世の中にはゲーム機や端末のエミュレータも多く存在します。せっかくエミュレータを作るなら普段使い慣れたintelチップセット,PCI,ISA,IDEみたいなアーキテクチャでなく(ちょっと古い?)、 もっと変わったアーキテクチャの物を作って見ると良いかもしれないです。

「もしかしたらそういう知識が(躓くことで)手に入るかも」と期待しているのですが、今のところすんなり行ってしまっています。先人が多くて助かっています。

また、いろいろと調べている中で見つけたのですが、ゲーム機を使った音楽についての勉強会やコミュニティもいくつかあるようです。

mmlhack.connpass.com

ototoy.jp

最後になりますが、TORIENAさんの新曲がiTunesで配信されるので、興味のある皆さんはぜひ聞いてください。

Melancozmo - EP

Melancozmo - EP

  • TORIENA
  • エレクトロニック

【Python】networkx + PyGraphvizで有向非巡回グラフ(Directed acyclic graph)をプロットする

昨日書いたコードで、「有向非巡回グラフ(Directed acyclic graph)をきれいにプロットする」ということが課題として残っていました。

ところが、よく考えたらDAGはワークフローエンジン等でよく使われている概念で、ワークフローエンジンで、タスクの順番をきれいに可視化する機能はよくあります。

例えば、以下の記事でも次のような紹介があります。

qiita.com

ジョブ依存関係の可視化

Hashだけだとジョブの全体図が分かり辛いのでgraphviz形式でジョブの全体図を出力できます。

graphサブコマンドにジョブネットのクラス名を渡します

上で使われているGraphvizを使えば、自分のグラフもきれいにプロットできそうです。調べたところ、networkxからPyGraphvizライブラリを経由してGraphvizを呼び出せることがわかりました。

qiita.com

Drawing — NetworkX 1.11 documentation

OS Xでは以下の2行でインストールできました。

brew install graphviz
pip install pygraphviz

これを使えば、簡単にDAGがプロットできます。画像はフィクションです。

f:id:takeshi0406:20170627003101p:plain

【Python】仕事の依存関係を有向非巡回グラフ(Directed acyclic graph)として整理するツールを作りました

特にデータ分析周りの仕事で、

  • 「プログラムを書く」前に「設計」と「プログラミング言語の選定」が必要
  • プログラミング言語の選定」の前に「設計」が必要
  • 「設計」の前に「稟議を出す」「個人情報についての取扱を調べる」が必要

といったような、タスクの依存関係がひどくて整理のつかない状態に陥ってしまいがちなため、それを解消するために作ったツールです。

集合・位相入門の半順序集合の章を読んでいるときに思いつきました。 元々は、Haskellの練習として、Ord型クラスで半順序集合を表現するようなコードを書いていましたが、グラフの扱いが慣れた言語でないと案外難しかった(また、冗談みたいですがYamlのパース方法が分からなかった)のでPythonで書きました。

↑のようなタスクの依存関係をひたすら以下のようなyamlファイルに書き出して、

# tasks.yml
- name: write product code
  deps:
    - fix design
    - choose programing language
    - request for budget(ringi)
    - make a mock-up
- name: choose programing language
- name: request for budget(ringi)
    - talk to legal department
- name: talk to legal department
- name: releace
  deps:
    - write product code
    - code review
- name: code review
    - write product code
- name: make a mock-up
  deps:
    - choose programming language

コマンドを実行すれば、

# save as NetworkX graph
ordmap tasks.yml tasks.png

# save as pajek format
# see also https://networkx.github.io/documentation/networkx-1.9/reference/readwrite.html
ordmap tasks.yml tasks.net --save_as pajek

以下のような図や有向グラフを表したファイルが出力されます。

f:id:takeshi0406:20170625224803p:plain

*vertices 8
1 "write product code" 0.0 0.0 ellipse
2 "fix design" 0.0 0.0 ellipse
3 "choose programing language" 0.0 0.0 ellipse
4 "request for budget(ringi)" 0.0 0.0 ellipse
5 "make a mock-up" 0.0 0.0 ellipse
6 releace 0.0 0.0 ellipse
7 "code review" 0.0 0.0 ellipse
8 "choose programming language" 0.0 0.0 ellipse
*arcs
1 2 1.0
1 3 1.0
1 4 1.0
1 5 1.0
5 8 1.0
6 1 1.0
6 7 1.0

「このタスクの前にこのタスク」という関係を枝で繋いでいるだけではなく、「Cの前にB」「Bの前にA」「Cの前にA」という関係のときに「A→B→C」という関係まで簡略化されます(A→Cの枝が省略されます)。要するに、半順序集合のハッセ図をプロットしています。

この作業をtransitive reduction(推移簡約)というそうです。Pythonグラフ理論を扱うライブラリのNetworkXでは開発中のver2.0に実装されていたので、それを参考に実装しました。

また、NetworkX(と裏で動いているmatplotlib)でUTF-8をプロットする方法が案外面倒なようなので、いまのところ日本語を入れると文字化けするし、ハッセ図をそれなりによくプロットする方法が分からなかったので図示はかなり酷いと思います。

ただ、うまくいけば分析基盤周りのバッチ処理(このデータの前にこのデータを用意しなきゃいけないとかややこしいですよね?)を整理する際も、同じような発想でできるんじゃないかなと妄想しています。もうあるのかもしれないですけど。

github.com

順序集合(Ord型)で仕事のロードマップ(Loadmap)を作るという意味でordmapという名前にしたのですが、Haskellじゃなくなったので微妙かもしれません。