研究

Studio One Prime を用いたDTM入門

この記事はKCS Advent Calender 17日目の記事です。
 
今回はDTM初心者の私が音楽班に入って一曲作れるようになるまで具体的に何を行ったか、利用させて頂いた記事等を紹介していきます。

DTM興味あるけどなんも分かんねーって方は、記事内のリンク集が参考になるかもしれません。
(DTM入門!っていうサイトは星の数ほどありますが、身近な体験談ってことで差別化を一つ。)

使用環境
OS: windows 10
DAW: Studio one 3 prime (無料ソフト)

1. DAWインストール

DAWは作曲に使うソフトです。無料で使えるものはいくつかあるのですが、私はStudio One Prime を使用しました。以下のサイトに分かりやすい導入方法が載っています。↓
https://sleepfreaks-dtm.com/for-beginner-studioone/studio-one-4-prime/

このとき追加音源の導入に失敗すると、音がでなくて詰みます。私は一度再インストールしました()
 

2. 設定

 
始める前にまずキーボードショートカットの設定をしておくことをお勧めします。
譜面の再生・停止がデフォルトではテンキーに割り当てられているので、別の触りやすいキーに割り振ると良いと思います。私は停止をF4, 再生をF5に充てました。
設定方法は以下のリンクが参考になります。(再生は”スタート”、停止は”停止”なので、検索窓にそれらを入力)
http://kumagaimashairo.com/archives/7689392.html

3. DAWに触れる

 
操作方法については、検索すれば分かりやすい解説がいくつもあります。「studio one prime 使い方」等で検索するとザクザク出てきます。(studio one 4自体のリファレンスは現状少ないのですが、UIは過去バージョンと大差ないため、3の解説でも十分役に立つと思われます。)

まず↓のサイトにお世話になりました。「新規ソングの作成」「Presenceの立ち上げ:その1」「ピアノロールで打ち込み:その1~4」の辺りの項を読めば、楽器を選んで音を鳴らせるようになります。
https://kaymusic-online.com/index.php?studiooneprime

流れを掴むのに↓の動画も分かりやすいです。
https://www.youtube.com/watch?v=VJnGqfkZhOw&t=1021s

 
とりあえず適当に楽器を選んで音を出せるようになった頃からは、以下のサイトを参考に打ち込みをしました。↓
http://dtm.55-52.com/

「ドラム打ち込み講座」「ベース打ち込み講座」「エフェクト使い方講座」等の記事が役に立ちます。特にドラム打ち込みはDTM始まった感があってすごく楽しかった記憶があるので、おすすめです。
studio one での打ち込みについては↓を参考にすると良いです。
https://abc-musicschool.com/online/2017/04/dtm_lesson4-2/

鼻歌で考えたメロディにドラムを付けてみるだけで一気に曲らしさが増したり。あとはリバーブを付けてみると楽器が艶っぽくなってテンション上がったりします。
(リバーブについては上のエフェクト使い方講座、その使用方法は以下リンク↓)
https://www.studiorag.com/blog/fushimiten/studio-one-mix/2

4. 作曲

 
メロディとドラムだけでもある程度曲らしくなったのですが、そこにコード(和音)を足していくためには、少し知識が必要でした。

まず知っているべきなのは、ドレミファソラシドの鍵盤上の位置や、音階の英語名、曲ごとに定まっているキー(調)によって使用できる黒鍵や白鍵が決まってること、などです。要するに、「Cメジャースケール」だとか「ト長調」って言われて分かればOKです。
これらの解説は以下リンクをご参考に
http://music.nonono.jp/composition/composition01
http://joy-music.jp/magazine/articles/compose/key/
https://thesaibase.com/music/theory/alphabet

 
私が一曲目に作ったのは、Koto(琴)とPan Fluteがメロディ、Basic kit(ドラム)があって、他にはFingered Bass(ベース)がコードの最低音、Grand Pianoがコード全音を弾くという構成です。
作成手順としては、まず先ほどのドラム打ち込み講座で打ち込んだドラムのパターンをコピペして、そこに鼻歌で考えたメロディを琴とフルートで鳴らしました。
次に、自分で考えたメロディから調の割り出しを行いました。無意識で歌った鼻歌でも必ず何かしらの調に属しているはずなので、打ちこんだメロディのシャープ・フラットがどこにあるのかを調べて調を確認しました。(ここが難しいかもしれません。参考↓)
http://guitarex.web.fc2.com/knowledge/key_signature.html

調が判明したことにより、その曲内で使用できるコードが7つに絞られます。
後はその7つの中からpianoで適当に鳴らしてみて、一番違和感のないものを選んで各小節に配置。
あとはそのコードの一番下の音(ルート音)をベースで鳴らして終わりです。

いやその7つって何だよ。→ダイアトニックコードと呼ばれているものです。
例) ト長調の場合: ドミソ、レファラ、ミソシ、ファラド、ソシレ、ラドミ、シレファ の七つ
要はその調の構成音について、一個飛ばしで繋いだ三音の和音のことです。
もちろん他にも色々なコードがありますが、これら七つが基本となっています。

コードの当てはめについては、要するにゴリ押しです。メロディをループ再生させながら、コードの各パターンを鳴らして聞いて選びました。

今回の私の方法はメロディを決めてから和音(コード)を探っていきましたが、コードを最初に決めた後にメロディを決めていく方法もあります。曲の流れを考えて相応しいコードの順番(コード進行)を組み上げていくため、知識が必要となる方法です。「音楽理論 入門」とかでググるとよさげです。下に参考になったサイトを貼っておきます。
http://studay.info/
https://www.studiorag.com/blog/fushimiten/kanon-chord?disp=more
http://sakkyoku.info/theory/diminished-seventh-chord/

