niszetの日記

細かい情報を載せていくブログ

dplyrとpurrrあたりを修行中

dplyrとmapの使い方が難しい。

結局、これは使わなくて良いきがするのだけど、spreadについてちょっと触っていて気付いたもの。
何かの値が入った列をvalueに指定すると、それが列名になりますね。 これを選択することがうまくいかなかった。具体的には下記の例でselect(-20)では意図したものになりませぬ。``で囲ってあげる必要があるのでした。

as_data_frame(list("a"=c(9999,1010200000,20),"b"=c(10,2000,300),"c"=c("a","b","c"))) %>%
 spread(key="a",value=b) %>% select(-`20`)

結果はこんな感じ。

## A tibble: 3 × 3
#      c `9999` `1010200000`
#* <chr>  <dbl>        <dbl>
#1     a     10           NA
#2     b     NA         2000
#3     c     NA           NA

spread重複があるとNAになったりするので、それを事前に知れたらいいのになぁ…。distinctとか? ゆるーく調べてみます。

Csoundで純正律と平均律の違いを聞いてみる

純正律平均律

さて、昨日書いたコードはいわゆる平均律によるものでした。
純正律平均律について、語れるほど詳しくないのでwikipediaの記事をとりあえず貼っておきます。

純正律 - Wikipedia

平均律 - Wikipedia

簡単に言えば、平均律はオクターブ(周波数が倍、半分)の周波数を12等分したもの。純正律は和音を構成する音の比が整数になる、という感じですね。平均律は普段使っている楽器がそうなっているのでなんとなくわかるものの、純正律の半音上げ/下げがどうなるのかは要勉強。A#とBbは違う音だと言っているんですよね。よくわかりませんねぇ。

ということで、聞き比べのためにwikipediaに書いてあった関係式を使ってCsoundのコードを書いてみました。 音の差わかりますか?確かに違う気もするけど…気のせいにも思えるなぁ。

<CsoundSynthesizer>
<CsOptions>
-odac
</CsOptions>
<CsInstruments>
instr 1
aSin      poscil    0dbfs/4, 440*2^(3/12) ;do
          out       aSin
endin

instr 2
aSin      poscil    0dbfs/4, 440*2^(3/12)*5/4 ;mi ;7/12
          out       aSin
endin

instr 3
aSin      poscil    0dbfs/4, 440*2^(3/12)*3/2 ;so ;10/12
          out       aSin
endin


instr 11
aSin      poscil    0dbfs/4, 440*2^(3/12) ;do
          out       aSin
endin

instr 12
aSin      poscil    0dbfs/4, 440*2^(7/12) ;mi ;
          out       aSin
endin

instr 13
aSin      poscil    0dbfs/4, 440*2^(10/12) ;so ;
          out       aSin
endin

</CsInstruments>
<CsScore>
; chord C
i 1 0 2 
i 2 0 2
i 3 0 2

i 11 2.2 2
i 12 2.2 2
i 13 2.2 2

</CsScore>
</CsoundSynthesizer>

Csoundの練習 和音を作ってみる

Csoundで和音を作る

Csoundはなんでも出来るのでは?というくらいに全部の仕様を把握するには時間がかかりそうなので、まずは気になったことを手習いでやってみましょう、ということで。今日は和音を作ってみました。サンプルにあったものをコピペして、所望の周波数に変換、同時に発音させて和音にする、というだけです。

意図通りに鳴ったので、おそらく理解は正しい…はず。
Csoundシンタックスハイライトはないのかな。とりあえずコードも貼っておきます。

<CsoundSynthesizer>
<CsOptions>
-odac
</CsOptions>
<CsInstruments>
instr 1
aSin      poscil    0dbfs/4, 440*2^(3/12) ;do
          out       aSin
endin

instr 2
aSin      poscil    0dbfs/4, 440*2^(7/12) ;mi
          out       aSin
endin

instr 3
aSin      poscil    0dbfs/4, 440*2^(10/12) ;so
          out       aSin
endin

</CsInstruments>
<CsScore>
; chord C
i 1 0 1
i 2 0 1
i 3 0 1

</CsScore>
</CsoundSynthesizer>

Rで音楽を作るための準備

Rで音楽を作るまでの長い道のり

色々あって、シンセサイザーについて勉強中です。

さて、yutaniさんのrsound
notchained.hatenablog.com

ですが、今の環境ではうまく入らない…。
なので、いったんローカルにもってきて自分のライブラリとして作ってしまおうかと(まだできてない)
単純にライブラリを作るだけのR力が私に足りない…のです。

なお、playitbyrはCRANにはない
* playitbyr
CRAN - Package playitbyr

GitHubには一応あるよ
* playitbyr
github.com

playitbyrに関連して、audiolyzR
* audiolyzR
CRAN - Package audiolyzR

というライブラリもあるらしい。が、動くかわかりません(cranにはまだあるぽい?)

Csoundについて

調べると1500くらい文法に関わるものがあるということで、それを全部R側で対応するのは難しい。
ということで、構文だけは持っておきながら文字列で引き渡すのが正解かなという感じですね。

Csoundについては、ここで

サンプルを実行すると面白い。filterのあたりでシンセぽい音が出てきて感動できる、かも。
write.flossmanuals.net

文法はここで調べられる。
The Csound Book - Chapter 1

ほかのパッケージ

tuneR

tuneRというパッケージがある。

CRAN - Package tuneR

これは直接wave形式のファイルを書き出すようですね

e1071

