niszetの日記

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

(R進捗)rsound/csound関係進捗(追記)

あまり進捗ないですけど…

csoundと、rsoundと、rcppと…と調べることが広範囲にわたるのであまり進捗がないです。 とりあえず、進んだ分はメモ。

windows版だけかもしれないですが…

先日、rsoundの方でwaveでのファイル出力が出来ることに気づきました。その際、生成したファイルのヘッダにはちゃんとファイルサイズに関する情報が含まれていました。

Csound側で同じコードを実行してもファイルサイズは含まれていなかったで、何かの設定(の抜け)を疑いましたが見つからず。rsoundはcsound APIを呼んでいる形だから、Qtが悪いのでは…と思っています。
RStudio、nvimに続き、CsoundもQtで悩まされるのか…

rsoundで変数を渡す方法

rsoundの方、パラメータをどうやって渡すのかを悩んでいました。csound()は中でas.characterを読んでいるので、その中身を取り出して色々見ていましたが、たとえば周波数440Hzを入力する際に、パラメータとして渡したければ、下記のように`kkk=“=440"とやると良いです。変数名=値の形で与えると、csoundに渡すときに代入文にならないので、=を付けてあげればよいのでした。

orc <- create_orchestra( sr    = 44100,
                         ksmps = 32,
                         nchnls = 2,
                         `0dbfs` = 1,
                         instrument = list(
                             create_instrument(kkk="=440",aout = "vco2 0.5, kkk", outs = "aout, aout"))
)

sco <- create_score(sections = list(
    list(score_i(1, 0, 1))
))

csound_impl(as.character(orc),as.character(sco),paste0("-o","test.wav"))

同様に、これも動きます。

orc <- create_orchestra( sr    = 44100,
                         ksmps = 32,
                         nchnls = 2,
                         `0dbfs` = 1,
                         instrument = list(
                             create_instrument(aout = "vco2 0.5, p4", outs = "aout, aout"))
)

sco <- create_score(sections = list(
    list(score_i(1, 0, 1, 440))
))

csound_impl(as.character(orc),as.character(sco),paste0("-o","test.wav"))

しかしまだ、f系の音が出せていません。うーむ…まだ仕様がわからないのでした。

今後に期待

とりあえず、コードいじらなくてもまだ色々できそうなので、ちょっと試していこうと思っています。csound側の仕様を理解しないといけませんが…。
しかし…日曜にR触ってないで、お料理教室に行った方が…

追記

下記のように記述することで、foscilのサンプルも動きました。力尽きたので、csound()を経由するのはまた後日…?

foscil

eeee <- "0dbfs = 1\nksmps = 32\nnchnls = 2\nsr = 44100\n\ninstr 1\nkcps = 440\nkcar = 1\nkmod = p4\nkndx line 0, p3, 20\naout foscil .5, kcps, kcar, kmod, kndx, 1\nouts aout, aout\nendin"

ssss <- "f 1 0 16384 10 1\n\ni 1 0  9 .01\ni 1 10 .  1\ni 1 20 . 1.414\ni 1 30 5 2.05\ne"

csound_impl(eeee,ssss,paste0("-o","test.wav"))

(R進捗)midiを読んでplotするところまではできた…

残件沢山です

とりあえず、midiを読み、全データを一旦保持しつつ、noteのon/offだけを抜き出してdata.frameとして、ggplot2+geom_segmentで図にするところまでたどり着きました。

結果:

f:id:niszet:20170709122508p:plain

dfはそれぞれの音の高さ、なり始める時間、なり終わる時間などが入っています。geom_segmentはx,y,xend,yendを指定することで、その間に線を引いてくれるようです。欲しかったgeomそのものでした。

ざっくり、下記のようにしてプロットしています。

df %>% ggplot()+geom_segment(aes((x=start_time,y=typexend=end_time,yend=type))

これからまだまだデータ構造含めて修正してしまうので、細かい使い方はまだ書けないです。

(R雑記)パッケージ作成関連をいろいろ試しています。。。

進捗ダメです

ちょっとお仕事の方が忙しく、Rを触っている余裕がなかったのです。
後ほど書きますが、本業はR関係ないので、余暇に頑張らないとR力が上がらないのです。。。

rmusicwork

とりあえず最終的には音楽作りたいのですが、それ以前にR力が足りなさすぎるので色々とお勉強。
今日はroxygen2パッケージによる、パッケージのマニュアル作成関係を色々と触っていました。 github.com

R3.4にしたので色々入ってない

R3.3から3.4にするときに色々とパッケージが消えてしまいました。まぁ必要になったら入れなおせばよいのですが。

www.oreilly.co.jp

を参考に、RStudionのツールバーのBuild-Configure Build Tools… からroxygenの設定をしようとしたのですが、そもそもそんな項目がない。
その後、roxygen2が入ってないことがわかりました。入ってない場合、

devtools::document()

の時点で、入れるようにメッセージが出てきたかと思います。素直に入れましょう。そうすると、先の設定の部分にroxygen関係の設定が現れます。Build & Reload時にドキュメント生成もすることにして、作業抜けがなくなりました。
ま、まだ中身をしっかりしないといけないのですがね…!

今回はこちらも参考にさせていただきました~

qiita.com

devtools: Rパッケージ作成支援 - Heavy Watal

英語でも良ければ、Hadleyのこちらを。オライリー本は大体がweb上に公開されていますよね。でも本で読んだ方が私は好きなのですが。

Welcome · R packages

export

以前は外部に見せたくない関数名の先頭には.を付けていました。今回、exportを付けることで明示的に外部に見せる/見せないを管理できるようになったし、マニュアルぽいものも作れるようになってきて、少しずつR力の高まりを感じます。。。 …が、Rに限らないけど言語習得は時間がかかりますね…むずぃ…

はやくRおじさんになりたい(後ろ半分は達成)

Rでbode線図を描いている事例を見つけました

Rで回路設計について調べるのは、検索性が悪いと思うのですよねー…

2018/04/04 追記

自分で作ってみました。 niszet.hatenablog.com

電気回路ではRという文字を抵抗を表すシンボルに使うため、うまいこと検索でひっかけられないのでした。

最近はR lang という形で"lang"と入れるようにして検索してます。そうしたら見つけてしまった次の記事:

LC LOW-PASS FILTER ANALYSIS IN R paulorenato.com

これ、Rでやろうと思っていた小ネタの一つだったのですが、ggplot2使っている、complex型使っている、で完全に被ってました。むむむ。 ちょっとだけ解説というか、自分なりの(無駄)アレンジを入れてみます。

ちょっとだけ解説

Rには便利な型が色々とありますね。しかし、仲間はずれがいます。rawとcomplex型です。Rについては結構色々本を読んでいると思うものの、この二つについての解説はほとんど見たことがない気がします。曰く「あまり使わない」…

まぁ、普通の使い方をしていて使うシーンはあまりないとは思うのですが。 自分はraw型はWaveのファイルを読むために既に使っていますが、complex型はまだ使ってなかったです。

rawはバイナリファイルを読み書きするには必須ですが、complex型は複素数。統計分野で虚数なんて出てくるのでしょうか?使われなさそうですね。

電気電子回路や制御の分野だとフィルタの設計などでよく使うのです。最初にあげたサイトもLCフィルタについての記事となっています。
さて、ちょっと使ってみましょうか…。

まずは普通にplotします

plot(exp(-1i*seq(0,1,0.01)*2*pi))

plotはdata frameにしなくても表示できるので、ちゃちゃっと確認する際によく使いますね。
結果は下図のとおり。

f:id:niszet:20170629203826p:plain:w300

これは横軸に実数部、縦軸に虚数部が描かれていますね。 これを明示的に行うと、

data.frame(Re(exp(-1i*seq(0,1,0.01)*2*pi)),Im(exp(-1i*seq(0,1,0.01)*2*pi))) %>% plot()

で、同じ図が得られる。

つづいて、ggplotで同じことをすると、

library(tidyverse)


data.frame(re_x=Re(exp(-1i*seq(0,1,0.01)*2*pi)),im_x=Im(exp(-1i*seq(0,1,0.01)*2*pi))) %>% ggplot(aes(x=re_x,y=im_x))+geom_point()

で表示できます。

f:id:niszet:20170629203846p:plain:w300

さて、ここまでは実部と虚部をReとImを使用してそれぞれプロットしていたので、complex型をそのままy軸にプロットしているわけではない点に注意です。横軸が実数、縦軸が虚数という形。
y軸側をcomplexにしたらどうなるのでしょう?plotで描くなら下記のようになりますか

data_frame(x=seq(0,1,0.01),y=exp(-1i*seq(0,1,0.01)*2*pi)) %>% plot()

一応、下のように図が出ますが、なんか変ですね。 f:id:niszet:20170629203835p:plain:w300

このプロットの実行時には下記のWarningが出ます。

Warning message:
In xy.coords(x, y, xlabel, ylabel, log) :
  imaginary parts discarded in coercion

虚数部無視したよってことでしょうか。exp(ix)=cos(x+)isin(x)ってことで、余弦波となっているのですね。ふむ。 ggplot2の場合、同じようにすると

data.frame(x=seq(0,1,0.01),y=exp(-1i*seq(0,1,0.01)*2*pi)) %>%  ggplot(aes(x=x,y=y))+geom_point()

これはエラーが出てプロットされません。エラーは下記のような内容。複素数のままだと大小関係わからないから確かにプロットできませんよね。エラーで止まるggplot2の方が親切かもしれません。

# Don't know how to automatically pick scale for object of type complex. Defaulting to continuous.
# Error: Discrete value supplied to continuous scale

複素数は実部と虚部の2つをどうにかして表す必要があるので、最初にプロットしたように分けてプロットすることが考えられますが、もう一つ、絶対値と角度の形でも表現できます。極座標形式でしたっけ?それを使用したものがボード線図なのです。続く。

ようやくbode線図について。

ボード線図、あるいはボーデ線図と呼ばれる、周波数に対してのゲインと位相の関係をプロットした図については説明を省略…。
周波数応答系はわかりやすいというのは難しい気がするなぁ。一応参考になるかもなサイトを。 www.kairo-nyumon.com

さて、最初に貼ったサイトからソースを転載しますが、

fseries <- function(min, max, perdec) {
  expmin = floor(log10(min))
  expmax = floor(log10(max))
  step = 1/perdec
  return(10^(seq(expmin,expmax,by= step)))
}
Hf <- function(f, R, L ,C) {
  s = as.complex(2i*pi*f)
  Zser = as.complex( R + s*L)
  Zpar = as.complex(1/(s*C))
  return(Zpar/(Zpar+Zser))
}

ここまでは同じものを。先の関数は対数で見たときに等間隔になるようにする関数、後の方は伝達関数そのものを書いていますね(たぶん)

ここからはちょっと手を加えています。 ゲイン側は同じものを使用していますが、それに加えて位相分をArgによって取り出し、単位をradからdegへと変換しています。

library(ggplot2)
library(scales)
f = fseries(100,1e6,100) #100Hz to 1MHz, 100pts/decade
R = 0.06; L = 1E-6; C = 47E-6
amplitude = 20*log10(Mod(Hf(f,R,L,C))) #amplitude in dB = 2olog(|H(f)|)
df <- data.frame(x = f, y = amplitude)
p1 <- ggplot(df,aes(x,y)) + geom_line(lwd = 1, col = 'blue') +
  scale_y_continuous(breaks=seq(-65,25,by = 5)) + 
  labs(x = "f [Hz]", y = "|H(f)| [dB]") + 
  scale_x_log10(breaks = trans_breaks("log10", function(x) 10^x),labels =     trans_format("log10", math_format(10^.x)))+
  annotation_logticks(sides = "bt")

phase = Arg(Hf(f,R,L,C))/pi*180 #phase in deg = arg(H(f))
df <- data.frame(x = f, y = phase)
p2 <- ggplot(df,aes(x,y)) + geom_line(lwd = 1, col = 'blue') +
    scale_y_continuous(breaks=seq(-180,180,by = 30)) + 
    labs(x = "f [Hz]", y = "Arg(H(f)) [deg]") + 
    scale_x_log10(breaks = trans_breaks("log10", function(x) 10^x),labels =     trans_format("log10", math_format(10^.x)))+
    annotation_logticks(sides = "bt")

grid.arrange(p1,p2)

これで、(私)見慣れたbode線図の形となりました。

f:id:niszet:20170629203854p:plain

最後の、プロットを並べて表示についてはこちらを参考にさせていただきました。
id.fnshr.info

tidyverseからマスクされてますよってwarningが出ましたが、今回は使わないので良しとしました。

# library("gridExtra")
# 
#  次のパッケージを付け加えます: ‘gridExtra’ 
# 
#  以下のオブジェクトは ‘package:dplyr’ からマスクされています: 
# 
#      combine 

これ、geom化しようかと考えてはいたのですが、上記の通りある程度処理を加えればなんとかなってしまうので、わざわざgeomを作る必要はないのかな、と思いました。
ggplot2の中身の理解のために、これを題材に作るのは良いかもしれません。課題です。

終わりに

ということで、誰が得するのかわかりませんが、Rでも複素数を扱えて、bode線図も書くことが出来ますよ、という紹介でした。
これをRの得意な統計の分野とつなげられれば、使い道があるんですが…

しかし、リンク先にもあるように、

Well, this started as one of those “I'll do it just because I can" ...

です。Rは意外と色々なことができるので、色々試してみてください。

というわけで...

Enjoy!

WindowsユーザーだけどtubeplayRで動画が見たい!

Windows版Rは色々と辛い…。

先日、kazutanさんがtubeplayRというパッケージをリリースしました。

github.com

これは面白そうということで私も試してみたのですが、Windows環境ではRStudioが使用しているQtがエラーを出しているようで、再生ボタンを押したら最後、RStudio自体がが強制終了してしまうのです。

RStudioServerを使うという方法がある

RStudioはスタンドアロンというか、まぁいわゆる普通のRstudioとは別にRStudioServerというものがあるのです。

www.rstudio.com

うーん、サーバー、うーん…と思っていたところ、kazutanさんの記事

ローカルでRStudio Serverを試してみる

を見つけました。そうか、仮想環境なら…ということで試してみようと。
そうしたら、kazutanさんからdockerでも行けるよ!とアドバイスいただきまして、

探したらこちらを見つけました。

qiita.com

dockerはなぜか既にPCに入っていたので、Qiitaの記事通りにイメージをダウンロード、コンテナ化して実行したところ…無事にRStudioServerが起動!

devtools::install_github("kazutan/tubeplayR")

で無事、tubeplayRが実行できたのでした。めでたしめでたし。

しかし、客観的に見るとブラウザでYoutube見ていることになるので、RStudioのバージョンアップ(による、Qt由来のバグ)が待たれます…

ちなみにdockerですが、winユーザは何も考えずにインストーラ使って入れれば大丈夫だったと思います。 www.docker.com

結構前にこちらを購入したまま積んでいたのですが、今後のためにdockerの理解も深めておこうかな、と思います。 www.shoeisha.co.jp

第62回 TokyoRに参加してきました。

今回で2回目の参加です。

前回よく参加したな、自分…。しかし、そういう人も参加できる懐の深さがある、TokyoRです。

はじめに

単なる日記ですが、前回のTokyoRに参加する前の自分が知っていたら良かったと思ったことを書いてみます。
私の備忘録的なものということで、正確な情報は正しいルートから得るようにしましょう。まずはGoogle Groupに登録から!

参加申し込む方法

今回のATNDはこちらでした。 atnd.org

参加するにはATNDで登録すれば良いのですが、アカウントが必要。
twitterアカウントがあれば、それを使ってログインすることが可能です。自分はそのために公開用twitterアカウント作りました。
ちなみに、セキココというサービスがあり、それを使うと「この席にいるのは私です」とアピールできます。twitterアカウントと連動しているとフォローしたり返されたりします。
別にセキココしなくてはならないわけではないので、使うかどうかはお好きなように~

このページにある、Google Groupにも登録しておきましょう。次回のtokyoRの告知なども行われます。

ただ、twitterの里さんのアカウント@yokkunsをフォローしておくと、抜けがなくて良いかもです。大体のRおじさんがATND作成の通知をRTしている気がするので、どなたかをフォローしていたら気づく気がしますけど。

今回はキャンセル数が51もあるようです。当初の半分くらいの人数です。
なので、補欠として登録していても、ひょっとしたら当日には参加できるかもしれないので注意です。
補欠で行けなさそうだったから予定入れちゃった…な方は早めにキャンセルしておいた方が良いかもです。

行けないことがわかったら、早めにキャンセルを入れましょう~

集合場所とか

ATNDの方に書かれていますが、運営の方が30分前くらいから何回かピックアップしに来ますので、会場へ続くであろうエレベータ付近にたむろしていると良いのです。
これも書かれていますが、遅れて参加の場合、到着したらtwitter#tokyorとタグをつけて「到着しました」的なことを呟けば、運営さんが拾いに来てくれます。安心ですね。

雰囲気

初参加の方が三割~半分弱、という感じで常連さん、強者さんが2割くらい?かな。TokyoRは割と何でもありということで、気楽に参加すると良いのです。

@kashitanさんがtogetterにまとめてくださってます。当日の雰囲気はこちらでわかるかも。 togetter.com

資料のありか

これってどこかにまとまっているんでしたっけ?
togetterやtokyorタグでも探せますが、自分向けにリンク集作っておきます。

入門編

R言語データマイニング基礎

www.slideshare.net

整然データって何?

speakerdeck.com

初心者セッション2のもとになった記事はこちらで読めるようです。

book.mynavi.jp

応用編

mxnetで系列パターンマイニング

資料はまだないかと思います。セッション中、まだ結果が出きっていないというお話だったと思うので。

(タイトルメモするの忘れました…)

こちらもなさそうな。

{doAzureParallel}でお手軽クラウド並列処理

speakerdeck.com

LT

word prediction

speakerdeck.com

webshotパッケージでWebをキャプチャ

…の元になっている記事ですね。 webshotパッケージ

HijiyamaR

同日、広島市内の比治山大学で開催されたHijiyamaRの資料は下記にまとまっているそうです。 Hijiyama.R #6 発表関連資料

こちらの主催のkazutanさんはこれをやりつつ、TokyoRのLTに参加。凄すぎです…。

おわりに

そんなわけで、今回も楽しいTokyoRでした。ありがとうございました。
今回はなぜか2次回まで参加してしまいました。良かったのかな…

なんか勢いで書いてみましたが、何か問題あればご指摘ご連絡いただければと思います。twitterの方でも。

ArduinoとRを結びつけるものを探す

要するに:パッケージないかな?

探しました。
日本語だと、ここでpython経由でRに渡しています。

d.hatena.ne.jp

英語で調べると、ここがRでそのまま読んでいるような。ちょっと試してみようかな…

www.magesblog.com