自分で組むのでなく、コード進行を既存曲から持ってきて、それを打ち込むのも良い方法だと思います。
特定の曲でなくとも↓のようなコード進行を載せているサイトを探して、
http://www.masayoung.net/archives/970
↓こういうサイトでその各コードの構成音を調べて、dawに打ち込む、など。そこにメロディ適当につけて、ドラム付けて、ベースでその各コードのルート音(AコードならA(ラ)の音)を弾けば曲が完成します。
http://www.piano-c.com/pianoChord_CMa.html

 

こんな馬鹿みたいにリンク貼られてもチェックすんの面倒くせえよ、もっと手軽にできねえのかよ、って思う人はDAW内臓のループ音源を感覚で切り貼りすると良いかもしれません。「ループ作曲法」とかいうらしいです。ループ素材の使用方法は↓
https://www.youtube.com/watch?v=PGEMX4jJWBw&list=PL53836339204520C2&index=16

また作曲に関して分かりやすい動画を見つけたので、リンクを貼っておきます。
https://www.nicovideo.jp/watch/sm2161286

5. Tips

 
・メトロノーム
https://unko.kpop.jp/studio_one/20180208-4-metronome.php
考えたメロディを打ち込むとき、音符の長さがどこまでか分からずに困ることがあると思います。その時はメトロノームを鳴らしておくとリズムを取りやすくなります。

・ショートカットキー
https://ch.nicovideo.jp/yellow_line/blomaga/ar978623
特にctrl+s, ctrl+z, ctrl+y, Dは必須と言っていい程よく使います。また2. 設定 でショートカットキー登録したスタート、停止も必須です。マウスでカチカチするよりよっぽど楽です。

・ループ機能
https://sleepfreaks-dtm.com/for-beginner-studioone/loop-play/
試しに打ち込んでみた音が曲全体に合っているかどうかを確かめるには、再生してみる以外ありません。その度にわざわざキーを押すのも一手間です。ループ再生の機能でループさせながら、入れる音を決める、という方法がかなり便利です。

・音源
http://gaha2.blog52.fc2.com/blog-entry-766.html
外部音源でメジャーなフォーマットはVSTpluginですが、studio one primeはVSTを使用できません。studio one primeで音色を拡張する方法としては、soundfontというフォーマットがあります。(拡張子はsf2。sfzは無理なので注意!)

・Studio one起動してるとyoutube等の音が出ない
https://sleepfreaks-dtm.com/dtm-trouble/sound-out/

↓あまり関連ないですが、最近感動したTipsを貼っておきます。Studio one professional付属音源のギター打ち込みの記事です。midiデータだとかエディタの画像だとかを用いてちゃんと再現性の高い情報を提供している記事は本当に素晴らしいと思います(遠い目)
https://htmusicm.hateblo.jp/entry/studio-one-3-guitar-uchikomi

 

ここまで調子に乗ってべったべったと他人様のブログのリンクを貼り付けてきましたが、許可は一切取っておりません。もし問題だぞという方が居れば、お手数ですがご連絡をお願いいたします<(_ _)>

気合いで読むQRコード入門

この記事はKCS Advent Calender 16日目の記事です。

軽い自己紹介
初めまして。J科B3の@kam1tsur3です。セキュリティキャンプ2018にいました。kcsにはB2の時に入りましたが、LTを一度聴講しに行ったことがあるくらいの幽霊部員です。普段はCTFというセキュリティやコンピュータの周辺知識等を競う競技をやったりしています。別に普段からQRコードを読んでいるわけではありませんよ。

概要

記事は題名どおりQRコードをカメラを使わずにゴリゴリ読んでいこうという趣旨のものです。他の部員の記事に比べ実用的ではないですが、どの分野の方でも読める内容になっているので、箸休め程度に思っていただけると幸いです。

URLを貼りさえすれば良いと思ってたので、書くことが決まってからすぐ自分のブログで下書きを書いてしまいました。以下に記事のリンクを貼ります。ちゃんとこの場所用に書き直そうと思ったのですが、最近なかなか元気がないので許してください。直前に目を通すと、記事を書いた当時は元気だったのですごい文面も張り切ってるのが分かるので、とても切ない気分です。みんな頑張ろうぜ

ほんへ

https://kam1tsur3.hatenablog.com/entry/2018/12/16/131108



全くの初心者からの機械学習ロードマップ

この記事はKCSアドベントカレンダー第15日目の記事です!

おはござー!おはござー!おはござー🌻!

ぼく(リンク先:Twitter)自身の記事としてはおよそ1.5年ぶりとなります.12月も中程に差し掛かり学部3年ということもあって研究室選定で右往左往しております.

何かしら技術系の記事を書こうと思っておりましたが,そのネタはコミケ95での部誌に回すとしてここでは自分の1年間の自分語りにしようかと思います.オタク,自分語りしがち.

KCSはいくつかの班に分かれて活動しているのですが,ぼくはAI班とBlender班で主な活動を続けておりました.AI班自体の発足は結構前からあるようですが,ぼく自体がAI班に入ったのは今年度に入ってからですので,おおよそ9ヶ月程度の機械学習を学び始めてから経つことになります.

9ヶ月前までは二進も三進もわからなかった状態から,どのように機械学習の勉強を続けていったのか,その過程を共有することで,同様の立場にいるような人(いるのか?)の助けになれば幸いです.

図です

機械学習関連以外のことは灰色で示しました.

勿体ぶる必要もないので時系列順にやったこととその感想とかを紹介します.

3-4月 Python機械学習プログラミング

81kHmZ62+nL

Amazon

