クーの自由研究

素朴な疑問を実験します。ボクと一緒に螺旋階段を頂上まで登ってみませんか?貴方の影についていきます。

計算機音楽の自由研究(準備:その5)改めて自己符号化器をコーディングする

はじめに

昨年作った自己符号化器:AutoEncoderを改めてコーディングしなおすことにしました。

f:id:np2LKoo:20160820105358p:plain

f:id:np2LKoo:20170321031042j:plain

昨年はMNIST(画像:図形)をやりましたが、今年は自己符号化器で「サウンド:波形」を扱おうとしています。下の画像部分をサウンドに置き換えて学習させようとしています。

f:id:np2LKoo:20170326105716p:plain

Pythonも知らないときに、いろんなサンプルをもとにして作成しているので、読みにくい部分があります。

・コーディング規約って何?のときのプログラムで、寄せ集めなので一貫性がありません。自分でとっても見にくいです。

・MNISTがうまく学習できるように実験していったので、意図せず汎用性が損なわれているかもしれません。

・今回も汎用性を損なわないようにしたいですが、波形を処理することは意識する。当初の意図とは異なり、波形を「あえて」フーリエ変換やウェーブレット変換せずにやっていますが、場合によっては波形を直接学習することに特化するかもしれません。

・いろいろなパターンでやると意図しないエラーが発生してその都度手間がかかっているので、可変部分について汎用性を持たせます。(MNIST数字学習はデータ量が一定だったが、サウンド学習ではベース、ピアノだけとかシンセ系は除くなど、数を変えています。このような可変部分への対応などを行います)

再作成にあたって

Pythonらしいコーディングにします。

Pythonのコーディング規約に「PEP8」というのがあるようです。

このコーディング規約にならってコーディングしてみます。

バッチ学習部分を可変にします。

バッチ学習にすると不協和音をそのまま学習していることになる感じがしています。

バッチ数はもともと可変にしていましたが、10以下にできないコーディングにしていました。バッチなし(1つづつ全部学習する)にもできるようにします。

あいかわらず「日記形式無視」でだらだら書いていきます。

新着記事の機能でこの記事を見ていただいている方には大変申し訳なく思っております。最近は1つの記事を1週間程度かけてだらだら書いていくこともあるくらいです。暖かい目で見て頂くとうれしいです。

 

コーディング状況

コーディングの経過状況や、途中で感じたことなどを書いていきます。

 

 

 

 

計算機音楽の自由研究(実験:その2.1)完成したサウンドデータベースを機械学習してみる

ゆるゆる再開

実験その2では波形データをちゃんとした前処理もせず、むりやり「学習」してみました。(入力データは各音、12800サンプルの固定の長さにしている)

f:id:np2LKoo:20170815040419j:plain

入力した音の波形データをそのまま自己符号化器にかけているだけなので、「学習」といえるかどうか疑問を持たれる方もいると思いますが、(うまくいくかどうかは別にして)「学習」としてとらえています。

np2lkoo.hatenablog.com

実験2では以下のことを確認しました。

「ノイズは多い(かなりひどい)ものの、それなりの周波数特性の再現はできる(もしくはその「きざし」がある)」

「学習(復号)のゼロポイントがずれるのは、入力(学習)データでそのような(ゼロポイントがずれた)データが多数あるためである。」

「PDFで結果をレポートをするとき、(PDFに)音を乗せることができる」(実験:その2)に音の出るPDFを貼りましたが、同じものをここにも貼っておきます。

Acrobat ReaderかFoxitReaderでないと、音がでないかもしれません。

今回の実験ポイント

 ゼロポイントがずれたデータの学習はもう少し工夫が必要だと思います。この部分は先送りして、この(実験:2.1)では継続として、以下の2点+1について行う予定です。

・ゼロポイントがずれない、アコースティックな楽器のみを学習する。

f:id:np2LKoo:20170803195934p:plain こんな波形は学習対象外にします。

 ・PythonからマルチメディアPDFの直接作成方法があるか確認する(AcrobatAPIを使えばできるのは分かっていますが、高くて買えません。)

・音を学習する「フレーム」を細分化する必要性を感じています。フレームを細分化してどうなるかできたら実験します。(フレームポイントを可変にするか、固定にするか思案中です)

仮説/予想

 ・もうすこしすっきりした音の再現ができると考えます。

・マルチメディアPDFの構造はかなり複雑なので、仕様書を読み切れない、またはコーディングするスキルが不足する予感がします。

実験結果

中盤ですが、いろいろうまくいっていません。

シンセサイザー系の音を省いて学習したため?か、バリエーションが逆に乏しくなったのか?一層うまく学習しなくなっている感じです。(何を入力してもにたようなノイズしか再生しない(かすかに原音っぽくきこえるものもある程度))

・重みWについては、MNISTのように局所性のある(ある部分だけに注目したかのような)フイルタを期待しているが、一向にできる気配がありません。(音の場合は時間的な局所フィルタで理想的にはウェーブレット(もしくはガボールフィルタ様)のような形(時間的フィルタを含む形)を期待しています。)ただし、MNISTでも条件によってはまったく局所性をもたないのに、ちゃんと元の図形を再現できるケースも多かったので必須条件ではないと考えています。

・波形がどうしてもプラス方向にずれて、マイナス方向の波形はリミッターがかかったかのような形になります。波形が故意に崩れたような形になるのは学習データのせいだけではなかったようです。

・使用している自己符号化器は、(意図せず)細部調整によりMNISTの学習に最適化している部分があるのかもしれません。昨年作成した自己符号化器のロジックは、人気がでて大きくなっていった温泉旅館のように複雑怪奇になっている部分があり(よく言えば生物学的進化様)一度サウンド用(もしくは汎用)にフルスクラッチしたほうがよいかもしれません。

 

考察

 考えた末、今一度自己符号化器をコーディングすることにしました。

この実験は雨天順延Suspended、じゃなかった、一時中断します。

新しいプログラムができたら、また戻ってきます。たぶん実験その2.2にします。

では、また。

 

蛇足にして実は本編

 ほけきよ@プロクラシスト様に「チャンネル人工知能」様の存在を教えていただきました。どうも有難うございます。

www.procrasist.com

 「チャンネル人工知能」様は、ボクが目指す「youtuber」の目標そのものになってしまいました。話題の目のつけどころ、実験のポイント、演出、技術、オチ、どれも一流でございます。

すぐには手をだせませんが、ボクにとって「物理演算エンジン」が必須科目であることを理解しました。

3D系が得意な助手がいないので、誰かスカウトしてみます。おそらくは自分でやることになる気がします。3Dまで手を広げるとどれだけ時間があっても足りない感じですが、「物理演算エンジン(で計算できる空間)」という実験室(空間)を使えるようになるために、「2~3年の時間をかけてでも」マスターしたいです。いよいよグラフィックカードがないとどうにもならない気がしてきました。NVIDIA / voltaは一般用途版でも半精度の倍速計算できるようにならないかな~。

フリーでやるとなると、Unity(ユーザインタフェースとして)+ bullet(物理エンジンとして)+ Blenderモデリングレンダリングエンジンとして) くらいかなと思います。これと c++ の入門を(ブログネタではなく)来年の目標にしたいです。

 

おたまじゃくしさんのおーとまとん~小休止~

お盆(ぼん)です。ご先祖(せんぞ)様(さま)こんにちは。

全国の「おたまじゃくし」のみなさん。そして、全国の小中学生のみなさん。
こんににちは。memol(メモル)です。

f:id:np2LKoo:20170812030303j:plain

これはニャームコのご先祖様
マッピーというゲームに、永久(えいきゅう)パターンにおちいりそうなタイミングであらわれます。トランポリンの途中(とちゅう)でも触(さわ)るとミスになるよ。
 コインみたいだけど、墓石(はかいし・ぼせき)だよ。
マッピーが何なのかはおじいちゃん、おばあちゃんに聞いてみよう!

おじいちゃんより:昔のレトロゲームで、3DS版WiiU版もあるのじゃ。若いころはマッピーと、ドルアーガの塔(とう)とリブルラブルに青春(せいしゅん)をつぎ込んだのじゃ。マッピーゲーム音楽は、最高峰(さいこうほう)のひとつだと思う。マッピーファミコンミニに収録(しゅうろく)されなかったのが残念(ざんねん)じゃ。

 お盆ですね~。お盆は逆にすこし忙しいのです。
なので、すこしばかり小休止(しょうきゅうし:すこしだけおやすみすること)です。
かえるのクーは生きていましたね~。
クーのように、他の方の記事(きじ)や動画(どうが)をリンクして紹介(しょうかい)し、「しばらやくお休み作戦(さくせん)」します。♩♪♫♬♯♭♮ 🎼 🎶

f:id:np2LKoo:20170812123341p:plain

「おーとまとんとは」の説明は、無謀(むぼう)にもWikipediaへのリンクを貼(は)ってみるよ。
こちら。(有限(ゆうげん)オートマトンの説明のほうがくわしかったので、そちらをリンクしました)
なんのことかよくわからないけど、おもしろそうだね。ある状態(じょうたい)からある状態(じょうたい)へかわる規則(きそく)をまとめたものみたいだね。
このあたりを「音」をつかってやってみようと思います。

自分がやる前に、まずは諸先生(しょせんせい)がたがどのような取(と)り組(く)みをされたか紹介(しょうかい)します。(勝手(かって)紹介してすみません)

からあげ先生

セルオートマトンを使って音の実験をされています。

karaage.hatenadiary.jp

プログラムをダウンロードさせていただき、やってみます!

Engadget 日本語版様 Batuhan Bozkurt先生

シーケンサっぽいのがここちよいですね。

japanese.engadget.com

四角いバルーンをクリックすると、あたらしい版のデモがみれるみたいだよ。

