Hatena::ブログ(Diary)

UEI shi3zの日記 RSSフィード

2014-02-17

秒速で自分だけの流行歌を作ってみよう

電話のベルが鳴る

おいらは寂しくて

伝えたいこの気持ち

すきにするがいいさ

泣いてる場合じゃない

傷だらけのenchantMOON

涙なんかいらない

歌舞伎町のenchantMOON

 昨日、ゲンロンカフェで四回目の「ノンプログラマー・プログラミング講座」をやった。

 昨日のテーマは「プログラミング言語の歴史」ということで、色々なプログラミング言語でフィボナッチ数列を書くという実習をやったんだけど、すると質問タイムで「一体全体、なにが面白いと思って当時の人たちはプログラミングを勉強していたのでしょうか」と聞かれて爆笑してしまった。


 確かに、馴染みの薄いプログラミング言語を勉強するときはフィボナッチ数列とか、とりあえず処理が確実に解りやすいアルゴリズムを実装してみる。しかしフィボナッチ数列は、いつも同じ結果が返って来るから、それが面白いとか面白くないとかはどうでもいい。ただ文法を学ぶための例題だ。


 それは要するに「This is a pen」を英語で学ぶようなものだ。

 そんな英語を口にすることは日常的には一生涯あり得ないだろう。


 けど、「これはペンです」という日本語(そんな日本語も英語の授業以外では使わない)を例題として、それが英語に対応しているということが解りやすい例題としてはそれなりに良いのではないかと思う。


 これが「こんにちは」を「Hello」とかだと確かに実用性は高くわかりやすいが、文法の勉強にはならないし、だからといって「I love you」から教えるわけにはいかないような気もする。「Je t'aime」との対応も魅力的だが、やはり難し過ぎる。


 すると「This is a pen」という言葉の見事さが解って来る。ペンは外来語だから英語と日本語で互換性があるし、学ぶべきは「This is a」の部分だとわかる。そして「This」は「これ」だと教えられ、「is」は「です」であり、「a」は単体の名詞の前に付く前置詞だと習うわけだ。この一文だけでこれだけのことが教えられる。これはひとつの発明と言って良いだろう。


 とはいえ、丸一日、「何が楽しいのですか?」というものだけやっていても仕方がないので、「楽しいアルゴリズム」とは何か、ということを後半のワークショップでやってみた。


 その結果、作ったのが流行歌の自動生成システムだ。

https://fbcdn-sphotos-c-a.akamaihd.net/hphotos-ak-prn2/t1/1796694_10152946286575752_1156016647_n.jpg

http://coderun.9leap.net/codes/61055/index.html

 まあなんとなく流行歌みたいな歌詞を適当にホゲッと出力する。

 テーマの入力欄があって、そこに好きな単語を入れるとそれっぽくなる。

 冒頭の歌詞はこのシステムによって自動的に生成されたものだ。


 この簡単なプログラムのソースは http://code.9leap.net/codes/show/61055 にあり、誰でもForkして自分だけの流行歌を作れる。ただしコードの本体はmain.jsではなくindex.htmlにあるので注意。


 アルゴリズムとしてはまず適当にテーマや一人称、二人称、場所を設定し、それを適当に組み合わせてAメロを作ってる。

 本当はサビとかもやろうかと思ったが、これはこれでいいかと思ったのでこのままにした。

 テーマを変えると適当に歌詞っぽくなるのが面白い。

 たとえば「ふなっしー」を入れると

いつも思い出す

テレビばかり欲しがってたあなた

素直になれない

テレビを脱ぎ捨てて

涙のあと

あの日見たふなっしー

涙なんかいらない

茜色したふなっしー

 みたいな感じになり、「otsune」を入れると

otsuneが大好きだった君

君とわたしのこと

思い伝え切れなくて

この思い

君は知らんぷり

スーツだらけの渋谷

抱きしめたい

シルバーのotsune

 こんな感じになる。

 なかなか想像力を刺激する。

 プログラム自体を拡張してもまた面白いだろう。


 この手の遊びは、昔は月刊アスキーだとかログインだとか、そういう雑誌におふざけ的に載ってたんだけど、最近はこういう遊びがあることも知らないヤング(死語)も少なくないのではないかと思って敢えてやってみた。ちなみに僕はこの手の遊びはかなり好きなのだ。

 テーマの選択がキモだから、ぜひ遊んでみてください


http://coderun.9leap.net/codes/61055/index.html