まず第一に,技術書を買った際に自分の手ですべて実装することを目標にしました.何かしらの言語を学ぶ際に,何に応用できるのか,これを覚えて何になるかといった視野を持つことにしています.C++を学ぶ際,クラスやオブジェクト指向,C++11のshared_ptrといったとっつきにくい概念から,どのように実活用されるかなどが全く把握できず仕舞でせっかくのプログラミングに対してやる気が全く出ずに,そのうち習慣が自然消滅してしまうといったことが多々あります.ぼくの場合には「機械学習」を学び「Webアプリケーション」を作りたい.スキルを活かせる「バイト」をしたい等,の目標を定めました.

この本では,機械学習で使われるSVMだとかK-meansだとかのアルゴリズムをある程度網羅的に,なおかつコード量も豊富に記載されており,Pythonと統計学,機械学習を万遍無く学べる良い本でした.無から有を生み出せそうな良書です.

また,TwitterのFF内間で日報/日記を付けるムーブメントが流行っているように見えたことから便乗して,ぼく自身もこの時期から日記/ブログをつけ始めることにしました.

進捗だめです

他人に見せるという体で学んだことをまとめ上げるという行為は,

  • 知識を言語化することで学習の反芻を行え,知識の定着が向上する
  • 他人に見せるための文章を書くことで,自己完結しない知識の表現方法を行える
  • 他人からも「○○ちゃんのブログは為になるなぁ!」とかレスポンスが貰えて習慣化が期待できる

といった役に立つことが盛り沢山だとおもいます.なのでこれを見ている皆さんも日記を付けてください.付けなさい!付けろ!!!

3-5月 Coursera

皆さんはCourseraというサイトを御存知でしょうか.

 

…では,AIdemyという動画教材による学習サービスサイトは聞いたことはありますでしょうか.

 

おそらくAidemyなら聞いたことがあるという方が多いのではないのでしょうか.

国内では個人的にはあまり聞かないの(僕主観ではの話を国家レベルに拡大するな)ですが,動画で学習ができて,なおかつ,時たま出されるプログラミング課題に回答して,全講座を終了させることで,修了証を貰えてLinkedIn等のサイトそれを貼ることで俺ツエーできる様になるというサイトです.動画講座自体は無料で閲覧することが可能であり,実際に演習を行うという場合でも月間6000円弱でコース内の全教材が利用可能となります.

同期で同じクラスのモヤシ炒め界の申し子でUCDavisのK氏がやってたことに便乗してAdvanced Machine Learning Specialization という全40週弱ある講座を申し込みました.しかし,大学が始まった事による忙しさの変化により,思うように進められなくなってしまったため途中で断念しています.しかしながら,機械学習の実力(と,あわよくば英語力)を身につけるには最適な教材です.一回の動画が10分前後で終わるため,空いた時間を有効的に活用ができ,講座数も豊富です.機械学習以外でも制御工学WebデザインVR開発まで非常に多岐にわたります.なかには大学のDegreeなどをも得られるような本格的な講義まであります.

Courseraに関する記事は,上のK氏もロ技研のアドベントカレンダーにて学習方法等を共有しています.細かい学習方法など,具体的な環境の揃え方などに興味がある方はこの記事を参考にしてみてください.

4-7,9-11月 Ian Goodfellowの深層学習邦訳版

61zJusXfyjL._SX258_BO1,204,203,200_

2018年度は,KCSの方針で週に2度ほど集まって,片方はゼロから作るを頭から読んでいく会(初級者向け)と,Ian Goodfellowの深層学習や各種論文を読んでいく会(上級者向け)を開催していました.

前者の方はおおよそ無難な結果で終わることができたのですが,後者の方は読み込み始めてからこの本が上級者向けなどではなく人智を超越した神とそれに匹敵する最強GAN制作おにいさんしか理解できないような代物であることに気付きました.

 

平平凡凡である僕は開いては悶え開いては悶えを繰り返し,全く先に進めずじまいでした.(げに今もそうなのですが.)しかし,間違いなく知識の得られる量としては日本語文献では抜群に豊富のような気がするため,これを理解さえできればおおよその深層学習の基礎については分かったと言い張れるだろうという自信がつきます(ということにしておきます).

4-7月 ゼロから作るDeep Learning ①

picture_large978-4-87311-758-4

内容に関する評価は10万部のセラーを記録したため探せばいくらでも出てくるため文が拙い僕が書くのもアレなので省略します.

KCSでは毎年(といっても先輩いわく2015年ごろからの習慣で)新入生向けの講習会を4-6月にかけて開催しています.その講習会の教材として活用しました.

実装レベルから,Adam等のオプティマイザの説明,CNNの構造まで詳しく説明されており,説明も概ね分かりやすかったです.次年度以降のAI班の活動方針は僕の手中でもないので知る由もないのですが,もし「教科書を作る」となった場合には非常に参考になるのではないか.というような良書です.

8-9月 パターン認識と機械学習

    その日、人類は思い出した。
    ベイズに凌辱されていた恐怖を。
    頻度論の中に囚われていた屈辱を。

    Seid ihr Frequenztheorie? Nein, wir sind der Bayesian!

ベイズに凌辱されました.

日記に日記とは思えない分量を書いたりしたので読んでください.

変分ベイズ(1) 変分ベイズ(2) 多項式回帰(1) 多項式回帰(2)

通年 論文輪読

KCSでは,学習の一環として,有志が集まって自分が読んできた論文をプレゼンにまとめて,知見を共有する回を行っています.

論文を読むことで,最新の知識を入手でき,多くこなしていくことで,論文の書き方や構成といったものがだいたい把握できて,将来の修論だとかを書く際に非常に参考になります.最新鋭の論文でも,Github等に本人の実装や他人による追実装等が挙げられており,写経するといっただけでも応用事例を実際にプログラムでき,最新鋭のアルゴリズムを手元のマシンで再現できるというのは,非常にモチベーションの向上につながるかと思います.

昨今,arXiv等には日に夥しい数の論文が投稿されています.その中から,読みたい論文を発見することは非常に困難だと思います.そこで,Twitter等を利用して他人の腕を借りて追いつくなど,周りの同士と共有して切磋琢磨できる環境を構築することは非常に重要となります.