STFTについては、e1071にも含まれているようである。
R: Computes the Short Time Fourier Transform of a Vector

seewave

seewaveパッケージは波形を見れるようだ。ただし通常のplotを使っている(未調査)ようである。
CRAN - Package seewave

Rwave

Rwaveというパッケージはwaveletなどの変換ができる、SのパッケージをRに移植したような説明が書かれている。
CRAN - Package Rwave

signal

signalというパッケージはMatlab/Octaveの関数をRに移植したような感じですね。
CRAN - Package signal

以下、調査中 * SMF, standard MIDI Formatについて * シンセサイザーの基礎 * WAVEファイルの基礎

参考している書籍

  • C言語ではじめる 音のプログラミング ―サウンドエフェクトの信号処理― shop.ohmsha.co.jp

  • シンセサイザーの全知識 本格派を目指すキミに! という本も読んでいますが、これはもうamazonで在庫がないですねぇ。

おまけ

Tokyo.R 61 参加してきました!
第61回R勉強会@東京(#TokyoR) : ATND

LTもセッションも楽しかったですし、懇親会も参加して色々な方とお話が出来ました。
もうちょっとR力を高めて参加したいな。rsoundを引っ提げて、とかね!頑張りましょう。先は長い~~

日々の記録をつけるならspacemacs+evil+orgmodeかな、と

こまめに記録をつける

今週に入ってから、長らく使っていなかったspacemacs+evil+orgmodeを使用して各業務にかかった時間を記録するようにしました。

spacemacs.org

space m I, space m O で記録開始、終了、かかった時間を計算してくれて、期間を指定してカテゴリごとに集計もできる。
何より、ほとんど設定をいじらなくても使うことができたうえでvimのような使い方が出来るので、記録をつけるだけの理由で導入しても良いかなと思います。

R進捗

さて、今日はR関係はspreadくらいしか使えませんでした。NAが出やすい・・・ spreadしたあとのdata_frameで、select(-いらない列)としたらエラーが出たので明日はその調査を。

アートオブRプログラミングはおおむね読み終わったので、Rパッケージ開発入門を読み始めました。

www.oreilly.co.jp

そろそろRも中級と言えるだろうか…。

アート・オブ・Rプログラミング そしてtidyeval

アート・オブ・Rプログラミングを読んでいます(継続)

R for Data Scienceは読み切ったのですが、結局、基本的なRのプログラムについての理解が浅すぎるということに気づき、この本を読んでいます。

www.oreilly.co.jp

tidyverseで置き換えられるようなものもあるのだけど、おそらくかなりの部分をカバーしている、Rで何かプログラム書くなら読むべき本の一冊、という認識です。現在195ページまで。残り3分の1!

ちょっとここ数日、Rのデバッグ力が全然足りないことに気づいたのでちょっと飛ばして13章のデバッグを先に読むかも。 RStudioにも機能が結構充実しているので、そちらも追々…

そして、dplyevalというか、quo()まわりを勉強中。

Programming with dplyr • dplyr

こちらのスライドがまとまってて(あと英語で読まなくてよいので)良いです。 speakerdeck.com

雰囲気は掴んでいるんだけど、実際に使ってみないことにはね。 このあたりはR for Data Scienceにも書かれていなかったと思う。 Rは進化し続けているので楽しいですね。

ImageMagick

Rのgganimateを使ってみる

アニメーションするプロットが欲しい

会社でRを使っていますが、結局のところはプロットして結果を見やすくしたいのが目的です。

その中で、例えば時間が経過するとどのように値が変わるのか?などは横軸時間でプロットしても良いけども、点ごとの動きを見ようとしたらちょっとごちゃごちゃしてしまいます。そこで、それぞれの時間での値をプロットして、アニメーションさせて切り替えれば良いのでは?という話が出てきたのです。

tweenrというパッケージがある

先日、yutannihilationさんに教えていただいたのですが、tweenrというパッケージがあるとのこと。

github.com

こちらはあるフレームとあるフレームの中間のフレームを作りたいときに使うと便利、という使い方になります。アニメーション自体は後述のgganimateのようなので、まずはそちらから使いこなそうと思います。

Rでプロットをアニメーションさせるにはgganimateパッケージ

ggplotじゃない、昔のplotでどうやるのかはわからないですが、ggplot系ではgganimateを使うようです。

www.karada-good.net] 実際、gganimateはImageMagickを呼んでいるのでImageMagickがインストールされてパスが通っている必要があるようです。

ImageMagickの最新バージョンだと動かない…

gganimateは内部でImageMagickのconvertというコマンドを呼んでいるようなのですが、ImageMagickの7からこのコマンドがなくなったらしい(magickというコマンドに置き換わった)

[Resolved] convert.exe missing from 7.0.1-Q16? - ImageMagick

windowsではconvertはFAT32からNTFSに変換するためのコマンドでもあるため(が、理由かは見れてませんが)のようで。

とりあえず動かすという意味ではImageMagickの6.9.*を使えばよいと思います。ただし、上記の件があるので自己責任で使うことになるでしょうけど。

Windows10で6.9.8.4 Q8 x64を入れ、convertコマンドがImageMagickのものを指していることを確認してからtweenrのサンプルを実行したら動きましたので、ようやく準備が出来たのでした。

gganimate自体は今も更新がされているので、ImageMagick7のwindows環境で動かない、というのはレアケース過ぎて報告されてないのかもしれないですね。

Issueにはそれぽいものが

github.com

あれー…?私のは勘違いなのかしら。ちょっとこちらも試してみますか。