niszetの日記

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

githubに公開してみる

パッケージ化してみる。

この本を頼りに、パッケージ化してみました。

www.oreilly.co.jp

しかし、読んでから日が開いていたので、肝心のパッケージ化するコマンドがわからなかった。RStudioツールバーのBuildから、Buil&Reloadを実行すればよかったのですね。
こちらの記事のシリーズなどをざっと読ませていただきました。

qiita.com

yutaniさんにもアドバイスいただきました。いつもありがとうございます。。

githubに上げてみる。

しかし、gitの使いかたをすっかり忘れている。

gitまわりはこちら、 qiita.com

github上げる段階で詰まったところはこちらも参考にしました。 devtools: Rパッケージ作成支援 - Heavy Watal

remoteまわりはこちらも見つつでした。remote系は慣れないなぁ www.backlog.jp

アップしたもの

これです(小声)

github.com

注意点。

read_wavのとりあえず動く版、read_smfの途中でほったらかしてる版が入っています。
ぶっちゃけ、waveをRで扱いたいだけならば、tuneRとseewaveで良いのです。私はCsoundで生成したwavファイルが、ヘッダ中でサイズ0になっていて触れなかったので、勉強も兼ねて作ってみたものなので…

このリポジトリは作業用なのでいずれ消しちゃう気がします。

TODO

マニュアルもコメントもないし、作業内容そのままな感じですね…。時期尚早感ある。 とりあえず、大体の関数を隠しました。0.0.0.9001なので仕方なし。

tuneRとseewaveについては、

ここ
CRAN - Package tuneR と、

ここ
CRAN - Package seewave です。

Rで音声解析している方々(先行研究?調査…)

探すとちらほらありました。今後のためにリンク集…。

qiita.com

d.hatena.ne.jp

pingpongpangpong.blogspot.jp

Rによる信号処理tamosblog.wordpress.com

R Note/音響解析データの統計解析 - Miyazawa’s Pukiwiki

こちらは奥村先生のページ。

こちらはpdfですね。 http://ornithology.jp/katsudo/Letter/no32/files/gakko-2010-text.pdf

音声解析等々はRに限定しなければもっとあると思います。が、自分、音声は別にいいかな…音楽作りたいので…

そんなわけで、githubにupするデビューを果たしたのでした。ちゃんと完成させよう。

Arduinoを始めました。

Arduinoをはじめよう

ハードウェアも触らなくては…と思いまして、Arduinoをはじめることにしました。

www.oreilly.co.jp

Amazonに、Arduinoをはじめように書かれているプログラムを実行するために必要な部品セットがある程度そろったキットがあったのでこちらを使って試しています。

Amazon CAPTCHA

とりあえず4章まで終了しました。思った以上に簡単に試せて良いですね。
自分なりの改良は、ひとまず全部サンプルをテストしてからかな。

Csoundでエイリアシングの確認

久々にCsound小ネタ

サンプリング定理とエイリアシングについて、Csoundで実際に音を出して確認してみます。
サンプリング定理とエイリアシングについては、TIの記事があったのでとりあえず貼っておきますね。

サンプリング定理/エイリアシング - DSP の基礎・トレーニング - TI

書いてみる。

44.1kHzのサンプリング周波数なので、折り返し前を440Hzと設定した場合、行って帰って0Hzに戻る手前440Hzを引くので、

44100Hz*2-440Hz = 87760Hz で同じ音になるはずです。
以前のサンプルコード中のinstrを少し修正し、パラメータとして周波数を受け取れるようにしています(p4で4番目の引数という意味らしい)

<CsoundSynthesizer>
<CsOptions>
-odac
</CsOptions>
<CsInstruments>
instr 1
aSin      poscil    0dbfs/4, p4
          out       aSin
endin

</CsInstruments>
<CsScore>
i 1 0 1 87760
i 1 2 1 440
</CsScore>
</CsoundSynthesizer>

いかがでしょう?確かに同じ音がしてる気がしますね。しかし本当に87.76kHzが出力されているのでしょうか…?確かめようがないですねぇ。