これから

三田祭にて軽いWebアプリケーションを作った経験から,Web関連のことを学んでいこうかと思います.単一分野だけに留まらずに関連分野に目を向けて学習していきたいと思います.

また,KCS内でも本の輪読会を継続する声が上がっています.非常に嬉しいです.

リアルでも環境構築(特にデュアルディスプレイ)が重要なんだなと感じる一年であったとさ.完.

超解像の基礎


情報工学科3年、AI班班長の渡邉です。研究室の決定の際にメンタルがグワングワンしていましたが今は元気です。

今回は下級生の機械学習の実践として理解しやすく、結果もわかりやすい超解像の分野に関して、その初歩の部分の論文を簡単に解説していこうと思います。

超解像とは?

すごい簡単に言えば画質を上げるやつです。waifu2xなどは有名ですが、最近ではA.I.Gigapixelなどの商品も出てきているので、技術の進歩を感じますね。

最初の論文

機械学習が超解像の分野に用いられたのは2014年のImage Super-Resolution Using Deep Convolutional Networks.が最初だといわれています(確認してないので違ったら教えてください)
この論文内で採用されているモデルは3層と非常に浅く、損失関数は最小二乗誤差となっています。これを図や数式で示すと以下のようになります。尚、モデル図や損失関数の式は上の本論文から引用しています。
srcnn

$$
L(\Theta) = \frac{1}{n}\sum_{i=1}^{n}{|F(\boldsymbol{Y_i:\Theta)}-\boldsymbol{X_i}|}
$$
$$
\Theta = {W_i,W_2,W_3,B_1,B_2,B_3}
$$
このような今からだとチュートリアルにも思えるような簡単なモデルですが、PSNR(ピーク信号雑音比)という指標において既存手法を上回る性能を発揮しています。当時の既存手法と結果を比較したものが論文中に示されているのでこれも提示します。
SRCNN-result
このままだと何も違いが判りませんが、拡大するとわかりやすくなると思います。

そしてこの論文以降、機械学習を超解像に用いるのがブームになっていきました。

SRGAN

機械学習により超解像の分野にはある種ブレイクスルーが訪れたと考えられていましたが、最小二乗法を用いると、CNNで圧縮された値を最小化しようとするため、PSNRベースで見れば確かに雑音が小さいものが出力されますが、人間の視覚的にはあまりそれらしくないという状況が発生していました。これを解決する手法として用いられたのがGANです。要は、GANでは(うまくいけば)それらしいものを生成することができるので、これを使って超解像を行うことで、人間の目から見てそれっぽいものを作れるのではないかと考えられるようになり、実際にうまくいったものととして紹介されたのがPhoto-Realistic Single Image Super-Resolution Using a Generative Adversarial Network(2016)、通称SRGANです。この論文内では、新たな主な取り組みとしては、Pixelshuffler、Content loss、Adversarial lossの採用等が挙げられますが。次はこれらの解説を簡単に行おうと思います。

Pixelshuffler

通常のdeconvolutionでは、生成された画像が格子状になっている箇所があるものが比較的よくみられました。それは、画素ごとに参照回数に差があるためであり、実際にhttps://distill.pub/2016/deconv-checkerboard/にある動画を見てもらうと直感的にわかると思います。


そしてこれを解決するために用いられたのがPixelshufflerであり、Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Networkに初めて登場しています。これが、実際にはどのような操作を行っているのかというと、各チャネルの画素をその場に展開するという手法をとっています。言葉だけではわかりにくいので、元論文から画像を引用します。
pixelshuffler
画像が小さくなることを忘れていたので言葉でも頑張ってなるべくわかりやすくすることにします。convolution等を行った後のサイズが$$w\times h\times c^2$$であったときに、Pixelshufflerでは、これを$$wc\times hc\times 1$$として出力することで、deconvolutionに相当する操作を行っています。

Content loss

これは、style-transfer界隈から用いられたもので、各画素の値を比較するのではなく、学習済みのVGGに画像を流し、中間層での特徴量を比較することによって、鮮明な画像を出力することができるようにしたものです。数式としてはi番目のMaxPooling層の前のJ番目の畳み込み層(アクティベーション後)の特徴量などを逐次計算しています。(数式が入力できなかったのでこれで許してください、Hackmdで入力できたのになぜ)

Adversarial loss

GANの損失関数です。数式が入力できなくなった(添え字が複数段階つく数式などが表示できない)のでこれもほとんど通常のGANの損失関数と変化がないのでこれだけにしておきます。

SRGANのモデル

いろいろ書きましたが、結局SRGANのモデルは以下のようになっています。
SRGAN-models
また、損失関数に関しては、generatorはContent loss と Adversarial loss を1:0.001の割合で足し合わせて使用しているそうです。
では、SRGANがどの程度の性能を出すことができたのかを比較してみましょう。

SRGANの性能

元論文では、以下のような差が出たことが報告されています。
srganresultimage

確かに、SRGANの性能が他のSRCNN等と比較してよくなっていることがわかります。また、SRGANは特に人間が主観的に判断した際の美しさ(MOS)の値がよいことが知られており、それを示している結果は以下の画像の通りです。
srganresurltable2
尚、これらの画像において、SRGANのAdversarial lossを考慮しないものはSRResNetと呼ばれています。

最近の研究

これらの超解像の技術の進歩の結果、PSNRなどの数式で表すことができるような定量的な指標と、人間の主観で判断するMOSなどの定量的な指標の間にはトレードオフの関係があることがわかっており、どちらかに特化した手法が最近は開発される流れになってきています。具体的な例としては、SRGANの中のAdversarial lossのgenaratorの部分のlossに関しても考慮し、その中間層の特徴を生かすような構造を用いたSRFeatや、PSNRの向上に特化したRCANや、SRGANに対して、さらに他の手法で用いられた手法を取り込むことでさらにMOSの評価を上げたESRGANなどが開発されています。

