niszetの日記

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

ボーカロイドV4Xに手を出してみる…

タイトルだけで言うことが終わってしまう。

そんなわけで我が家についに歌姫がやってきたのでした。

ec.crypton.co.jp

midiでの入力が出来るのですが、歌詞情報が消えてしまうようで…。

vsqxという拡張子のファイルでも与えることができ、中身はxmlとなっています。ただ、バージョン違いで中のタグが全然違うようなのでちょっと解読に時間がかかりそう。
xmlなら別に何でexportしてもよいから、Rでも出来るわけですね(midiも出力する関数書けば出来るけど)

ということで、俺の戦いはこれからだ…!という感じです。

そして、以下の2冊を買ってしまいました…

www.ymm.co.jp

www.ymm.co.jp

私はどこへ向かおうというのか…

Enjoy!!

select_ifとstr_detectでデータフレームの列名を柔軟に指定して選択する (追記)

もともとは別のことをしようと思ったのですが、1トピックに絞ります。

データフレームの列名をある程度ざっくりと選びたい。

select_atとかでも良いのかもしれませんが、select_ifは条件を指定して選ぶことが出来るので便利ですね。
たとえばこんな感じに。

iris %>% select_if(str_detect(colnames(.), "Petal")) %>% head
#>   Petal.Length Petal.Width
#> 1          1.4         0.2
#> 2          1.4         0.2
#> 3          1.3         0.2
#> 4          1.5         0.2
#> 5          1.4         0.2
#> 6          1.7         0.4

これについては、この書き方でも出来る。

iris %>% select(contains("Sepal")) %>% head()
#>   Sepal.Length Sepal.Width
#> 1          5.1         3.5
#> 2          4.9         3.0
#> 3          4.7         3.2
#> 4          4.6         3.1
#> 5          5.0         3.6
#> 6          5.4         3.9

後者については安定のyutannihilationさんからのアドバイス

をいただきました。

このとき、列名に複数の条件を指定する場合は前者の書き方を使い、str_detectのpatternの方に書くと出来て、こんな感じになります。

iris %>% select_if(str_detect(colnames(.), "(Petal)|(Sepal)")) %>% head
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width
#> 1          5.1         3.5          1.4         0.2
#> 2          4.9         3.0          1.4         0.2
#> 3          4.7         3.2          1.3         0.2
#> 4          4.6         3.1          1.5         0.2
#> 5          5.0         3.6          1.4         0.2
#> 6          5.4         3.9          1.7         0.4

後者の方法では複数指定はたぶんできない...

列が大量にあるけど、特定の文字列を含むことがわかっていて、それが複数のパタンある場合に使える(使った)のですが、そんなに需要はないのかも。 他にも良い方法はありそうですが、「条件を満たしたら選択(select_if)する、条件は列名について次のパタンを見つけたとき」と、自分にはわかりやすいので良いかな…

select_ifの挙動

この前後でちょっとハマってしまって、またユタ兄さんに助けていただきました。

論理型のベクトルの場合はそのまま列が選択される。下記の例だとselect(c(1,4))としたときと同じ結果になる

iris %>% select_if(c(T,F,F,T,F)) %>% head
#>   Sepal.Length Petal.Width
#> 1          5.1         0.2
#> 2          4.9         0.2
#> 3          4.7         0.2
#> 4          4.6         0.2
#> 5          5.0         0.2
#> 6          5.4         0.4