そして、read_wavで読んでplotしたらread_wavのバグに気づきました…修正修正…

read_smfを作ります。

read_wavも完成していないのに…

まぁ、いつかは完成するさ…

さて、いつものように先人のお知恵を拝借なのです。ありがとうございます。しかし、ちゃんと仕様の原著を読む癖をつけないといけませんね。すぐgoogleで検索しちゃう。。。

maruyama.breadfish.jp

sites.google.com

意外?とwikipediaも情報量が多い スタンダードMIDIファイル - Wikipedia

SMFの初歩

sites.google.com

DTM技術情報 - 2.MIDIコントロールチェンジ一覧 | g200kg Music & Software

MIDI講座

MIDI(SMF)の作り方

現状

骨格だけ作って、あとは時間のあるときに追加できるようにしているので、時間さえあれば出来そうな感触です。SMFは命令の数が多いので、なかなか時間かかりそう。

まぁ、まずは動くものを…というところで。

ggplot2に自作geomを作る方に一旦時間を割く予定です(smf -> 楽譜や周波数-時間プロット向きなもの、スミスチャートなどを作っておきたいのです。geomちょっと難しい…。)

平日はしばらくはあまり時間がとれないので、土日にコツコツやっていくのです。。。

rsoundに機能を追加するときに参照する予定のメモ

rsoundがwavファイルを出力するために、csoundの機能を理解する

ということで、read_wavは細かいところを無視すれば一旦完成ということで、こんどはrsoundにwav出力機能を入れていきたいです。

read_wavはrsoundと一旦分離して、rsound_helper的な感じで、こっちだけで公開できるようにしておこうかなと思ってます。rcppの勉強に時間がかかりそうなので。

rsoundからcsoundを呼ぶ

rcppで書かれたソースを読むと、中ではこんな感じでcsound側を呼んでいるようですね…。

  csound->SetOption((char*) options.get_cstring());

今、自分のPCではCsoundはc:/の直下に置いてあるので

C:/Csound6_x64/include/csound/csound.hpp

を見てみる。
すると、以下のようになっています。

  virtual int SetOption(char *option)
  {
   return csoundSetOption(csound, option);
  }

結局、csound.hpp は csound.hを呼び出しているだけのようなので、調べるときは上記の例ならcsoundSetOptionの方を調べる必要がある。

探す場所は下記である。

Csound API: Main Page

ちなみに、上で上げたcsoundSetOptionは、こちらに書いてある。

Csound API: Attributes

あとは頑張って書いてデバッグして…である。コツコツ行きましょう。

Rでbit演算について

書籍が見つからない

Rの書籍は色々持っているものの、bit演算や複素数型について詳しく説明されているものってないような気がします。

なので、ちょっと調べました。

先人のお知恵を拝借。 takuyaokada.hatenablog.com

R.utilsというパッケージもあるのですね。これも後ほど調べてみる。

RStudioの入力補完でそれらしいものを見つける

RStudioでbitまで入力して補完を使うと、bitopsというパッケージがある。
baseと別にあるということは、より良いのでは?ということで違いを見てみる。

いくつか入力してみる。

> bitwAnd(15,0)
[1] 0
> bitwAnd(15,7)
[1] 7
> bitops::bitAnd(15,7)
[1] 7
> 15 & 7
[1] TRUE

最後はおまけ。&はlogicalを返しますので、bit演算には使えませぬ。
差異はないように見えますね。

ベクトルでも入力できる。

> bitwAnd(c(15,0),7)
[1] 7 0
> bitops::bitAnd(c(15,0),7)
[1] 7 0

> bitops::bitAnd(c(15,0,1),c(7,1,3))
[1] 7 0 1
> bitwAnd(c(15,0,1),c(7,1,3))
[1] 7 0 1

ここでも差異がみえない。ベクトルを与えられるのは便利ですね。

ヘルプを見るとNAについて記述がある。入力してみる。