所感

記事の冒頭にも書きましたが、このような分野の大きな利点は成果を実際に見て確認することができることだと思います。また、自分で記事を書いてみて、改めて基礎分野の重要性を感じました。
 

鯖缶 #とは

*これはKCS AdventCalender2018 13日目の記事です*

はじめに

はいどうもこんにちは.
やり手の名ばかりサーバ管理担当(鯖缶),いくぴーです.
最近サーバー構築やってるんですけど,ありえんハマっているのでネタにします.
文章力皆無なのはゆるしてヒヤシンス…

やっていること

サーバをたくさんおっ立てなくてはならないのですが

  • 個別で立てるのがダルい
  • 個別で管理するのがダルい
  • 開発環境と本番環境が違うとダルい

と3つのダルみが揃った結果,「docker compose使えばええやん」という安易な発想に至りました.
そういうことである.

今回はローカルでの開発用仮想サーバを立てることをメインにして書いていきますね.

実際にどうやってる?

必要なもの

サーバーに必要なのはDockerとDocker Composeだけです.
ローカルで本番と同じ構成のサーバを立てる際に必要なのは

  • VirtualBox
  • Vagrant
  • Docker (Docker Compose)

こんなとこですね.
VirtualBoxとVagrantはローカルに仮想環境を簡単に立てるために使います.
Windows10からDockerを使えるようになったのですが,Home版では使えないので…
ホストOSの違いを気にしなくていいようにした結果こうなりました.やはりWindowsはクソ.

やりかた

1. VirtualBoxとVagrantをインストール

ここでは本筋ではないので省略します.ネット上に記事はたくさん転がってるので参考にしてください.
Vagrantの使い方もとっっっても簡単なのでググってみましょう.

  • vagrant up (起動)
  • vagrant ssh (Vagrantで立ち上げたゲスト環境にSSHログイン)
  • vagrant halt (停止)
  • vagrant reload --provision (再起動する際にprovisionを実行)
  • vagrant destory (仮想環境を破棄)

とりあえずこれだけ知っていればどうにかなります.

2. Vagrantfileを編集

適当な作業ディレクトリをターミナル/コマンドプロンプトで開き,vagrant init "{BOX_NAME}"します.
BOX_NAMEはここから引っ張ってきます.今回は例としてubuntu/bionic64を使用しますね.
vagrant init "ubuntu/bionic64"を実行すると,Vagrantfileという以下のようなファイルができます.

ちなみに,このVagrantfileには設定上の様々なヒントがコメントとして記載されています.超親切ですね!
これをもとに,いい感じのオレオレVagrantfileを仕上げてみました.それとついでにdocker / docker-composeインストール用のシェルスクリプトも作りました.

ちなみに,Vagrantfile内のprovisionのところでshellの代わりにdockerを指定してconfig.vm.provision "docker", do |d|とすることで自動的にインストールすることも出来るのですが,本番サーバで実際に動かすDockerとバージョンを統一したいので,わざわざ手動でインストールしています.

3. docker-compose.ymlとnginx.confを編集

Vagrantfileと同じディレクトリにdocker-compose.ymlとnginx.confいう名前でファイルをふたつ作っておきます.
docker-compose.ymlの中はご自由に…という感じなのですが,今回はNginxでHelllo Worldを表示させることを目標にしましょう.
ちなみにNginxはApacheとならぶwebサーバソフトウェアのひとつです.
このNginxの設定ファイルnginx.confの設定例も一緒に貼っておきます.

またVagrantfileと同じディレクトリにwwwディレクトリを作り,その中にhello worldを表示させるindex.htmlを置いておきます.

4. 仮想サーバ起動

ここまでできたら,あとは仮想環境を立ち上げるだけです.Vagrantfileのあるディレクトリでvagrant upしてみましょう.
初回はOSのイメージを引っ張ってくるので少し時間がかかります.気長に待ちましょう.
しばらくするとCreating Web...と表示が出てくると思います(出てこないかもしれないですが).そうしたらブラウザでlocalhostを開いてみましょう.Hello Worldと表示されているはずです.

さいごに

今回,僕はさくらのVPSを借りているのですが,サーバーを本格的に運用するなら,これ以外にもやるべきことはたくさんあります.
最も面倒くさいのがセキュリティまわりの設定です.
ファイアウォールやSELinuxの設定も必要ですし,また多くのdockerコンテナは基本的にrootユーザーで実行されてしまうのでこれもまたセキュリティ上のリスクを抱えています.これを回避するための策も講じなければなりません.労力に見合わないんだよなぁ…
ただ,「今のローカルの環境を壊したくない,リモートデバッグ的に使いたい」というのであればちょうどいいかもですね!

というわけで,個人とか小規模なスタートアップ等でサービス開発するときはあらかじめ色々入ってくれてるやつ(Netlifyとか)を活用したほうがいいと思います.
つまりそういうことなんである.以上.