一方、上の方に書いたようにfunctionで与えると、各列をベクトルとして与えます。 これは下記のようにして確かめることが出来ます(listではないことの確認。data.frameでも同様

iris %>% select_if(function(df){is.list(df)})
NA

iris %>% select_if(function(df){is.vector(df)}) %>% head
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width
#> 1          5.1         3.5          1.4         0.2
#> 2          4.9         3.0          1.4         0.2
#> 3          4.7         3.2          1.3         0.2
#> 4          4.6         3.1          1.5         0.2
#> 5          5.0         3.6          1.4         0.2
#> 6          5.4         3.9          1.7         0.4```

しかし、reprex使うと1つめはNAが返って?きますね…。コンソール上だと「0 列 150 行のデータフレーム」と返ってきますが。それぞれ環境が異なるので表示が違っても(゚ε゚)キニシナイ!!

しかし、functionは↓のように、typeofだとclosureって返ってきてやや混乱しますね(classもちゃんとfunctionって返すのか…知らなかった)

str(function(){})
#> function ()  
#>  - attr(*, "srcref")=Class 'srcref'  atomic [1:8] 17 5 17 16 5 16 17 17
#>   .. ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x00000000160567e0>
typeof(function(){})
#> [1] "closure"
mode(function(){})
#> [1] "function"
class(function(){})
#> [1] "function"
is.function(function(){})
#> [1] TRUE

ということで、ちゃんとマニュアルに目を通しましょう…というお話でした(そうだっけ?)

Enjoy!!

追記

その後、select+matchesでもいけますよ!ということでアドバイスいただきました。

やってみた。

iris %>% select(matches("(Petal)|(Sepal)")) %>% head
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width
#> 1          5.1         3.5          1.4         0.2
#> 2          4.9         3.0          1.4         0.2
#> 3          4.7         3.2          1.3         0.2
#> 4          4.6         3.1          1.5         0.2
#> 5          5.0         3.6          1.4         0.2
#> 6          5.4         3.9          1.7         0.4

こっちの方が簡単ですね…。selectだと、列の番号を受け取れればそれを選択できる。select_ifは対応する列のT/Fで選択する/しないをわける、と。

また、こちらの記事も参考に、とのことでした。

qiita.com

Enjoy!!

HijiyamaR Finalに行ってきました

感想戦です。

もうずいぶん経ってしまいましたが…。ちゃんと〆ておかないと年が越せません。 なお、私のスライドは今回はupなしということで…。あれはその場で聞いていただくに限る。という名目。

はじめてのHijiyama。FinalのHijiyamaR

私、基本的に引きこもり…というか遠出をあまりしないので広島に行くのはもう10余年ぶりです。大きな街でした…。

ATNDはこちら。 atnd.org

なんか今更ながら、メンバーめっちゃ豪華ですよね。主催のkazutanさんの人徳をここでも感じることが出来ます。 関東や関西からも勢ぞろいという(四国も山口も…本当に色々なところから)

さて、比治山大学ですが、文字通り山(といってもそこまで高くない丘の上という感じですが)の上にあります。

www.hijiyama-u.ac.jp

広島の地理にはあまり詳しくはないのですが、広島駅の南の方に比治山という地名がありまして、最初はこのあたりにあるのだと勘違いしていました。あぶないあぶない…。

資料

自分のために、当日の資料を追えるものだけ追っておきました。

実験データと調査データを組み合わせるための前処理(仮)

RPubs - 複数のデータフレームを組み合わせる+α

二項分布とポアソン分布の状態空間モデル:ローデータからは見えない潜在過程の推定

東日本大震災後5年間の地震発生データ分析

LT

簡単テキストマイニング:歌詞から作品世界の魅力を探る

www.slideshare.net

今夜は動的モデリングよ~Dynrで簡単クッキング!~(仮)

www.slideshare.net

DiagrammeRと仲良くなった話

www.slideshare.net

これからはコネの時代

speakerdeck.com

saiはRに宿るか?

www.slideshare.net

今日は何回やればいいのか

www.slideshare.net

RStudio.cloud による社会人(学生)への統計教育の実践

hikaru1122.hatenadiary.jp

tidyverseに感謝する

speakerdeck.com

目指せyoutubeRの星

目指せyoutubeRの星

自分の振り返り

LT

今回はここ半年の総決算的な内容で、Rでmidiファイルを読んだりハードウェアをRからどうにかこうにか動かそうとしたりしました。最終的に音はなったものの…ここから先が頑張りどころなんですよね。
LT参加を決めたのが1週間前くらいで、「折角行くのだし…どうせなら賑やかしでも良いから発表しよう」と思い立ったので、ちょっと準備不足でしたね…。 前日は興奮してあまり寝れなかったのと、内容が盛り過ぎていたため、内容にまとまりがなかったかなー…精進します。

しかし、LTしてよかったなーって思います。インパクトは与えられたのではないかな...変態度勝負ならなかなか良いところまで行けたのではないでしょうか(それでいいのか?) 今後ともよろしくお願いいたします…。

TokyoRとはまた少し違った空気が楽しかったです。心理学系の先生方はみなさんお若い…。
いつか大阪Stanの方にも行ってみたいですね。その前にFukuoka.Rかなぁ。

広島めぐり

打ち上げのしゃぶしゃぶ、日本酒、大変美味しかったです。そのあとのお店も何食べてもおいしかったなぁ…。

そして、宮島行って厳島神社を見てきました。寝坊により、残念ながら根元まではいけなかったんですけどね。
宮島水族館にも行って来ました。イカが泳いでいたり、カキが沢山いたりして特徴的でした。あまり時間がなかったのでガッツリは見れませんでしたが…。
あとなぜか妹に遭遇したのが一番の驚きでしたね…、

あとは路面電車にも乗れたし、原爆ドームと爆心地にも足を運ぶことが出来て良かった…。

という感じで。時間かかった割にまとまりのないただの日記になってしまいましたが…

Enjoy!!

TokyoR66に行ってきました

新しい体制

今回からTokyo.Rの運営さんの体制や進め方が少し変わりました。
といっても、いい雰囲気はそのままですので。

また、今回は発表資料のリンクをATNDに貼っていただいているようです。 atnd.org

ありがたや…

一時期、自分も資料リンクまとめていましたが、あれ結構時間かかるのですよね。特に二日酔いの頭では半日かかる。ありがたいですが無理のない範囲で是非…

復習をする

ということで、ほくそえむ親分さんの変化検知の復習として写経を。

で、Exercise 3の手前の、cpt.meanvarの例を実行していると、たまに

data <- c(rexp(50, rate=1), rexp(50, rate=5),rexp(50, rate=2),rexp(50, rate=7))
model <- cpt.meanvar(data,method="PELT", test.stat = "Exponential")
cpts(model)
#  [1]  42 150

のようになります。あれ?ちゃんとデータ渡しているのに。 で、plotすると

plot(model, cpt.width = 3)

f:id:niszet:20171221002822p:plain

たしかにこれはどこが境目かわからんかもなぁ…

調べたいこと

まだ写経も終わっていませんが、おそらく「変化の度合いがどのくらいか」と「どの程度の期間か」と「分割する区間の数」で変わるのかなーって思うのですが、ちゃんと知りたいなら論文読もう。って感じですね。
まぁ、いずれまた…

Enjoy!!

追記

上の例の何がおかしいのかわかりにくいので、ホクソエム親分の資料のリンクと、対応するページ…数えると36ページ目?を。本当は4つの区間に分かれるはずなんだけど、ノイズ分が大きすぎて分離できなかった、ということです。

speakerdeck.com

control package on CRAN

ついにCRANに…!

今日、なんとなくpackageをupdateしようと思ってみていたら、control packageが0.1.142から0.2.5になるという表示がされていることを見つけたのです。

あれ?このパッケージ、githubから持ってきたものなのだけど…?と思って調べたらCRAN入りしていました。おめでたい。 夏ぐらいに見つけて、気になっていたのです。

年内に使ってみて感想書きましょうか。

CRAN - Package control

久々に書くので、軽めの記事を挟んでおこうということで、今日はここまでで。

Enjoy!!

(R) tuneRとggplot2で作るピアノロール風プロット(図差し替え…)

f:id:niszet:20171129001626p:plain# 既存パッケージだけでいけるじゃないですかー さて、tuneRというパッケージがあります。midiやwave、mp3を入力して色々出来るのですがあまり解説されている記事がないように思えます。

まぁ、今回はtuneRの解説はしないのですが…。需要があれば追々…。

TokyoR 64のLT、そして今回のHijiyamaR Final LTでtuneRでは…なのでrsmfを…とか言っていましたが、色々巡り巡ってtuneR+ggplot2でも出来ることに気づいたので責任とって解説書きます。

プロットしてみる。

さて、適当なmidiファイルは別途用意してみてください。midiデータには著作権があると思いますので、ご注意(例で使っているものはCC0扱いで公開されていたデータセットから)

コード例

コードは下記のようになります。tuneRパッケージ内の関数は明示的にtuneR::をつけていますが、libraryで読み込んでいますのでなくても動作します。

library(tuneR)
library(tidyverse)

mf <- tuneR::readMidi("hogehoge.mid")

mf %>% tuneR::getMidiNotes() %>% ggplot()+geom_segment(aes(
  x=time, y=note, xend=time+length, yend=note,
  color=as.factor(note %% 12), size=1)) + xlim(0, 50000)+
  xlab("time") +  ylab("note") + theme(legend.position="none")+
  scale_colour_brewer(palette = "Paired")

tuneR::readMidi は引数で与えたmidiファイルを読み、結果をdata.frameで返します。

tuneR::getMidiNotesは先の関数で得られたdata.frameのうち、Note(音符)情報だけを抜き出してdata.frameで返します。

曲中でテンポや拍子が変わることがあるのでそれも見ないと本当はいけませんが…割愛。

今回はシンプルに、音情報から音の高さと長さを、何も調整せずにプロットしてみます。

tuneRから得られるdata.frameの中身の説明?

上記コードの変数mf(readMidiで読んだdata.frame)をgetMidiNotes()に与えて得られるdata.frameの中身はこんな感じです。

  time length track channel note notename velocity
1 3840    240     2       0   70      a#'       92
2 4080    240     2       0   74      d''       92
3 4320    480     2       0   77      f''       92
4 4800    240     2       0   70      a#'       92
5 5040    240     2       0   75     d#''       92
6 5280    600     2       0   79      g''       92

midiにふくまれるヘッダやコントロール情報を除いて、note情報だけになりました。

一応、各列の簡単な解説…

timeはなり始めの時間、lengthはその音のなっている時間(長さ)
トラック、チャンネルはそれぞれトラック番号、チャンネル番号
noteは音の高さ、notenameはnoteの名前ですが、ドがC、レがD...です。'でオクターブ違いを表していますね。フラットはあるのだろうか?まだあまり調べ切れていません。 velocityは音量です。

なお、このlengthやtimeはheaderにある情報から何分音符を表しているかがわかるのですが、今回は割愛。

geom_segmentは始点と終点をx,yで指定するgeomです。あまり使うことはないのではないかな…。aesの引数でx,y,xend,yendを指定していますが、xに時間、yに音の高さを示していることになりますね。

colorにはas.factorした、noteを12で割ったあまりにしていますが、この12は1オクターブに含まれる、半音単位の音の数(C, C#, D, D#, E, F, F#, G, G#, A, A#, B)で、オクターブ違いを吸収しています(ドならオクターブうえでも同じ色)

xlab、ylabは軸ラベルですね。themeは凡例を消しています。

scale_colour_brewer(palette = "Paired")は単純に12音分の色があるパレットだったので、ここは任意の12色を指定してみてください。

まぁ、今回はnoteとtimeとlengthしか使わないのですが…。

出力結果

これで出力が下記のようになります。 f:id:niszet:20171128005641p:plain

おー。出来てしまった。

アレンジ

これをちょっと変更すると、、、

mf %>% tuneR::getMidiNotes() %>% ggplot()+geom_segment(aes(
  y=time, x=note, yend=time+length, xend=note,
  color=as.factor(note %% 12), size=1)) + ylim(0, 50000)+
  xlab("time") + ylab("note") + theme(legend.position="none")+
  scale_colour_brewer(palette = "Paired")

こんな感じ。縦が時間、横が音の高さとなってます

f:id:niszet:20171129001626p:plain (図のlabelが間違っていたので差し替えました@0:17)

なんか音ゲーっぽくなりましたね。

ということで、既存のパッケージから、LTで紹介したようなプロットが出来るという紹介でした。

テンポや拍子を考慮するのはちょっと工夫が必要そうですが、それはまた機会があれば。

Enjoy!!

(R) RStudio上でのViewの結果の表示のさせ方、変わりました? (+追記修正)(メモ)

v1.1からの機能ということです。

なんと、今回のHijiyamaRのオープニングで説明があったとのこと…。 資料が公開されたら参照先として追加します(たぶんまだのはず)

実は色々あって開始15分くらい遅刻してしまいました。それらHijiyamaR Finalの感想についてはいずれ。

また、RStudio v1.1の新機能については下記のkazutanさんのブログにまとまっています。 kazutan.github.io

簡単で実用的?な例。

View関数はRStudio上で(に限らないですが)データを表示する際によく使う関数ですが、RStudio上での表示のさせ方が便利だなと思ったので(どうでも良いですが、utilsの中に入ってるんですね、この関数)

たとえば、このようなコードを実行する

View(ggplot())

するとこんな表示に!

f:id:niszet:20171127195550p:plain

…以前からなりましたっけ?まぁ、今あって、便利に使えることが大事…。

Typeで型(classかな)、Valueにその値が表示されるのもポイント高いですね…。

これのさらに良い点は、図の右の方に白いアイコンが出ていますが、これをクリックするとその行のデータを選択するためのコードがコンソール上に書かれるという点です。 上図の場合、

ggplot()[["theme"]]

がコンソール上に書かれます。

また、対象の行がdata.frameの場合、そのデータをView()するためのアイコンが、コンソールにコマンドを表示するアイコンの左に出てきます。data.frameをlist(あとはS3 classとか)の要素に持っている場合などに便利な気がします。

具体的な使いどころ

上記の例もggplot2パッケージの出力を見ていましたが、kazutanさんの下記の記事、

ggplotのオブジェクトから眺めてみる

を意識しています。strでも追えるのですが、階層構造が複雑になってくるとやっぱりしんどいものがあるので、View()で簡単に表示・選択できることは特に初心者にはありがたい機能だと思います。

なお、上記

RStudio.Version()
# $citation
# 
# To cite RStudio in publications use:
# 
#   RStudio Team (2016). RStudio: Integrated Development for R. RStudio, Inc., Boston,
#   MA URL http://www.rstudio.com/.
# 
# A BibTeX entry for LaTeX users is
# 
#   @Manual{,
#     title = {RStudio: Integrated Development Environment for R},
#     author = {{RStudio Team}},
#     organization = {RStudio, Inc.},
#     address = {Boston, MA},
#     year = {2016},
#     url = {http://www.rstudio.com/},
#   }
# 
# 
# $mode
# [1] "desktop"
#  
#  $version
#  [1] ‘1.1.383’

の環境のRStudioを使用しています。

Enjoy!!