ディレイとリバーブの使い方がちょっと「ずるい」です。

hujackus 先生

ライフゲームを使ったシーケンサです。

www.youtube.com

memolがやろうとしていたのと少し似てる感じがします。オリジナリティをだせるようがんばります。

golece576 先生

ライフゲームを使って音を出しています。
こちらの音の自由度は高めです。

www.youtube.com

スピードの違う3つのラインがセルを音として拾っているようです。

マンデルブロ集合」画像

 下はサウンドではありませんが、
ちょー有名(ゆうめい)な「マンデルブロ集合(しゅうごう)」の画像(がぞう)です。

こんな式

f:id:np2LKoo:20170812031018p:plainであらわされる(cの)集合(しゅうごう:あつまり)を画像(がぞう)にしたものです。(もう少し説明すると、

zと c は複素数(ふくそすう)という特別(とくべつ)な数字です。

z の 横の数字は何番目かをあらわすすうじです。ゼロからはじまり、1づつ増え、無限大(むげんだい)に近づきます。(n + 1とか、nの部分が回数です)

回数nが無限大に近づいても、z の値が無限大にならない(これを発散(はっさん)しないといいます)ような c の集合だそうです。

zの横の右上の 2 の部分は、数字を2回掛け算する意味です。zn × zn を略してあらわしたものです。

  つぎの数=前の数 × 前の数 + c

  最初の数は、ゼロからはじめるよ。

ずっと計算していっても、次の値が無限大に近づかない  c がどんな数字なののかを考えるよ。

なんだ、そんなに難(むず)かしくなさそう。

(主役は c の部分!)これをグラフィックに表したそうです。

 

模様(もよう)の境界(きょうかい)の部分は「カオス」(混沌:こんとん:ぐちゃぐちゃなようす)と「秩序」(ちつじょ:ととのっているようす)の境目(さかいめ)です。「カオスの縁(ふち)」とも呼(よ)ばれています。秩序(ちつじょ)は単純(たんじゅん)で、カオスは(むちゃくちゃでわけわかんない)ですが、カオスの縁は(あるときは芸術(げいじゅつ)的(てき)、あるときは生き物みたい、あるときはとても複雑(ふくざつ)だけどなにか特有(とくゆう)のパターンがありそう)興味(きょうみ)深(ぶか)いです。

自己相関(じこそうかん:自分のある部分が他の部分とよくにていること)みたいです。でも、マンデルブロの画像はそれぞれの似ている形は「まったく同じものはなくすこしずつ違う」そうです。

気が遠(とお)くなります。寝(ね)てもいいですが、気を失わないように注意してください。
宇宙(うちゅう)を感じる人も、曼荼羅(まんだら:仏様がさとった境地(きょうち:さとりのこころ)を絵にしたもの)を感じる人もいるようです。
音楽も「ある部分」が「別の部分」に「にている」ところがあるよね。
いっぱんてきな音楽と映像(えいぞう)の共通点(きょうつうてん)を考えながらみてください。
全部見ると人生(じんせい)を悟(さと)ってしまうかもしれないので、途中(とちゅう)パターンがだいたいわかってきたら、飛ばして、最後(さいご)のほうはみてください。(おたまじゃくしや、小中学生が悟(さと)ってしまうと大人(おとな)が困ります。)
(最後(さいご)のほうも到着(とうちゃく)地点(ちてん)ではないのですが、memolは「おおお!」となりました。)

「夢(ゆめ)にみそう」なぐらいまでは、見つめないでね。(画像(がぞう)を大きく表示すると迫力(はくりょく)があるよ)

www.youtube.com

 どれくらいかというと、全宇宙からははじめて素粒子(そりゅうし:「ぶんし」や「げんし」よりも小さいよ)よりもずっと小さいところをみているスケール感(かん)らしいです。たまに左上にどれくらい拡大(かくだい)したかでてきます。10^0(たとえでゼロ階)から10 ^ -227(たとえで地下227階)におりる感じで、1階おりると10倍に拡大(かくだい)していく感じです。

 

では、ご先祖さまに会ってきます。

 

生存報告_2017_08_12版

いきてるよ~

2017年8月12日現在、かえるのクーは生きていることをご報告申し上げます。

さて、memol(メモル)におたまじゃくしさん向けの「ネタ」をやってといったら、ナナメ上のプログラムを作られてしまい、驚きました。どうも有難うございます。

memolは「ゲーム」として完成させたがっていたのですが、「ネタ」レベルに留めるようお願いしたのはボクです。ご容赦ください。本編のオートマトンの「ネタ」をどんどんすすめてもらいます。(memolが暇な期間だけになります)

さて、完全に休暇モードにはいっているボクは全く実験していません。「小充電期間」として情報収集しているところです。

おもしろいものはいろいろありましたが、中でも下の「バクテリア細胞質の全原子分子動力学シミュレーション 」は「おおお!」と叫ぶくらいおもしろかったです。どこがおもしろいのかは説明が難しいですが、ボク的には「君の名は。」レベルであったと言っておきましょう。フルスクリーンで見ると迫力満点です。ご覧になる場合はぜひフルスクリーン(HDモード)で!

www.youtube.com

今回はまったくこれ「だけ」の生存報告です。

理研様へリクエスト:是非「セントラルドグマ」の全原子分子動力学シミュレーションやってください!!!(是非、このCG/音楽スタッフで)

では、またお会いしましょう。

 

広告を非表示にする

おたまじゃくしさんのおーとまとん~インストール編

おたまじゃくしさんのおーとまとん~インストール編

 さらにおたませしました!
全国の「おたまじゃくし」のみなさん。そして、全国の小中学生のみなさん。おとうさん、おかあさんからお許しはでましたか?
プログラムのインストール(プログラムを入れて動くようにすること)をおこなってみましょう。ちょっと長いけどがんばってみましょう。

f:id:np2LKoo:20170810000944j:plain

Windows 10というOS(オペレーティングシステム)にソフトウェアを入れるのを例(れい)にして、説明(せつめい)します。
Mac(まっく)の人やLinux(りなっくす)の人やD-Wave(でぃーうぇーゔ)というマシンやOSを使っている人は申(もう)し訳(わけ)ありませんが他のブログを探(さが)してみてください。

ソフトウェアをダウンロードしたり、インストールをするときのお約束(やくそく)。

はじめて、ネットを冒険(ぼうけん)する人は長いけど必ず読んでね。聞いたことある人は、ここは読まなくてもいいです。 

・ソフトを入れるとき(最初はわからなくても)説明(せつめい)をひとおりよく読もう。
・間違(まちが)ってクリックして「ほしそうな」ところはクリックしない。(そんなふうにつくってあるページもあります)
・英語(えいご)は「言葉(ことば)」だと思うと「読(よ)めないとわからない」感(かん)じがしてしまいますが、「記号(きごう)」だと思ってしまば、あまりこわくなくなるかもしれません。Downloadだとか Install という文字を探したりや、他の日本語のインストールの説明をよく読みましょう。
・なんでも「OK」していけばいいわけではありません。ある程度(ていど)は何を操作(そうさ)しているのか、分かって(または想像(そうぞう)しながら)やりましょう。
・何か「やばいんじゃないかな」と感じたらそれ以上操作(そうさ)せず:閉じることもしない!おうちの人に相談(そうだん)しましょう。

(なにかいっぱい起動(きどう)したとか、

音が鳴(な)りやまないとか、

赤色のやばそうや場面がでたり、

鍵マークや、暗号化を解除(かいじょ)するにはお支払いくださいが出たとか、

何度閉じてもメールアドレスや名前を入れろといわれたり、

「おめでとうございます。1000万円当選しました。下のURLをクリックしてね。」と表示されたり。

「ウィルスに感染しました。下のURLでいますぐ確認できます。」

「不正にコピーされたプロダクトを使用されています。下のURLで詳細確認ができます。」

とにかくやばそうなところはクリックしない。

ウィルス検出(けんしゅつ)ソフトが何か表示した場合もそこで操作をやめて(閉じずに)、かならずおうちの人に相談(そうだん)しよう。

(ウィルス検出ソフトを偽装(ぎそう:いんちきしてまねること)こわがらなくてもいいけど、本当にこんなふうにでるあぶないところもネットの上にはあります。

(ふつうは手順にしたがっていればこんなことになることはないので、あんしんしてね)

もしおかしくても、最初の対応(たいおう)を間違(まちが)えなければ、ほとんどの場合問題ありません)注意(ちゅうい)は必要(ひつよう)だけど怖(こわ)がることはありません。


・(ふつうは)小中学生のひとは「じぶんの名前や生年月日(せいねんがっぴ)、住所(じゅうしょ)、電話番号(でんわばんごう)、メールアドレス」などを入れるところがあっても入れてはいけません。

どうしてもいれないといけないときはお家(うち)の方と相談しましょう。

・ふつうのパソコンにははいっていると思うけど、ネットをいろいろ探検(たんけん)したり便利(べんり)そうなソフトにチャレンジするときは「ウィルス検出(けんしゅつ)ソフト」がはいっている必要があります。なかには「期限(きげん)切(ぎ)れ」のまま使っているひともいるかもなので、注意しよう。

操作手順(てじゅん)を説明しているとおりにやっていればまず、このようになることはありません。

操作に慣(な)れてくると、どこでもクリックしてチャレンジしてみたくなるので、そのころになると改めて注意が必要です。

・おとうさん、おかあさんが同じパソコンで「ビットコイン」などのネット上の通貨(つうか:おかね)を扱っている場合は、基本的に小中学生の方はそのパソコンで操作しないでください。

(その場合、おとうさん、おかあさんが「つかっちゃだめ」というと思います。)

 anaconda(Pythonもはいっています)とPyCharmと作ったプログラムを入れます

お家のみんなで使っているパソコンや、おとうさん、おかあさんのパソコンにいれるとき。
Python(ぱいそん)がはいっているか確認しよう。

スタートボタン(画面(がめん)の右下にある窓マークをクリックしてメニューを表示(ひょうじ)しAではじまるところにanaconda(あなこんだ)とか、pではじまるところにPythonとかPyCharm(ぱいちゃーむ)とかがあるかみてみよう。

Pythonがはいっているときはバージョンを確認しよう!

anacondaがはいっているときは、anacondaメニューの中にIPython(あいぱいそん)というメニューがあるかもしれません。

起動(きどう)してみましょう。

f:id:np2LKoo:20170810002634p:plain

pythonのあとが3ではじまればOKです。2で始まる場合は3を入れる必要(ひつよう)がありますが、おうちの人に聞きましょう。

「Python2を消していれていい」「Python2とPython3を共存(きょうぞん)させたい」「実はもうPython2とPython3を切り替えられるようになっている」などを教えてもらいましょう。

入っていない場合として説明します。(Python2が入っているときはgoogleなどで消し方や共存(きょうぞん)の仕方(しかた)を探(さが)してみてください)

準備(じゅんび)

慌(あわ)てないで、のんびりやろう!

1. はいっているOSを確認しよう

(1)画面左下にあるWindowsマーク(スタートボタン)の上にマウスを合わせて、ボタンをクリックしよう。

f:id:np2LKoo:20170810003211p:plain

(2)メニューがでるので、「システム」をクリックします。Windows 10 の情報が表示されるよ。

f:id:np2LKoo:20170810003242p:plain
(3)システムの種類のところにかいてある内容を確認しましょう。
32ビットオペレーティングシステム
とか
64ビットオペレーティングシステム
という言葉が書いてあると思います。
この 32 とか 64 という数字がとても大切なので、忘れないように覚えておきましょう。

memolのパソコンは64ビットと書いてありました。

 2. anacondaをダウンロードしてインストールしよう

anacondaとはpythonとよく使うライブラリ(部品の図書館ようなもの)をまとめてあるソフトウェアです。検索してダウンロードしよう!

(1) ブラウザを起動(IEでもedgeというのでもOK)

IE(いんたーねっとえくすぷろーら)をメニューや画面の上から探してクリック(またはダブルクリック)。こんなの(IE)や、

f:id:np2LKoo:20170810004003p:plain

 こんなの(Edge:えっじ)のマークを探してクリック(またはダブルクリック)

f:id:np2LKoo:20170810004033p:plain

このページをみているので、ブラウザは起動できているけど、このページをみながらインストールするときはもうひとつ起動した方が便利(べんり)かも。

(2)ブラウザの入力欄に http://www.google.com と入力しよう。

f:id:np2LKoo:20170810004515p:plain 

google とだけいれても検索してくれるはず。)

(3) googleの検索欄に

anaconda download

と入力して虫眼鏡(むしめがね)ボタンをクリックしよう。

anacondaというソフトをゲッドできる場所が表示されるよ。

f:id:np2LKoo:20170810004805p:plain

(4)上の画面でDownload Anaconda Now!の色が付いた少し大きなリンクをクリックすれば 、ダウンロードができるページが表示されるよ。

f:id:np2LKoo:20170810004930p:plain

Download for: の横の窓枠(まどわく)の形をクリックすれば、Windows用の anaconda がダウンロードできる画面に移(うつ)るよ。

四角い窓枠はWindowsマイクロソフトいう会社のういんどうずというOS:おーえす)

かじったりんごはMac(まっくというパソコン、アップルという会社のOS X(macOS)というなまえのOS:おーえす)

すわったぺんぎんさんはLinux(りなっくすというOS:おーえす)

です。

(5)うえで覚えた32ビットか64ビットかの情報をここで使います。

64ビットだった人は、左側3.6 Versionの Download と書いたすこし大きなボタンをクリックしてください。

32ビットだった人はその下の Download 32-bitリンクをクリックしてください。

f:id:np2LKoo:20170810005145p:plain

(6)なにか入力する画面がでてくるけどここでは「NO THANKS」(いいえ結構です)のリンクをクリックします。

f:id:np2LKoo:20170810005547p:plain

ちなみに「ANACONDAをダウンロードしてくれてありがとう! Anacondaの進め方のシートがほしい人はメールアドレスをいれてね。」みたいなことがかいてあります。

今は不要なので、NO THNKS をクリックしてください。

その下の「操作を選んでください。」の部分の「保存」ボタンをクリックします。

exeファイルが保存されます。途中はこんな感じです。この表示のときはどこもクリックせず、しばらく待っていてね。

f:id:np2LKoo:20170810010045p:plain

5分程度でダウンロードできると思います。

(7)ダウンロードが終わったら下の表示にかわるので、「実行」ボタンを押します。

f:id:np2LKoo:20170810010149p:plain

インストールの画面が表示されます。念のためbit数が合っているか確認してください。

f:id:np2LKoo:20170810010231p:plain

ようこそ Anaconda3セットアップへ

他のアプリケーションは終わらせてください。インストールで再起動はしません。Nextをクリックすると継続します。みたいなことが書いてあります。

(8)Next> ボタンをクリックします。

 

ライセンスの合意(ごうい)画面がでてきます。

f:id:np2LKoo:20170810010629p:plain

ライセンスの説明が書かれています。
ライセンスとは権利(けんり)を持っている人(たとえばつくった人)が、「つかってもいいよ」と認(みと)めてくれることだよ。
(たとえば運転免許証(うんてんめんきょしょう)も「ライセンス」なんだよ。運転してもいいよという証(あかし)です。)
ほかには、使ってもいい条件とか、他のつかっている技術(ぎじゅつ)とか、これはやっちゃだめなこととかの注意(ちゅうい)が書いてあります。
これを読んで合意できればソフトを使ってもいいよということです。
勉強用(=遊び用)に使うのであれば問題(もんだい)ないので、I Agree(合意します)のボタンをクリックしましょう。

(9)使う人を選ぶ画面がでてきます。

f:id:np2LKoo:20170810011124p:plain

自分だけなら上の(Just Me)
パソコンを使う人全部が使えるようにするには(All Users)を選びます。
自分で使うだけならJustMeのままでよいです。

〇印のところをクリックすれば選べるよ。

 Next> ボタンをクリックします。

(10)ソフトを入れる場所をきいてきます。

f:id:np2LKoo:20170810011228p:plain

普通はそのままでよいので Next> をクリックします。

左下にどれだけ必要か書いてあります。 1.9GB 使うのでとても大きいです。

(11)環境設定(かんきょうせってい)に関するインストールオプションがでてきます。

f:id:np2LKoo:20170810011413p:plain

普通はそのままでOKです。Install をクリックします。

 

f:id:np2LKoo:20170810011546p:plain
かなり時間がかかります。30分以上かかるかもです。
anacondaはpythonの他にいろいろなライブラリをインストールします。

completed と表示されたら終わりです。Next> をクリックします。

(12)下の画面がでたら、完了します。チェックボックスを選択すると、説明が表示されますが、今は不要なので、チェックせずにおわります。

f:id:np2LKoo:20170810011613p:plain

Finish(おしまい) をクリックします

ではうごかしてみましょう。

f:id:np2LKoo:20170810011944p:plain

画面右下のスタートボタンをクリックしてメニューを表示し、Aの部分にあるAnacondaのフォルダメニューを開き、Anaconda Promptをクリックします。

f:id:np2LKoo:20170810012141p:plain

上のような画面がでました。対話形式(たいわけいしき:1つ命令をいれると答えがすぐでる)でpythonがうごきます。1+1 と入れた後、[Enter]キーを押したら、2 と出ました。([Enter]の部分は、少し右側にあるいちばん大きなキーを押す意味です。)

終わらせるには exit() を入力して[Enter]キーを押します。(かっこの部分は右か左の 白上矢印Shift のキーを押しながら 上の8と9を順番に押せば入力できるよ)

(ウィンドウの「×」で終わってもいいです。)

上の例では Python 3.6.1 が動きました

ここまでで、anacondaのインストールは完了です。

 3. 次にPycharmをインストールします。

PyCharmは開発をするための統合開発環境(とうごうかいはつかんきょう。IDEともいうよ)です。

(1) anacondaと同じように

PyCharm download

で検索してみよう。f:id:np2LKoo:20170810012512p:plain

(2)上のほうのリンクをクリックすると下の画面が現れました。

f:id:np2LKoo:20170810012543p:plain

左側の青いボタンがProfessional(プロフェッショナル)版の無料お試し版、右側がCommunity(コミュニティ)版です。コミュニティ版は無料(Free)です。右側の黒色Downloadボタンをクリックします。

(3)Pycharmのダウンロードが開始されます。

f:id:np2LKoo:20170810012834p:plain

保存ボタンをクリックしてください。

(4)ダウンロードが進みます。状況によっては20分以上かかるかもしれません。

下の画面がでたら、そのままどこもクリックせずに待っていてください。

f:id:np2LKoo:20170810012952p:plain

(5)ダウンロードが完了したら「実行」ボタンをクリックします。

もし「このアプリがデバイスに変更を加えることを許可しますか
PycharmPC-...」
のような小窓がでたら、「はい」をクリックします。

(6)インストール用の画面が表示されます。

f:id:np2LKoo:20170810013151p:plain

ようこそ。他のアプリケーションは終了してください。インストールで再起動することはありません。(anacondaと同じことが書いてあります)

Next> ボタンをクリックします。

f:id:np2LKoo:20170810013357p:plain

インストールする場所は普通そのままで良いです。408.9MBくらい使うようです。

Next> をクリックします。

f:id:np2LKoo:20170810013454p:plain

画面に起動用のアイコンを作ります。64bit版か32bit版にあわせて選択して Next> ボタンをクリックしてください。

f:id:np2LKoo:20170810013553p:plain

メニューを聞いてきます。JetBrainsのメニューの下にできます。

ちなみにJetBrainsは会社名で「チェコ」(首都はプラハ)の国の会社です。

そのまま、Install ボタンをクリックします。

f:id:np2LKoo:20170810013823p:plain

完了すると下の画面が表示されます。

f:id:np2LKoo:20170810013855p:plain

インストールは5分くらいでできました。

Finishボタン(おしまいボタン)をクリックして完了です。

4.  音の実験でよく使うpyaudioというライブラリを入れます。

anacondaはいろいろなライブラリがはいっていますが、残念ならがpyaudio(ぱいおーでぃお)は入っていません。自分でいれてやる必要があります。

(1)画面左下のスタートメニューから「Anaconda Promot」(あなこんだ ぷろんぷと)を起動します。

f:id:np2LKoo:20170810014205p:plain

(2)Anaconda Promptが起動します。

f:id:np2LKoo:20170810014302p:plain

(3) pip  install  pyaudio

と入力  して、[Enter]キーおします。

f:id:np2LKoo:20170810014330p:plain

ネットワークから pyaudio というライブラリをゲットしてインストールします。

Successfully の文字がでれば成功です。

おわるときは右上の「×」をクリックしてください。

5.  PyCharmを起動します。

(1)画面の上の下のようなPyCharmアイコンをダブルクリックします。(もともとたくさん画面にアイコンがある人はどこかにありますので、探してください。)

f:id:np2LKoo:20170810014603p:plain

(2)最初だけ、情報を引(ひ)き継(つ)ぐかどうかの確認を聞いてきます。

最初なので、下の引き継がない下側の選択のまま OK をクリックします。

f:id:np2LKoo:20170810014632p:plain

(3)プライバシーに関する説明が表示されます。

f:id:np2LKoo:20170810014743p:plain

入力された個人の情報をどのように扱うかを説明して、それでいいか聞いてきています。ここまで、個人情報を入れていませんし、これからも入れないと思いますが、一般的な問題ない内容が書かれているので、Accept(受け入れ:OK)します。これは一度だけ表示されます。

(4)ソフトウェアの起動の画面が出ます。(こういう画面を、スプラッシュ画面といいます)

f:id:np2LKoo:20170810015337p:plain

(5)起動画面がでます。(他にいろいろ確認してくる場合があります)

下の場面はそのままOKクリックしてください。画面の見え方やキー操作の種類を選びますが、こだわらない人はそのままOKでいいです。

f:id:np2LKoo:20170811161654p:plain

下の画面はいろいろな操作の紹介をする画面です。Closeをクリックして閉じましょう。

f:id:np2LKoo:20170811161832p:plain

下の画面が最初の画面です。

1つのソフトウェアは、何本ものプログラムが動くものもあります。そのプログラムをまとめたものを「プロジェクト」といいます。(呼び方はいろいろあります)

「新しいプロジェクトをつくる(Create New Project)」をクリックします。

f:id:np2LKoo:20170810015613p:plain

プロジェクトの名前を聞いてきます。

f:id:np2LKoo:20170810015951p:plain

はじめは名無し(untitled)なので、プロジェクトの名前を入力します。

オートマトン(Automaton)にします。(ここは日本語にしない方がよいです)

f:id:np2LKoo:20170810020121p:plain

新しいプロジェクトが起動します。

f:id:np2LKoo:20170810020224p:plain

最初の起動時にはいろいろ設定を行うので、すぐにはプログラムを動かせない場合があります。(20分くらい、いろいろ初期設定することがあります)

しばらく設定中になるので、その間に今回作ったプログラムのをダウンロードしましょう。

6. 音のでるソフトウェアとデータをダウンロードします。

今回のプログラム(Automatonをダウンロードします。)

ダウンロードはこちらからお願いします。

f:id:np2LKoo:20170810020557p:plain

が表示されますので、「保存」をクリックします。その後は、完了になるまでしばらく待ってください。

f:id:np2LKoo:20170810020734p:plain

次に「フォルダを開く」をクリックします。

ダウンロードできた Automation_日付.zipのデータを解凍(かいとう)します。

 Automation_日付.zipファイルの上で右ボタンクリックして「すべて展開」を選択します。(はいっている解凍ソフトによっては表示もメニューも違う場合があります。また、.zip の部分はパソコンによっては表示されません。)

f:id:np2LKoo:20170811220746p:plain

次にどこに解凍するかきいてみます。(きいてこないソフトもあります)

f:id:np2LKoo:20170811221022p:plain

(ファイル名等は今後かわることがあります。)解凍すると下のようなファイルができます。

f:id:np2LKoo:20170811221101p:plain

次にコピー先のPythonのプロジェクトのフォルダを開きます。

〇ここに入力して検索 の欄(らん)で exp と入力すれば「エクスプローラ」が検索にあらわれますのでクリックします。(他の起動方法を知っているひとはもちろんそちらでOKです)

f:id:np2LKoo:20170811221205p:plain

左側の一覧から「ローカルディスク(C:)」を選択(クリック)します。

右にでてくる ユーザ を選択(クリック)します。

f:id:np2LKoo:20170811221403p:plain

次にでてくる自分のログインIDの名前をクリックします。例ではmemolです。(ログインIDはmemolです。)

f:id:np2LKoo:20170811221407p:plain

f:id:np2LKoo:20170811221940p:plain

いろいろ表示されますが、「PycharmProjects」を選択(クリック)します。

似たようなフォルダで「.Python」というのがありますが、そちらではありませんので注意しましょう。

f:id:np2LKoo:20170811221933p:plain

さっき作った Automatonというプロジェクトがありました!

クリックします。

f:id:np2LKoo:20170811222109p:plain

まだ中身はからっぽぽです。

ここにダウンロードしたソフトを移動します。

先ほどのダウンロードしたウインドウを探します。

そして、ホームメニューから「すべて選択」をクリックします。

f:id:np2LKoo:20170811222148p:plain

表示されたファイルがすべて選ばれるので、ドラッグ アンド ドロップ((元画面の)左ボタンクリックして左側画面の上で離します。

f:id:np2LKoo:20170811223008p:plain

下のようになりました。( _pycache_ はできていないこともあります)

これでOKです。f:id:np2LKoo:20170810021646p:plain

7.PyCharmでプログラムを動作させてみます。

PyCharmインストール直後(ちょくご:すぐに)は実行(じっこう)しようとしても実行できないことがあります。
自動的(じどうてき)にpythonやモジュールのアップデートをする場合があります。
終わるまでプログラムの実行はできません。待ちましょう。
かなり時間がかかる場合があります。

 (1)プロジェクトのフォルダにコピーするとファイルが表示されます。
Automaton001.pyのファイル名の上で、右ボタンクリックでメニューを表示し、RUN 'Automaton001'をクリックします。

f:id:np2LKoo:20170810022941p:plain

※設定中の場合はRun のメニューが出てこないことがあります。

f:id:np2LKoo:20170811162230p:plain

このようにRunが出てこない場合はもうしばらく待っていてください。画面の右下で処理実行中みたいな表示が出ているときはまだ設定中です。

f:id:np2LKoo:20170811162315p:plain

問題なければ、プログラムが起動するはずです。使われているパソコンの環境(かんきょう)によってはエラーでてして動作(どうさ)しない可能性(かのうせい)があります。まわりの人に聞いてもわからないときは来年のなつやすみにまたチャレンジしてください。

f:id:np2LKoo:20170810023404p:plain

ヘッドフォンやスピーカの接続を確認して、音量を絞(しぼ)って(ちいさくして)、拍子とサブ拍子、スピードを選択してから、スタートボタンを押してください。

音量は小さめで実行してください。(必ずすごくちいさな音からだんだん大きくしていこう。大きな音をずっと聞くと耳を傷(いた)めるよ。気をつけよう。

どうでしょう?うまく動きましたか?

16個の音がすべて白い範囲(はんい)になるようにチャレンジしてみてください。

パソコンの種類によっては音が途切(とぎ)れたり、タイミングと違った場所に点が描(えが)かれる場合があります。
ご了承(りょうしょう)ください。

また、ゲームとしては作り込みがまったく足りません(ゲームにはなっていません)。音で遊ぶことがメインなので、ゲーム性はご容赦(ようしゃ)ください。

このプログラムをベースにいろいろな音(列)の実験(というよび遊び)をしようと思います。

だそく(蛇足:むだなあとがき、よけいなひとこと、でも「ほんね」がでることも多い)

 さて、このソフトで「おーとまとん」の部分(ぶぶん)はどこでしょう?

こたえはリズムを入力した「あなた」です。 

(半分冗談(じょうだん)ではんぶん本気(ほんき)です)

 「そんなわけないでしょ!」と「だから、オートマトンてなんなの?」という声がきこえてきそうです。おいおい解説(かいせつ)していきますね。

じっさいに、小学生の方に操作(そうさ)してもらい感想(かんそう)を聞きました。解凍(かいとう)の部分の説明不足(せつめいぶそく)が分かったので書き加(くわ)えます。どうにか説明だけで、最後(さいご)までたどり着(つ)けました。

感想(かんそう)を聞(き)いたら、

「つまらん。」「途中(とちゅう)で眠(ねむ)い」

だそうです。もっと面白(おもしろ)くなるよう、努力(どりょく)が必要(ひつよう)だと痛感(つうかん)しました。また、10分以上待つのはたいへん困難(こんなん)であると理解(りかい)しました。

クーへ:ほらね、ゲームとして完成度が高くないとだれも面白いと思わないって。

 ほんとうにどうでもいいはなし(よまなくてもいいよ)

 「次はどうすればいいの?」

「ここまでできた方(かた)は、もうかなり、自分(じぶん)でできます」

googleで検索(けんさく)できます。(どんなにゅりょくをすれば、自分のほしい情報(じょうほう)が1ページ目にでてくるのか研究(けんきゅう)しよう。)

(キーボードの練習(れんしゅう)をしよう。Cortana(こるたな:Windows10の音声認識(おんせいにんしき))はありますが、それにたよらず、まずはキーボードで、キーボードをキーを見ないで、入力できるように練習しましょう。1年くらい(まじめに)練習すれば、書くよりはやくなります。3年くらい練習すればしゃべるよりはやく打てるようになります。5年くらい練習すれば、普通(ふつう)のキーボードではタイミングが間に合わなくなります。そんなときはNキーロールオーバーというキーボードを使えば正しく認識してくれます。キーボード入力はちゃと練習しないといつまでたってもうまくなりません。ちゃんと練習しましょう。)

・解凍(かいとう)できます。(いろいろな解凍をできるようになろう)

pythonのプログラムを動かせます。(動かすだけでなく、そのうちちょっと作ってみたくなるかも。)

・英語をすこしわかったかも

Install とか Download とか Run の言葉を覚えました。

英語ちょっと苦手な人多いですよね。memolも苦手です(けど、嫌(きら)いではなくなりました。)世(よ)の中の人と反対(はんたい)のことを言いますが、まずは読めればいいんです。読めるようになると、英語のサイトがなんとなく(全部わかるわけでなくても)普通(ふつう)に見れるようになります。実際(じっさい)普通に勉強していると、英語を話せる前に読み書きできるようになります。(実はふつうの大学生(だいがくせい)は英語を(ほんとうに)話せません。(びっくりするかもしれませんが、6年間や10年間英語を勉強しても「だいたいの人は本当に英語をしゃべれません。」)でも、「6年間や10年普通に勉強すると、簡単(かんたん)な(または専門(せんもん)分野(ぶんや)の)英語なら読み書きできる」ようになります。まぁ、10年間やっててればあたりまえですが。

でも社会人になって3年くらい英語を全くやらないと、ほぼ完全に忘れるみたいです。お家でCNN(しーえぬえぬ:外国のニュースのチャンネル)ニュースとかが見れる人はわかんなくていいから、毎日10分みよう!(内容わかんないのに10分みるのは苦痛だけど)

英語でコメントといっても3語から3行程度の中学校の英語です。
「言葉(ことば)は文法(ぶんぽう)ではなく、気持(きも)ちです」たくさん読(よ)んでいると少し書(か)いてみたくなります。書いて相手から返事(へんじ)があるととってもうれしいです。

そう考えると、明日から英語を勉強するのが好きになるかも?。

おたまじゃくしさんのおーとまとん~拍子編(プログラム)

おたませしました

おたまじゃくしのみなさん。全国の小中学生のおともだち。おまたせしました!

ゲームとしてもうすこしちゃんと作るつもりだったのですが、かえるのクー(このブログの主(ぬし))と相談(そうだん)して、実験レベルのものを公開(こうかい)することになりました。このページには2つのプログラムをはります。(インストールの仕方(しかた)と、ダウンロードの準備はもう少し待っていてね。→できました。)

まだ調整(ちょうせい)していないプログラムなので、何回か入れ替(か)えするかもしれません。

f:id:np2LKoo:20170807233625p:plain

バージョンというところをみて、かわっているかどうか確認(かくにん)してください。プログラムをインストールするときは、かならず家の人のお許(ゆる)しをもらってから入れてください。

プログラムとデータはまとめて他のところからもダウンロードできるようにしておきます。(データはここにはれないので、ダウンロードしてください)

どんなのかソースだけみたい人のために貼(は)ります。遊びたい人はダウンロードからお願いします。どのようにインストールするかは「インストール編」をみてください。

np2lkoo.hatenablog.com

本体のプログラム(現在 V 0.2017.08.07 です)

Automaton001.py


import sys
from PyQt4.QtGui import *
import PyQt4.QtGui as QtGui
from VWave import VWave
from sklearn.datasets.base import Bunch
import pyaudio
import threading
import time
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

'''
-------------------------------------------------------------------------
このプログラムは「おたまじゃくしさんのおーとまとん」の(拍子編)プログラムです。
Memol V.0.2017.08.07
-------------------------------------------------------------------------
'''
WAVE_DB_FILE = "H:\\KooSoundDB\\soundbox.wav"
SUBWAVE_SIZE = 12800 * 2
SAMPLING_RATE = 16000
STRONG_BEAT_NO = 34
SUB_STRONG_BEAT_NO = 29
WEAK_BEAT_NO = 22
CLECK_BEAT_NO= 10
BEAT_OFFSET = 0.056
DISP_VERSION = "V.0.2017.08.07"

class BarPlot():
def __init__(self, parent=None):
# Create the mpl Figure and FigCanvas objects.
# 5x4 inches, 100 dots-per-inch
self.dpi = 100
self.fig = Figure((5, 4), dpi=self.dpi)
self.canvas = FigureCanvas(self.fig) # pass a figure to the canvas
self.canvas.setParent(parent)
self.parent = parent

self.axes = self.fig.add_subplot(111)
self.axes.axis([-0.25, 0.3, 0, 16])
self.spanplot = False

def on_draw(self):
"""
redraw the figure
"""
self.axes.clear()
self.axes.grid()

x = range(len(self.data))
self.axes.bar(left=x, height=self.data, width=0.3, align='center',
alpha=0.44, picker=5)
self.canvas.draw()

def plotData(self, xData, yData):
self.axes.plot(xData,yData, 'o')
if self.spanplot == False:
time.sleep(0.02)
self.axes.axvspan(-0.25,0, facecolor='g', alpha=0.5)
self.axes.axvspan(0.05,0.3, facecolor='g', alpha=0.5)
self.axes.axvspan(-0.25,-0.05, facecolor='g', alpha=0.5)
self.axes.axvspan(0.1,0.3, facecolor='g', alpha=0.5)
self.spanplot = True
time.sleep(0.04)
self.canvas.draw()

def plotDraw(self):
self.canvas.draw()
self.canvas.flush_events()

def plotClear(self):
self.axes = self.fig.add_subplot(111)
self.axes.axis([-0.25, 0.3, 0, 16])
self.canvas = FigureCanvas(self.fig)
self.canvas.setParent(self.parent)
self.spanplot == False
self.canvas.show()


class soundtool():
def __init__(self, aStr):
pass
def fetch_soundData(self):
f = open(WAVE_DB_FILE, 'rb')
fData = f.read()
waveData = VWave(fData)
rtnBunch = Bunch()
rtnBunch.COL_NAMES = {'SoundName', 'label', 'data'}
rtnBunch.DESCR = 'sounddata.koo dataset:ksssr-original'
rtnBunch.SoundName = waveData.getChunkData(waveData.INSTR_TAG)
rtnBunch.label = waveData.getChunkData(waveData.NOTE_TAG)
rtnBunch.alldata = waveData.iff[waveData.IFF_DATA]
rtnBunch.data = []
for i in range (int(len(rtnBunch.alldata) / SUBWAVE_SIZE)):
rtnBunch.data.append(rtnBunch.alldata[i * SUBWAVE_SIZE:(i + 1) * SUBWAVE_SIZE])
return rtnBunch

def play(self, data):
self.stream.write(data)

def openAudio(self):
self.p = pyaudio.PyAudio()
self.stream = self.p.open(format=pyaudio.paInt16,
channels=1,
rate=int(SAMPLING_RATE),
output=True)

def closeAudio(self):
self.stream.close()
self.p.terminate()

class toneThread(threading.Thread):

def __init__(self, aTool, aDb, aMode, arhythm, aVariation, aSpeed, aValiationList, aCallback):
super(toneThread, self).__init__()
self.st = aTool
self.ksssr = aDb
self.mode = aMode
self.rhythm = arhythm
self.variation = aVariation
self.callback = aCallback
self.speed = aSpeed
self.variation_list = aValiationList
if aMode == 1:
print("speed=%d" % aSpeed)
self.sDB = aDb.data.copy()
addAdj = int((32000 * 60 / aSpeed - 25600) / 2) * 2
subAdj = int(32000 * 60 / aSpeed / 2) * 2
for i in range(len(self.sDB)):
if aSpeed <= 75:
s = self.sDB[i] + b'\x00' * addAdj
self.sDB[i] = s
else:
s = self.sDB[i]
self.sDB[i] = s[0:subAdj]
self.stop_event = False

def run(self):
if self.mode != 1:
self.st.play(self.ksssr.data[CLECK_BEAT_NO])
else:
self.play()
self.callback(1)

def play(self):
for i in range(17):
if self.stop_event == True:
print('Stop')
return
self.callback(2)
if self.rhythm == 1:
self.st.play(self.sDB[STRONG_BEAT_NO])
elif self.variation == 0:
self.st.play(self.sDB[STRONG_BEAT_NO])
for i in range(self.rhythm - 1):
self.st.play(self.sDB[WEAK_BEAT_NO])
else:
self.st.play(self.sDB[STRONG_BEAT_NO])
for i in range(len(self.variation_list[self.variation])):
if i == 0:
for j in range(self.variation_list[self.variation][i])[1:]:
self.st.play(self.sDB[WEAK_BEAT_NO])
else:
self.st.play(self.sDB[SUB_STRONG_BEAT_NO])
for j in range(self.variation_list[self.variation][i])[1:]:
self.st.play(self.sDB[WEAK_BEAT_NO])
pass
print('End')

def stop(self):
self.stop_event = True
self.join()


class stackedExample(QWidget):
def __init__(self):
super(stackedExample, self).__init__()
self.FORM_COMBO_ITEM = {
1: ["1拍子", QWidget(), QButtonGroup(), ("1拍子",)],
2: ["2拍子", QWidget(), QButtonGroup(),("2拍子",)],
3: ["3拍子", QWidget(), QButtonGroup(),("3拍子",)],
4: ["4拍子", QWidget(), QButtonGroup(),("4拍子","2拍子+2拍子",)],
5: ["5拍子", QWidget(), QButtonGroup(),("5拍子","2拍子+3拍子","3拍子+2拍子",)],
6: ["6拍子", QWidget(), QButtonGroup(),("6拍子","2拍子+2拍子+2拍子","2拍子+4拍子","4拍子+2拍子",)],
7: ["7拍子", QWidget(), QButtonGroup(),("7拍子","2拍子+2拍子+3拍子","2拍子+3拍子+2拍子","2拍子+5拍子",
"3拍子+2拍子+2拍子","3拍子+4拍子",
"4拍子+3拍子", "5拍子+2拍子")],
8: ["8拍子", QWidget(), QButtonGroup(),("8拍子","2拍子+3拍子+3拍子","3拍子+2拍子+3拍子", "3拍子+3拍子+2拍子",
"3拍子+5拍子", "5拍子+3拍子" )],
9: ["9拍子", QWidget(), QButtonGroup(),("9拍子","2拍子+3拍子+4拍子","2拍子+4拍子+3拍子", "3拍子+2拍子+4拍子",
"3拍子+3拍子+3拍子", "3拍子+4拍子+2拍子",
"4拍子+2拍子+3拍子","4拍子+3拍子+2拍子")],
10: ["10拍子", QWidget(), QButtonGroup(),("10拍子","3拍子+3拍子+4拍子", "3拍子+4拍子+3拍子", "4拍子+3拍子+3拍子",
"4拍子+2拍子+4拍子", "4拍子+4拍子+2拍子",
"2拍子+5拍子+3拍子","3拍子+5拍子+2拍子")],
11: ["11拍子", QWidget(), QButtonGroup(),("11拍子","3拍子+3拍子+5拍子", "3拍子+5拍子+3拍子",
"4拍子+4拍子+3拍子","4拍子+3拍子+4拍子","3拍子+4拍子+4拍子",
"5拍子+3拍子+3拍子","5拍子+4拍子+2拍子",)],
12: ["ここまで", QWidget(), QButtonGroup(),("ここまで",)]
}
self.SPEED_ITEM = {
1: ("60",60,),
2: ("100",100,),
3: ("140",140,),
4: ("180",180,),
5: ("220",220,),
6: ("260",260,),
7: ("300", 300,),
8: ("340", 340,),
9: ("380", 380,),
10: ("420", 420,),
11: ("460", 460,),
12: ("dummy", 999,),
}
self.SUB_BEAT = {
1: ((1,),),
2: ((2,),),
3: ((3,),),
4: ((4,),(2,2,)),
5: ((5,),(2,3,),(3,2,),),
6: ((6,),(2,2,2,),(2,4,),(4,2,),),
7: ((7,),(2,2,3,),(2,3,2,),(2,5,),(3,2,2,),(3,4,),(4,3,),(5,2,),),
8: ((2,3,3,),(3,2,3,),(3,3,2,),(3,5,),(5,3,),),
9: ((9,),(2,3,4,),(2,4,3,),(3,2,4,),(3,3,3,),(3,4,2,),(4,2,3,),(4,3,2,),),
10: ((10,),(3,3,4,),(3,4,3,),(4,3,3,),(4,2,4,),(4,4,2,),(2,5,3,),(3,5,2,),),
11: ((11,),(3,3,5,),(3,5,3,),(4,4,3,),(4,3,4,),(3,4,4,),(5,3,3,),(5,4,2,),),
}
self.resize(400, 768)
self.setWindowTitle('おとであそぼう!')
self.mainLabel = QLabel("<h2 style='color: white; background-color: royalblue;'>おたまじゃくし♪のおーとまとん(拍子編) " + DISP_VERSION +"</ h2>");
self.combo = QComboBox(self)
for i in range(len(self.FORM_COMBO_ITEM))[1:]:
s = self.FORM_COMBO_ITEM[i][0]
self.combo.addItem(s)
self.combo.setGeometry(0, 10, 100, 35)
self.combo.activated[int].connect(self.change01)
self.speed = QWidget()
self.Stack = QStackedWidget(self)
for i in range(len(self.FORM_COMBO_ITEM))[1:]:
self.stackUI(i, self.Stack)

for i in range(len(self.FORM_COMBO_ITEM))[1:]:
self.Stack.addWidget(self.FORM_COMBO_ITEM[i][1])

self.stackGraph(self.Stack)
layout = QFormLayout()
self.speedNo = QHBoxLayout()
self.bgspeed = QButtonGroup()
for i in range(len(self.SPEED_ITEM))[1:]:
btn= QRadioButton(self.SPEED_ITEM[i][0])
if i == 1:
btn.setChecked(True)
self.speedNo.addWidget(btn)
self.bgspeed.addButton(btn)
self.bgspeed.buttonClicked[int].connect(self.setSpeed)

layout.addRow(QLabel("スピード♪+♪="), self.speedNo)
self.speed.setLayout(layout)

self.button = QtGui.QPushButton('スタート', self)
#self.button.setGeometry(100, 10, 100, 35)
self.button.clicked.connect(self.execute01)

self.button2 = QtGui.QPushButton('クリック', self)
self.button2.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Expanding)
self.button2.clicked.connect(self.click01)

self.button3 = QtGui.QPushButton('ストップ', self)
#self.button.setGeometry(100, 10, 100, 35)
self.button3.clicked.connect(self.stop01)

hbox = QVBoxLayout(self)
hbox.addWidget(self.mainLabel)
hbox.addWidget(self.combo)
hbox.addWidget(self.Stack)
hbox.addWidget(self.speed)
hbox.addWidget(self.button)
hbox.addWidget(self.button2)
hbox.addWidget(self.button3)

self.setLayout(hbox)
self.st = soundtool('dummy')
self.ksssr = self.st.fetch_soundData()
self.bonb = []
self.playing = 0
self.grhythm = 1
self.bonbCount = 0
self.gSpeed = 60
self.gValiation = 0
self.BeatPoint = 0
self.BeatCount = 0
self.show()

def setSpeed(self,aSpeed):
self.gSpeed = 60 - (aSpeed + 2) * 40

def stackUI(self, aInt, aStack):
layout = QFormLayout()
countNo = QVBoxLayout()
for i in range(len(self.FORM_COMBO_ITEM[aInt][3])):
strBtn = self.FORM_COMBO_ITEM[aInt][3][i]
btn = QRadioButton(strBtn)
if i == 0:
btn.setChecked(True)
countNo.addWidget(btn)
self.FORM_COMBO_ITEM[aInt][2].addButton(btn)
layout.addRow(QLabel("拍子"), countNo)
self.FORM_COMBO_ITEM[aInt][2].buttonClicked[int].connect(self.setValiation)
self.FORM_COMBO_ITEM[aInt][1].setLayout(layout)
aStack.addWidget(self.FORM_COMBO_ITEM[aInt][1])

def stackGraph(self, aStack):
self.graphstack = QWidget()
layout = QFormLayout()
vBox = QVBoxLayout()
self.barplot = BarPlot(self.graphstack)
vBox.addWidget(self.barplot.canvas)
self.graphstack.setLayout(vBox)
aStack.addWidget(self.graphstack)

def restackGraph(self, aStack):
self.graphstack = QWidget()
layout = QFormLayout()
vBox = QVBoxLayout()
self.barplot = BarPlot(self.graphstack)
vBox.addWidget(self.barplot.canvas)
self.graphstack.setLayout(vBox)
aStack.addWidget(self.graphstack)
self.barplot.canvas.show()

def setValiation(self, aInt):
self.gValiation = - 2 - aInt
print("valiation=%d" % self.gValiation)

def change01(self, aInt):
self.Stack.setCurrentIndex(aInt)
self.grhythm = aInt + 1

def changeGraph(self):
aLen = len(self.Stack)
self.Stack.setCurrentIndex(aLen - 1)

def execute01(self):
if self.playing != 0:
return
print('Start')
self.barplot.plotClear()
self.restackGraph(self.Stack)

self.playing = 1
self.bonb = []
self.bonbCount = 0
self.BeatCount = 0
a = self.bgspeed.buttonClicked['int']
self.changeGraph()
for i in range(16):
ast = soundtool('dummy')
ast.openAudio()
th_cl = toneThread(ast, self.ksssr, 0, 0, 0, 0, [], self.callback)
self.bonb.append(th_cl)
ast = soundtool('dummy')
#ダミープロット(領域表示)
self.barplot.plotData(0, -1)
ast.openAudio()
th_cl = toneThread(ast, self.ksssr, 1, self.grhythm, self.gValiation, self.gSpeed, self.SUB_BEAT[self.grhythm], self.callback)
self.startTime = time.clock()
th_cl.start()
self.currentPlay = th_cl

def stop01(self):
self.currentPlay.stop()

def callback(self,aInt):
if aInt == 1:
self.playing = 0
self.barplot.plotDraw()

if aInt == 2:
atime = time.clock()
self.aTime = atime - self.BeatPoint
if self.BeatCount != 0:
self.aAveTime = (atime - self.startTime) / self.BeatCount
else:
self.aAveTime = 0
self.BeatPoint = atime
print ("AveTime=%.5f" % self.aAveTime)
#print ("time=%.5f" % self.aTime)
self.BeatCount += 1




def click01(self):
if self.playing != 1:
return
self.CleackPoint = time.clock()
ast = soundtool('dummy')
ast.openAudio()
if self.bonbCount >= 16:
print('no bomb')
return
th_cl = self.bonb[self.bonbCount]
th_cl.start()
self.bonbCount += 1
aDiff = (self.CleackPoint - self.BeatPoint - BEAT_OFFSET)
if aDiff > (self.aAveTime - 0.25):
aDiff = aDiff - self.aAveTime
print ("diff=%0.5f" % aDiff)
time.sleep(0.1)
self.barplot.plotData(aDiff ,self.bonbCount)



def main():
app = QApplication(sys.argv)
ex = stackedExample()
sys.exit(app.exec_())


if __name__ == '__main__':
main()


VWave.py (かえるのクー作成のサウンドデータベースアクセス用プログラム)


import numpy as np

STRCODE = 'utf-8'
'''
=====================================================================================
Wave ファイル汎用アクセスクラス
Koo Wells V 0.2017.07.31
=====================================================================================
'''

class VWave:
# 読み込んだwaveファイルの情報を格納するクラスです。
SAMPLING_COUNT = 32768
INSTR_TAG = 'ISFT'
NOTE_TAG = 'ICMT'
# 地道にwavフォーマット情報を定義していきます。
#
IFF_ALL = 0
IFF_ID, IFF_SIZE, IFF_FMT, IFF_SUBID, IFF_SUBSIZE = 1, 2, 3, 4, 5
IFF_WAVFOMT, IFF_CHANNEL, IFF_SAMPLING, IFF_BYTEPS, IFF_BLKSIZE = 6, 7, 8, 9, 10
IFF_BIT, IFF_DATAID, IFF_DATASIZE, IFF_DATA, IFF_LIST = 11, 12, 13, 14, 15
IFF_LISTID, IFF_LISTSIZE, IFF_INFOID = 16, 17, 18
TYPE_BYTE = "byte"
TYPE_STR = "string"
TYPE_LITTLE = "little"
DEF_METAID, DEF_TITLE, DEF_TYPE, DEF_START, DEF_BYTE, DEF_ENC = 0, 1, 2, 3, 4, 5
IFF_DEF = [
[IFF_ALL, "ALL DATA ", TYPE_BYTE, None, None, None ],
[IFF_ID, "ID ", TYPE_STR, 0, 4, STRCODE],
[IFF_SIZE, "Chunk Size", TYPE_LITTLE, 4, 4, None],
[IFF_FMT, "FormatName", TYPE_STR, 8, 4, STRCODE],
[IFF_SUBID, "Sub ID ", TYPE_STR, 12, 4, STRCODE],
[IFF_SUBSIZE, "Sub Size ", TYPE_LITTLE, 16, 4, None],
[IFF_WAVFOMT, "WavFomat ", TYPE_LITTLE, 20, 2, None],
[IFF_CHANNEL, "Channel ", TYPE_LITTLE, 22, 2, None],
[IFF_SAMPLING,"Sampling ", TYPE_LITTLE, 24, 4, None],
[IFF_BYTEPS, "BytePS ", TYPE_LITTLE, 28, 4, None],
[IFF_BLKSIZE, "BlockSize ", TYPE_LITTLE, 32, 2, None],
[IFF_BIT, "Bit ", TYPE_LITTLE, 34, 2, None],
[IFF_DATAID, "DataID ", TYPE_STR, 36, 4, STRCODE],
[IFF_DATASIZE,"DataSize ", TYPE_LITTLE, 40, 4, None],
[IFF_DATA, "IFF Data ", TYPE_BYTE, 44, None, None],
[IFF_LIST, "List ", TYPE_BYTE, 0, None, None ],
[IFF_LISTID, "List ID ", TYPE_STR, 0, 4, STRCODE ],
[IFF_LISTSIZE,"List Size ", TYPE_LITTLE, 4, 4, None],
[IFF_INFOID, "INFO ID ", TYPE_STR, 8, 4, STRCODE]
]
#読み込んだ情報を格納する配列です。最初はクラス変数を使っていましたが、多すぎてわかりにくくなったため、
#すべて配列で持つことにしました。
iff = []
iffSubChunkID = []
iffSubChunkSize = []
iffSubChunkData = []
alldata = b''

def __init__(self, data):
alldata = data
self.iff =[b'', "", 0, "", "", 0, 0, 0, 0, 0, 0, 0, "", 0, b'', b'', "", 0, ""]
siff = self.iff
sALL = self.IFF_ALL
dMetaID, dTitle, dType, dStart, dByte, dEnc = self.DEF_METAID, self.DEF_TITLE, self.DEF_TYPE, self.DEF_START, self.DEF_BYTE, self.DEF_ENC
tByte, tStr, tLittle = self.TYPE_BYTE, self.TYPE_STR, self.TYPE_LITTLE
# 以降全体から特定部分へアクセスするためにバイト配列にして格納します。
siff[sALL] = np.frombuffer(data, dtype=self.IFF_DEF[sALL][dType])
#順次定義の内容に基づき、data内容を解釈して配列に格納します。
for i in range(14)[1:]:
iDEF = self.IFF_DEF[i]
if iDEF[dType] == tStr:
siff[i] = (b''.join(siff[sALL][iDEF[dStart]:iDEF[dStart] + iDEF[dByte]])).decode(iDEF[dEnc])
elif iDEF[dType] == tLittle:
siff[i] = int.from_bytes(siff[sALL][iDEF[dStart]:iDEF[dStart] + iDEF[dByte]], tLittle)

#Waveデータ部分を格納します。この部分が可変長なんです。
iDEF = self.IFF_DEF[self.IFF_DATA]
#siff[self.IFF_DATA] = b''.join(siff[sALL][iDEF[dStart]:iDEF[dStart] + siff[self.IFF_DATASIZE]])
siff[self.IFF_DATA] = alldata[iDEF[dStart]:iDEF[dStart] + siff[self.IFF_DATASIZE]]
#タグの部分はIFF_LISTで示す配列に格納します。
siff[self.IFF_LIST] = siff[sALL][44 + siff[self.IFF_DATASIZE]:]

#タグの部分の範囲を解釈して配列「XXXiffSubChunk」に格納します。
if (siff[self.IFF_LIST].size != 0):
sList = siff[self.IFF_LIST]
iDEF = self.IFF_DEF[self.IFF_LISTID]
siff[self.IFF_LISTID] = (b''.join(sList[iDEF[dStart]:iDEF[dStart] + iDEF[dByte]])).decode(iDEF[dEnc])
iDEF = self.IFF_DEF[self.IFF_LISTSIZE]
siff[self.IFF_LISTSIZE] = int.from_bytes(sList[iDEF[dStart]:iDEF[dStart] + iDEF[dByte]], tLittle)
iDEF = self.IFF_DEF[self.IFF_INFOID]
siff[self.IFF_INFOID] = (b''.join(sList[iDEF[dStart]:iDEF[dStart] + iDEF[dByte]])).decode(iDEF[dEnc])
offset = 12
for i in range(999):
chunkID = (b''.join(sList[offset:offset + 4])).decode(STRCODE)
subChunkSize = int.from_bytes((b''.join(sList[offset + 4:offset + 8])), tLittle)
chunkData = (b''.join(sList[offset + 8:offset + 8 + subChunkSize]).decode('SJIS'))
offset += (8 + subChunkSize + (subChunkSize % 2))
self.iffSubChunkID.append(chunkID)
self.iffSubChunkSize.append(subChunkSize)
self.iffSubChunkData.append(chunkData)
if siff[self.IFF_LISTSIZE] <= offset + 12:
break

def getBytesData(self, aAry, aStart, anEnd, aSize):
rtnBytes = b''
for i in range(int((anEnd - aStart) / aSize)):
if anEnd < aStart + (i + 1) * aSize:
break
rtnBytes += b''.join(aAry[aStart + (i * aSize):aStart + ((i + 1) * aSize)])
print(i)
if anEnd > (aStart + int((anEnd - aStart) / aSize) * aSize):
rtnBytes += b''.join(aAry[aStart + int((anEnd - aStart) / aSize) * aSize:])
return rtnBytes

pass

def print(self):
#読み込んだwavファイルの内容をレポートします。
siff = self.iff
sALL = self.IFF_ALL
dMetaID, dTitle, dType, dStart, dByte, dEnc = self.DEF_METAID, self.DEF_TITLE, self.DEF_TYPE, self.DEF_START, self.DEF_BYTE, self.DEF_ENC
tByte, tStr, tLittle = self.TYPE_BYTE, self.TYPE_STR, self.TYPE_LITTLE
print('Toral size = ' + "{0:,d}".format(siff[sALL].size))
for i in range(19)[1:]:
if (i == 14):
if (siff[self.IFF_LIST].size != 0):
print("-------------------------------------------")
continue
else:
#このブロックは調整中です
break
iDEF = self.IFF_DEF[i]
if iDEF[dType] == tStr:
print(iDEF[dTitle] + '=' + siff[i])
elif iDEF[dType] == tLittle:
print(iDEF[dTitle] + '=' + "{0:,d}".format(siff[i]))
print("<<This wave file contains [ " + "{0:,d}".format(siff[self.IFF_DATASIZE] // (self.SAMPLING_COUNT * siff[self.IFF_BLKSIZE])) + "] sound>>")
print("-------------------------------------------")

def printSize(self):
siff = self.iff
print("Chunk Size=" + siff[self.IFF_SIZE])

def getList(self):
return self.iffSubChunkID, self.iffSubChunkSize, self.iffSubChunkData

def cat(self, data):
#結合用のメソッドです。元のソースとチャンネル数、サンプリングレート、ビット数が異なればエラーにします。
#エラーがあれば結合しません。
if (self.iff[self.IFF_CHANNEL] != data.iff[data.IFF_CHANNEL]):
print("Channel is different base=" + "0:d".format(self.iff[self.IFF_CHANNEL]) +
"source=" + "0:d".format(data.iff[self.IFF_CHANNEL]))
return -1
if (self.iff[self.IFF_SAMPLING] != data.iff[data.IFF_SAMPLING]):
print("Samplint is different base=" + "0:d".format(self.iff[self.IFF_SAMPLING]) +
":source=" + "0:d".format(data.iff[self.IFF_SAMPLING]))
return -1
if (self.iff[self.IFF_BIT] != data.iff[data.IFF_BIT]):
print("Bit is different base=" + "0:d".format(self.iff[self.IFF_BIT]) +
":source=" + "0:d".format(data.iff[self.IFF_BIT]))
return -1
#結合するサンプリング数がSAMPLING_COUNTの整数倍でないと、エラーとします。
if (data.iff[data.IFF_DATASIZE] % self.SAMPLING_COUNT != 0):
print("Sampling count is not base on :" + "0:d".format(self.SAMPLING_COUNT) )

#結合は単純に足しているだけです。
self.iff[self.IFF_DATA] += data.iff[data.IFF_DATA]
self.iff[self.IFF_DATASIZE] += data.iff[data.IFF_DATASIZE]
self.iff[self.IFF_SIZE] += data.iff[data.IFF_DATASIZE]

def catInstrumentInfo(self, dir_name, info):
#ファイルから読み込んだデータについて、楽器情報を結合します。
tagInstr = self.INSTR_TAG
CategolyNo = dir_name[0:2]
InstNo = dir_name[2:]
if tagInstr in self.iffSubChunkID:
itagNo = self.iffSubChunkID.index(tagInstr)
else:
self.iffSubChunkID.append(tagInstr)
self.iffSubChunkData.append("")
self.iffSubChunkSize.append(0)
itagNo = self.iffSubChunkID.index(tagInstr)
sInfo = info.split('\n')
self.iffSubChunkData[itagNo] += '[' + CategolyNo + "," + InstNo + "," + sInfo[0] + "],"
self.iffSubChunkSize[itagNo] = len(self.iffSubChunkData[itagNo])

def catSoundInfo(self, dir_name, info):
# ファイルから読み込んだデータについて、各音の情報を結合します。
tagNote = self.NOTE_TAG
CategolyNo = dir_name[0:2]
InstNo = dir_name[2:]
if tagNote in self.iffSubChunkID:
itagNo = self.iffSubChunkID.index(tagNote)
else:
self.iffSubChunkID.append(tagNote)
self.iffSubChunkData.append("")
self.iffSubChunkSize.append(0)
itagNo = self.iffSubChunkID.index(tagNote)
sInfo = info.split('\n')
sInstr = sInfo[0]
sInstrInfo = sInstr.split(',')

for i in range(len(sInfo))[1:]:
sNoteInfo = sInfo[i].split(',')
if len(sInfo[i].strip(' ')) == 0:
#空の行があればそこで終了
break
self.iffSubChunkData[itagNo] += '[' + CategolyNo + ',' + \
InstNo + ',' +\
sNoteInfo[1] + ',' +\
sNoteInfo[2] + "],"
self.iffSubChunkSize[itagNo] = len(self.iffSubChunkData[itagNo])

def getWave(self):
#Waveデータのフォーマットでバイナリで取り出すメソッドです。
dMetaID, dTitle, dType, dStart, dByte, dEnc = self.DEF_METAID, self.DEF_TITLE, self.DEF_TYPE, self.DEF_START, self.DEF_BYTE, self.DEF_ENC
work = b''
workInfo = b'INFO'
for i in range(len(self.iffSubChunkID)):
workInfo += self.iffSubChunkID[i].encode(STRCODE)
workInfo += (self.iffSubChunkSize[i]+1).to_bytes(4, 'little')
workInfo += self.iffSubChunkData[i].encode(STRCODE) + b'\x00'
if ((len(self.iffSubChunkData[i].encode(STRCODE)) + 1) % 2 == 1):
workInfo += b'\x00'
workList = b'LIST' + (len(workInfo)).to_bytes(4, 'little') + workInfo
self.iff[self.IFF_SIZE] = self.iff[self.IFF_SUBSIZE] + self.iff[self.IFF_DATASIZE] + len(workInfo) + 28
for i in range(14):
siffData = self.iff[i]
iDEF = self.IFF_DEF[i]
if (iDEF[dType] == self.TYPE_STR):
work = work + siffData.encode(iDEF[dEnc])
elif (iDEF[dType] == self.TYPE_LITTLE and iDEF[dByte] == 2 ):
work = work + siffData.to_bytes(2, 'little')
elif (iDEF[dType] == self.TYPE_LITTLE and iDEF[dByte] == 4):
work = work + siffData.to_bytes(4, 'little')
work = work + self.iff[self.IFF_DATA]
work += workList
return work

def getChunkData(self, aChunkID):
for i in range(len(self.iffSubChunkID)):
chunkName = self.iffSubChunkID[i]
if chunkName == aChunkID:
return self.iffSubChunkData[i]
return []


条件 

 ・このプログラムは音をだすためのデータが必要です。小さなサウンドデータベースフォーマットのデータを準備しています(Wavファイル)。動作させるために一部環境調整が必要な場合があります。

・anaconda が導入済(はいっていること)であることを想定(そうてい)しています。はいっていない最初の状態からのいれかたは「インストール編」をみてね。

f:id:np2LKoo:20170807234000p:plain

おわび

・無駄に長くてすみません。
・8/5(土曜日)にQtとかマルチスレッドとか全然しらなくてつくりはじめました。勉強中です。うまく動かなかったらなおしますので、怒(おこ)らないでね。

・遅いマシンだと、音が途切(とぎ)れたり、タイミングの判定(はんてい)が正確(せいかく)でなかったりします。

・実験レベルのプログラムなので、環境によってはプログラムの調整が必要な場合があります。

オートマトンという言葉を早くしりたい人はこんな本を読んでみてもいいかもです。おとうさんか、おかあさんが持っているかもしれないので、聞いてみよう!

おたまじゃくしさんのおーとまとん~音で遊ぼう!

なつやすみ。遊びも勉強もがんばろう!!!

全国(ぜんこく)の「おたまじゃくし」さん。(または、小中学生のおともだち)なつやすみ、毎日(まいにち)楽(たの)しく遊(あそ)んでいますか?
こんにちは。井戸中 芽守(いとなか めもる)といいます。

f:id:np2LKoo:20170806210349j:plain

このブログの主(ぬし)の「かえるのクー」は自由研究(じゆうけんきゅう)で音(サウンド)の実験(じっけん)をしています。「あ」は「かえるのクー」の助手をしています。
「あ」とは、自分(じぶん)のことです。「ボク」とか「わたくし」、みたいな自分の呼(よ)び方(かた)です。
さて、「実験」や「研究」とまではいきませんが、「音」を使って遊んでみましょう。

オートマトンという言葉はもっと遊んでから説明するね。(ニーア・オートマタの「オートマタ」に近い言葉だよ)

 音の拍子で遊ぼう!!!

音楽には拍子(ひょうし)というもがあります。くみあわせでどれだけでも作れますが、4拍子とか3拍子がよくつかわれます。

ゲームセンターには「音ゲー」というジャンルで、太鼓(たいこのたつじん、シンクロニカ)だとかドラムだとかキーボード(のすたるじあ)だとか、ギター(ぎたーふりーくす)だとかでいろいろ音を出して、どれだけそれらしく演奏できたかを競(きそ)います。プロジェクトディーバとかDJ(びーとまにあ?)とかダンス(だんすだんすれぼりゅーしょん)も楽しいよね。「音ゲー」までいきませんが、リアルタイムで音をだしたあそべないか、簡単(かんたん)なプログラムをつくってみました。*1

遊びたいひとはもうしばらくしたらアップするので、お父さん、お母さんのお許しを得てからインストール(パソコンにプログラム入れて使えるようにすること)してください。

Python(ぱいそん)という「言語」プログラムとanaconda(あなこんだ)というパッケージ(機能をまとめたもの)と、pycharm(ぱいちゃーむ)というプログラムをつくるための開発環境(かいはつかんきょう)が必要(ひつよう)です。このインストールのしかたも、もうすこししたらアップするね。

今はどんなことができるか、みてもらいます。

今回つくったプログラム

 拍子にあわせてクリックして、ミュージシャンクラスをめざせ!!見た目がひどいのは実験用のプログラムなので、大目にみてね。(演奏(えんそう)自体(じたい)にパソコンの気分(きぶん)でかなり「ゆらぎ」(リズムがすこしふらつくこと)があります)

f:id:np2LKoo:20170807072101p:plain

作成中です。*2

音はこんな感じです。ベースの低い音をタイミングにあわせて(拍子の先頭(せんとう)に)ならします。(例では10拍子(4+3+3)をやってみました)

このあと、はプログラムで音楽(みたいなもの)をつくる入門をしていく予定です。

たまに遊びにきてみてくださいね。

それじゃ~。夏ばてには気を付けてね。

 

*1:実は全く簡単ではありませんでした。安請け合いしたことをちょっと後悔しています。Qt(キュート)とかマルチスレッドとかつかいましたが、満足のいくものはできませんでした。いわゆる実験レベルのプログラムにとどまっています。リアルタイムで、音出しと描画は辛いです。でもゲームは基本的にそればっかりですよね。。。

*2:左がゲーム中。右は結果(けっか)。(まだ点数とか評価(ひょうか)とかつくってません)音が(パソコンが遅(おそ)くて)途中(とちゅう)で途切れるという致命的(ちめいてき)なところがあるので、公開(こうかい)できるかどうかは微妙(びみょう)なところです。タイミングがかなり正しくないのもゲームとしては致命的です。間違ってもこのプログラムをリズム感トレーニングでは使えません。もしかしたら、パソコンのスペックがいいと、それなりかもです。