> bitops::bitAnd(c(15,0),NA)
[1] NA NA
> bitwAnd(c(15,0),NA)
Error in bitwAnd(c(15, 0), NA) : 'a' and 'b' must have the same type

おっと、差異が出ました。baseの方はNAを入れるとエラー…

( ^ω^)・・・

type…?どうやら、NAがintegerだと思われていないようです。

今度は、NA_integer_で入れてみる。

> bitwAnd(c(15,0),NA_integer_)
[1] NA NA

お、動きますね。
念のため、もう一方も。

> bitops::bitAnd(c(15,0),NA_integer_)
[1] NA NA

こちらも。
bitopsパッケージの方を使っておいた方が、NAの型を合わせてくれるので便利そうです。

ヘルプより、

bitwise {base}   
bitwAnd(a, b)
a, b    integer vectors; numeric vectors are coerced to integer vectors

もう一方

bitAnd {bitops}  
bitAnd(a, b)
a,b numeric vectors of compatible length.

integer… 試しに入力すると…

> bitops::bitAnd(c(15.12501,0,1),c(7,1,3))
[1] 7 0 1
> bitwAnd(c(15.01,0,1),c(0.999,1,3))
[1] 0 0 1
> bitwAnd(c(15.01,0,1),c(1.999,1,3))
[1] 1 0 1

なるほど。使い方を気を付けないといけなさそうです。

Rでバイナリファイルを読む、readBinについて

Rでバイナリファイルを読む

さて、read_wavはwaveファイルを読むのですが、当然?wavファイルはバイナリデータです。
つまり、Rでバイナリファイルを読むための知見が必要なのですが、あまりそういう需要がないためか、情報もあまりないのでした。

readBin

こちらを大変参考にさせていただきました。 blog.recyclebin.jp

最終的にはかなり違うものになりましたが。

Rプログラミングマニュアル[第2版]ならreadBinについて記載があるかなと思ったのですが、残念ながら「ヘルプを読みましょう」と書かれていましたので、ヘルプとにらめっこです。 株式会社サイエンス社 株式会社新世社 株式会社数理工学社

readBinのヘルプ

readBinのヘルプを読みます。 引数で何が与えられるのか、デフォルト値が何で決まっているのか(環境依存とか)、サンプルプログラムとか、色々情報が詰まってますね。
本文は最初は読んでもよくわからないことが多いですが…末尾のプログラムが動かなかったことはなかったはず。

R: Transfer Binary Data To and From Connections

さて、readBinはこんな感じの引数(とデフォルト値)を持っていますね。

readBin(con, what, n = 1L, size = NA_integer_, signed = TRUE,
        endian = .Platform$endian)

conにはコネクションを与えます

  connection <- file(file, "rb")

こんな感じでファイル名fileをバイナリモードのreadモードで開く形です。

whatには型を与えます。wavの場合は"integer"で良いです。"WAVE"などが入っている箇所はreadCharで読めばよいので。

signedは16bitPCMの場合は符号ありなのでTRUE。8bitの場合はFALSEにしないといけませんね。A.I.に追加。

endianはデフォルト値が入っているのですね。"little"を明示的に与えた方が良いのかもしれませんね。A.I.に追加。

sizeはそれぞれの読み込みのサイズをバイト数で与える形です。16bitなら2を与えればよいわけですね。
nは連続して読み込む場合に指定。wavファイルは固定長のデータのため、データ部分は一括で読み込むことが出来ます。

最初はfor文で読んでいましたが、Rのforは遅いので。ファイルサイズが小さい場合は問題にならないと思います。
可変長の場合は考えなくてはならないですが、それは次のread_smfにて考え中。

コネクションは最後に必ず閉じておく必要があります

close(connection)

が、エラーがあるとcloseが実行されなくなってしまうので、on.exit()に入れておく方が良いですかねぇ。これもA.I.…。

on.exit()

実際使ってみるのが、理解するには一番の近道な気がします。バイナリエディタとにらめっこして、思った値が取れているか?を地道にチェックすると良いのです。

read_wavの「完成」はまだまだ先になりそうですね…