Node.jsを触ってみた

  1. Node.jsとは
    javascriptという言語がありますが,これはよくhtmlと組み合わせてクライアント側で使われます。しかし,Node.jsというものを使えばサーバー上で動かせます。Express-generatorと組み合わせて簡単な一人用チャットを作ってみました。
  2. Node.jsのインストール
    Node.jsと検索して公式ホームページからインストールすればいいです。するとコマンドプロンプトでnodeというコマンドが使えるようになります。
  3. フォルダの作成
    どこでもいいのでフォルダを作ります。
  4. socket.ioのインストール
    コマンドプロンプトのcdでそのディレクトリに移動した後,npm install -save socket.ioでできます。
  5. フレームワークのインストール
    npm install -g express-generatorでインストールできます。
  6. アプリの原型作成
    express -e appで作れます。appの部分は何でも構いません。
  7. パッケージのインストール
    cd appでappフォルダに移動します。そのあと,npm installと入力します。この時点ですでにアプリは出来上がっています。コマンドプロンプトでnode bin\wwwと入力するとアプリを実行できます。ブラウザでhttp://localhost:3000と入力すれば,Welcome to Expressと出てくるはずです。
  8. コードを書く
    編集するのは,wwwとindex.ejsです。Addedと書いてあるところに追加するだけで完成です。
    index.ejs:

    <!DOCTYPE html>
    <html>
    <head>
      <title>
        <%= title %>
      </title>
      <link rel=’stylesheet’ href=’/stylesheets/style.css’ />
      <!–Added–>
      <script src=”socket.io/socket.io.js”></script>
      <script src=”https://code.jquery.com/jquery-1.11.1.js”></script>
    </head>
    <body>
      <h1>
        <%= title %>
      </h1>
      <p>Welcome to
        <%= title %>
      </p>
      <!–Added–>
      <form id=”form” action=”#”>
        <input id=”input” autocomplete=”off” /><button>送信</button>
      </form>
      <ul id=”messages”></ul>
      <script>
        var socketio = io();
        $(function () {
          $(‘#form’).submit(function () {
            socketio.emit(‘message’, $(‘#input’).val());
            $(‘#input’).val(”);
            return false;
          });
          socketio.on(‘message’, function (msg) {
            $(‘#messages’).append($(‘<li>’).text(msg));
          });
        });
      </script>
    </body>
    </html>

    www.js:

    #!/usr/bin/env node
    /**
    * Module dependencies.
    */
    var app = require(‘../app’);
    var debug = require(‘debug’)(‘app:server’);
    var http = require(‘http’);
    /**
    * Get port from environment and store in Express.
    */
    var port = normalizePort(process.env.PORT || ‘3000’);
    app.set(‘port’, port);
    /**
    * Create HTTP server.
    */
    var server = http.createServer(app);
    /**
    * Listen on provided port, on all network interfaces.
    */
    server.listen(port);
    server.on(‘error’, onError);
    server.on(‘listening’, onListening);
    /**
    * Normalize a port into a number, string, or false.
    */
    function normalizePort(val) {
      var port = parseInt(val, 10);
      if (isNaN(port)) {
        // named pipe
        return val;
      }
      if (port >= 0) {
        // port number
        return port;
      }
      return false;
    }
    /**
    * Event listener for HTTP server “error” event.
    */
    function onError(error) {
      if (error.syscall !== ‘listen’) {
        throw error;
      }
      var bind = typeof port === ‘string’
        ? ‘Pipe ‘ + port
        : ‘Port ‘ + port;
      // handle specific listen errors with friendly messages
      switch (error.code) {
        case ‘EACCES’:
          console.error(bind + ‘ requires elevated privileges’);
          process.exit(1);
          break;
        case ‘EADDRINUSE’:
          console.error(bind + ‘ is already in use’);
          process.exit(1);
          break;
        default:
          throw error;
      }
    }
    /**
    * Event listener for HTTP server “listening” event.
    */
    function onListening() {
      var addr = server.address();
      var bind = typeof addr === ‘string’
        ? ‘pipe ‘ + addr
        : ‘port ‘ + addr.port;
      debug(‘Listening on ‘ + bind);
    }
    /**
    * Added
    */
    var io = require(‘socket.io’)(server);
    io.on(‘connection’, function (socket) {
      socket.on(‘message’, function (msg) {
        console.log(msg);
        io.emit(‘message’, msg);
      });
    });
  9. 完成
    スクリーンショット (1352)2

CNNについて

こんにちは。1年のhirotです。KCSでは主にAI班で活動しています。
と言っても、4月から12月にいたるまでに身に着けた知識はゼロに近く四捨五入したら初心者になるレベルですが…
しかし、今回はそんな僕が三田祭期間中に多少勉強したCNNの仕組みについて簡単に書いていきたいと思います。

★CNNとは

画像処理や音声認識など様々なところで使われるニューラルネットワークの一つです。主に「全結合層」「出力層」「畳み込み層」「プーリング層」の4層で構成されていて、これらを組み合わせることで処理を行えるという仕組みです。
例えば、「今持ってるたくさんの写真の動物が犬か猫か調べたい」という時に使用します。

★全結合層とは

1つの写真が持っている様々なデータをすべてまとめて扱いやすいように変換し、それにより得られたデータを活性化関数というもので差別化を行う層です。
例えれば、「この写真の動物の目と鼻と口は犬っぽい。だけど耳は猫っぽいなぁ」と識別します。

★出力層とは

全結合層で得られた結果を分析して、最終的な結果を出す層です。
例えれば、「犬成分の方が多い。だからこの動物は犬率75%だ」と出力します。

★畳み込み層とは

従来のニューラルネットワークは上の「全結合層」と「出力層」で構成されていました。しかし、ここで使われている「全結合層」にはデータをまとめる際に必要なデータを無くしてしまうという欠点があり、処理精度が高くありませんでした。
そこであらかじめ必要な情報を出しておくように改善され、その際用いられたのが「畳み込み層」です。

例えば、
ao
と表される画像があった時、
ak
畳み込みフィルタ-(特徴を浮かばせるもの)を通すと、
kk3.PNG

となり、出てきた緑色が特徴付けられた画像になります。
例えれば、「この動物は口が長くて、耳はピンと立っているな」と特徴を見つけます。

★プーリング層とは

取り扱っているデータの詳細情報を消去して、認識の幅を持たせる層です。
poo.PNG
このように1つの画像のある程度の範囲の最大値をとったり、平均化を行ったりします。
例えれば、「この動物の鼻に水滴がついてるけど、これは情報の一つにいれなくても平気だな」と考慮しなくていい情報を無くします。

★そして全部合わせてCNN

初めに述べたようにCNNはこれらの層を合わせて機能します。
順番は「畳み込み層→プーリング層」を何回か行った後、得たデータで「全結合層→出力層」となります。
とても大雑把な仕組みはこのような感じです。

★最後に

かなり雑になりましたが、CNNの仕組みについて書かせて頂きました。
Deeplearningに触れたことが無い人にも分かって頂けたら幸いです。
何か間違いがあったらすいません_(。。;)_

力学を使わないでハミルトニアン・モンテカルロ法を説明する

こんにちは。KCSアドベントカレンダー2018の12月9日の記事です。

https://adventar.org/calendars/3325

投稿者は数理科学科3年の鴨井です。僕のことを知らない人もいると思うので自己紹介をしておきます。僕は機械学習の勉強をしていて、2017年度のKCS副代表・AI班の代表でした。今は派遣留学で1年間カーネギー・メロン大学に留学をしています。主に自然言語処理、ベイズ学習、音声処理の勉強をしています。

記事は数式が書きやすいことと、単純にこのサイトの存在を忘れていたので自分のサイトに書きました。

https://ryokamoi.github.io/blog/tech/2018/12/09/hmc

記事の内容はハミルトニアン・モンテカルロ法というサンプリングの手法についてです。他の本などとは少し異なる方向性からの説明になっています。

ちなみに2018年12月9日は声優・水瀬いのりさんのファンクラブイベントの開催日でした。僕はアメリカにいるので参加できませんでした。とても悲しいです。水瀬いのりさんは1月23日に7thシングルを発売するので、よろしくお願いします。

https://www.inoriminase.com/

RadeonRaysを使ってみた

どうも,チョコです.

最近レイトレーシングをちょっとやってるんですけど,流石に自分でメモリ構造体を作るのが不効率すぎて辛い.昨日Siggraph Asia行った時に見たRenderMan22が速すぎて衝撃を受けました.

そこで,AMDが開発したRadeonRays(以下RR)というオープンソースなライブラリを見つけました.しかもopencl1.2なのでいろんな環境で動きますね.

(ここでレイトレプロのみなさんへの忠告です.この記事を書いた僕はくそレイトレ―シング初心者です.画像を見て吐き気がしたら見るのをやめましょう.)

さて,RRのサンプルを動かしてみよう.ここではVisualStudioを使ってCornellBoxサンプルをコンパイルして見ましょう.

DmqIdRdUwAA2Wmt.jpg large

おう.すごい.

しかし,これだとレイトレっぽくないので,とりあえず反射を入れましょう.

反射とは要するに,レイをdとしたら,表面の法線nに対して

d’=d2(dn)n

を計算すればいいですね.また,この時,最終の色は元の色と乗算します.

DmqWF7MV4AEb7vS.jpg large

レイトレっぽくなりましたね.

次に,反射をDiffuseにしましょう.ここではLambertを使います.Lambertは簡単にいうと,入射角と法線の内積で明るさが決まりますね.まずは単純に,表面から半球の法線をランダムに決めて内積を取って乗算します.ただし,ここでは光源を円に変え,円に当たらなかったレイは黒にします.

cwe

ノイズ高いですね(適当).

Diffuseの次は当然Specularですね.ここではBeckmannを使います.説明が面倒なのでググって.ただし,普通にランダムに取ると収束まで結構時間がかかりますので,ここではImportance Samplingを行います.

BeckmannのImportance Samplingはここを見てください.

LambertのImportance Samplingはここを見てください.

Specularだけだとこうなります(Beckmann coefficient = 0.2).

s

ピカピカですね.

DiffuseとSpecularの組み合わせはShlick’s Fresnelを使います.とりあえず単純に,このFresnelの値を確率のカットオフとして,ランダム値がこの値より小さかったらSpecular反射を解散して,そうでなかったらDiffuseということにします.こういうことです.

すると結果はこうなります(Specular = 0.4).

wv

ノイズ高いですね(これしかコメント言えん).

箱は見飽きたので,サルを入れてみましょう.サルは金属にしましょう.

Screenshot (381)

ふむ....

サルは可愛くないので,シャロちゃんを入れましょう().CornellBoxも消して,Skyboxを入れましょう.

レイが表面にぶつからなかった時,方向を使ってSkyboxから色をこのように取ります.ただし,レイがまだ反射していないものなら黒にします.

するとこのようになります(適当).

Screenshot (385)

かわいい...


まだまだダメですが満足したのでやめます.最後にコメントです.

RRのGeneratePerspectiveRaysは視野を気にしないので,表示の縦横比を帰ると変になります.そのため,GLMの行列を使って書き換えます.

Importance Samplingが入っているLambertとBeckmannのコードです.ただし,乱数生成器はXorshiftを使います.

では.

Rinju史上最速の作曲法

こんにちは、Rinjuです。KCS音楽班に所属する1年生です。今日担当なのに、今日の17時から書き始めるという不手際。そしてうまく書けずに内容変更と相成ってしまいまして、時間のない状況であります。

ん? 今、時間がないって言いました!?

言ってないし! 計画通りだし!! と言いたいところですが今回は「時間がない」と言って話を始めます。というのも、締め切り間際で時間がないときとか、とりあえず形にしてから考えたいときとかに、さっと楽曲を作ってしまう方法を僕なりに考えて実行してきたので、それを今回の記事では紹介しようと思うからです!

僕はTwitter上にて週2回程度のペースで開催されるイベント「深夜の2時間DTM」に何度か参加してきました。その過程で、2時間じゃぜんぜん曲作れないよー…と悩まされてきました。それでも参加をやめなかったのは、速く曲を作るメソッドを、実践を通して自分なりに作りたいと思ったからです。

とりあえずその現状を「Rinju史上最速の作曲法」と題してまとめたいと思います。そんなことわかってるという人もいるかもしれませんが、ご容赦ください。

1.環境を整える

最速の作曲は、音符を入力する以前に始まっているということです。

パソコンが快適に動作するようにしておいたり、MIDIキーボードなどの入力を楽にする機材を導入しておくことはもちろんのことですが、その他にできることはまだまだあります。

①トラックの整理

曲がふつうに曲として聞こえるために適切なトラック数の下限は「4」であると僕は考えます。4という数字にするとミスタに怒られそうですね。でも4です。

1.メロディ

2.コード

3.ベース

4.パーカッション

内訳は以上です。ベースはコードに含めればよいのでは? なんて思われる方もいらっしゃるかもしれませんが、メロディ:高音域、コード:中音域、ベース:低音域の配置を意識しているのと、コードトラックにベースが含まれているとごちゃごちゃした譜面になるという理由でベースは分けます。

これを基本にしておけば、急いでたらベースの入力忘れてたなんてことはなくせますし、今入力してる部分のコードは何だっけかと思ったとき、調べるのが容易です。お使いのソフトによるかもしれませんが、例えばStudio OneというDAWにはフォルダトラックを作る機能が付いていますので、上の4分類でフォルダを作ってトラックを分類しておけば、見た目にもきれいになります。

見た目がスッキリしていると、モチベーションの低下を食い止める効果があります。これはがちです。

なおフォルダは上に上げた順番にしましょう。というのもこうしておけば音の高低とおおむね対応するし、パーカッションを巻き込まず移調できるからです。

僕の曲「欠けた「私」、動き出した心」だと、これが、

 

バラバラなトラック

 

こうなります。

スクリーンショット (4)

段違いにわかりやすくないですか?

あとはトップダウン式に、編集したいトラックを表示すればいいわけです。

「サブメロディ」フォルダは、この曲ではボーカル的なメロディと楽器的なメロディを分けたかったので作りました。

②プリセットの作成

曲を作っていれば、自分で音作りをすることがあると思います。

「ふう~、曲ができた。寝よ」

ちょっと待ってください!

このままだと、この曲を作るのに使った音作りの設定、別曲やるときにやり直しになっちゃいますよ!

曲を読み込むのにはたいそう時間がかかります。だから、自分の曲に使った設定は全部プリセットとして保存しておきましょう。

スクリーンショット (5)

こんなふうにです。

「サイン・オブリガート」、「Rinju SuperSAW」~「電話」は僕が作ったプリセットです。この他、曲のエッセンスといえるものは保存しています。作った音色は自分好みであることが多いわけで、となれば後でまた欲しくなります。従って、プリセットとして保存しておけばすぐに曲作りに入れます。

②作曲をする前に考える。作曲中は感じる。

これはまだ実践しきれていませんが、そういうことなのかなと思っています。

作曲中に考えてしまうと、そのときそのときで考えたことが反映されるのでアイデアに富んだ曲になるというメリットがあるものの、大体は曲調が右往左往して、曲作りに時間がかかる結果になります。

そこで、曲を作る前にコンセプトを決めます。

エレキギターのリフをマイナーで不穏に聴かせる、とか、ジャズでウォーキングベースを使って小気味よく聴かせる、とかです。また、この曲は〇〇を表現するものである、というのもよいです。つまり、楽曲の方向性を定めて、あとは即興的に好き勝手に作ってしまえばいいということです。

そうしたら後は、その即興の中でどういう選択をするとよい曲になるのかを経験的に探っていけばよいのです。

 

③自分が気にならないところは作りこまない

これは手抜きではないか、という誹りを受ける可能性がかなりありますが、曲が作れないよりはマシなので主張の中に入れておきます。

例えば僕は、ドラムにフィルインがあるかないかは結構気になるので作りますが、シンセパッドがロングトーンか切ってあるかはあんまり気にならないので最初は白玉で入力します。最後まで白玉で終わるのもありだと思っています。メロディはどう考えたって聴くので、できるだけこだわって作ります。気にしまくります。ベースのフィルインはあまり気にならないので、時間があったらやるくらいです。結果、ベースは同音連打が多いです。

このように、自分にとって重要な箇所を心得て、そこに力を入れるようにすると、ひとまず要件は満たした楽曲を作ることができます。

スクリーンショット (6)

現在制作中の楽曲「Close the Tragedy, Build the Light」のベース(チェロ&コントラバス)。ベースの役割を果たしているのは下2行分の音ですが、完全に同じ形ですね。これは同じ形でも気にならないし、音が違くても印象がそこまで変わらないと判断したためです。上1行の音は②「感じて」作りました(つまるところテキトーです)が、このフレーズかどうかで全然違う印象になると思ったのでここは絶対キープです。

おわりに

作曲は限りなく凝ることができ、そのせいで難しく思ってしまう人は多いだろうと思います。また、せっかくモチベーションが上がっても、作曲に時間がかかりすぎてそれを維持するのが大変ということもあるでしょう。そこで、試しに僕の主張する、①環境を整えること、②作曲前に考えて作曲中は感じること、③自分が気にならないことは作りこまないことをやってみてくださったら、何か変わるのは間違いありません。

最後に、深夜の2時間DTMと、今日扱った曲のリンクを貼っておきます。

深夜の2時間DTM

欠けた「私」、動き出した心

深夜の2時間DTMは、お題に沿った曲を2時間くらいで作るので、自分でコンセプトを考えられなくても②が実行できます。あと、短いながらも曲数が増えるので、作曲の自信にもつながると思います。参加してみるといいと思います。

 

作曲がめんどくさいDTMerさん、作曲してみたいけどめんどくさそうでやる気でない方、今回の方法を、ぜひ実践してみてください!

 

←7日目 9日目→