fc2ブログ

Rの文字コード操作で難儀する

 Rを使っていて、たまに困るのは「文字コード」の問題です。Rのデフォルトは「UTF-8」なのですが、「Shift-JIS」の項目データを読み込むと文字化けして鬱陶しく感じることがあります。また、UTF-8形式のcsvファイルを、一旦Excelに読み込んで編集し、csv保存すると「Shift-JIS」になってしまう問題も鬱陶しいですね。後者の原因や対策方法は良く分かりませんが、Windows(マイ○ソソフト)の世界では許されることなのでしょう・・・。
 ちなみに、ubuntuのLibreOffice Calcでは、csvファイルを読み込む際に「文字エンコーディング」を確認してくれて、保存しても読み込んだ際の文字コードで保存してくれます。UTF-8のcsvファイルならばUTF-8に、Shift-JISのcsvファイルならばShift-JISに保存してくれます。マイ○ソソフトのように、身勝手に文字コードを変更することはありません。

 Rの環境の文字コードは、「Tools」-「Global Options」で変更できますが、基本はデフォルトのUTF-8で使うようにしています。R_EncodingSetting_180916.pngRに限らず、最近は、個人的になるべくShift-JISを用いずに、UTF-8を使うようにしています。ただ、実際問題として、Excelを使うと、ファイルの文字コードがShift-JISに変わってしまうので、その対応を考えてみました。

 まず、UTF-8、Shift-JISのデータファイルを準備しました。それぞれ、utf8_data.csvとshiftJIS_data.csvとします。Rawdata_UTF-8_180916.pngRawdata_ShiftJIS_180916.png 以下のRのコードを実行させて、動作確認しました。
#filename <- 'utf8_data.csv'
filename <- 'shiftJIS_data.csv'

#data <- read.csv(filename, header = TRUE) # Error occurred
data <- read.csv(filename, header = TRUE, fileEncoding="Shift-JIS") # OK
plot(data)
① UTF-8のデータの検証
 1行目ー4行目ー6行目を順番に実行しました。dataは正しく読み込まれ、グラフも描画できました。Rdata_UTF-8_180916.pngUTF8_chart_180916.png
② Shift-JISのデータの検証
 2行目ー4行目ー6行目を順番に実行しようとしましたが、4行目のファイルを読み込む所で以下のエラーが発生し、6行目は当然実行されませんでした。
make.names(col.names, unique = TRUE) でエラー: 
'<8d><80><96>ڂP<28>Shift-JIS)' に不正なマルチバイト文字があります
 Shift-JISの2バイトコードが怒られたようです。ファイルを読み込む際のエンコーディングを指定する必要があり、4行目を5行目に変更して実行しました。今度は、dataも正しく読み込まれ、グラフも描画できました。Rdata_ShiftJIS_180916.pngShiftJIS_chart_180916.png読み込むファイルが、初めからShift-JISのファイルであることが分かれば、問題はないのですが、どちらか分からない場合は一工夫必要です。

 結局、スマートな方法でありませんが、以下のコードに落ち着きました。
#filename <- 'utf8_data.csv'
filename <- 'shiftJIS_data.csv'

data <- try(read.csv(filename, header = TRUE, fileEncoding="utf-8"),silent=TRUE)
if(class(data)=="try-error"){
data <- read.csv(filename, header = TRUE, fileEncoding="Shift-JIS")
}
plot(data)
 Shift-JISのマルチバイト文字を含むデータファイルが来たら、エラーを発生させ、エラー処理部でShift-JIS形式でファイルを開きます。そのために4行目のtry文を利用します。エラーが発生するとclass(data)に"try-error"が出力されることを利用しました。ちなみにsilent=TRUEはエラーメッセージを表示しない命令です。
 もっと良い方法が見つかれば、置き換えようと思いますが、取り急ぎ、この方法で使っていこうと思います。
スポンサーサイト



Pythonで音声波形を作る

 前回前々回にソフトシンセのamsynthのお話をしましたが、amsynthを見つける前に「音声波形」をプログラミングで合成できないかを調べていました。すぐに見つかりました。このサイトの記事を参考にPythonで簡単にコーディングできました。参考にさせていただきありがとうございました。
import numpy as np
from scipy.io import wavfile
import scipy.signal

frequency = 440.0 # 生成するサイン波の周波数
seconds = 1.0 # 生成する音の秒数
rate = 44100 # 出力する wav ファイルのサンプリング周波数

phases = np.cumsum(2.0 * np.pi * frequency / rate * np.ones(int(rate * seconds)))
# 波形を生成
wave = np.sin(phases) # sine wave
# wave = scipy.signal.sawtooth(phases) # saw wave
# wave = scipy.signal.square(phases) # pulse wave

# 16bit の wav ファイルに書き出す
wave = (wave * float(2 ** 15 - 1)).astype(np.int16) # 値域を 16bit にする
wavfile.write("sine.wav", rate, wave)
#wavfile.write("saw.wav", rate, wave)
#wavfile.write("pulse.wav", rate, wave)
 sin波、saw(ノコギリ)波、pulse(矩形)波の三種類を作成し、音声と波形の確認、および周波数解析を「Audacity」で行いました。

1.sin波

sine_180915.png
2.saw波

saw_180915.png
3.pulse波

pulse_180915.png sawの方がpulseよりも周波数成分が多いようですね。より複雑な波形ということでしょう。
また、今度、ソフトシンセのオシレータの勉強する時に復習しようと思います。

amsynthで遊ぶ(2)

 前回の続きです。今回はamsynthをインストールし、PCで録音できる所までお話します。

インストールは以下の手順で行いました。
1.amsynthのサイトからlinux版(Ubuntu環境で利用)をダウンロードします。amsynth_downlodad_180915.png2.ダウンロードファイルを解凍します。インストール方法は、解凍したフォルダのINSTALLというテキストファイルに記載されていました。その手順に従い、インストールします。コマンドの詳細はそのテキストファイル内に書かれてあります。
./configure
make
make check
sudo make install
sudo make installcheck
sudo make clean
エラーが出なければインストール完了です。アプリケーションの中のamsynthのアイコンをクリックするか、ターミナルからamsynthと入力し、リターンで起動します。amsynth_icon_180915.png 次に、Virtual keyboardをインストールしますが、デフォルトでインストールされていませんので、ターミナルから以下のコマンドを実行します。
sudo apt install vkeybd
これで、Virtual keyboardのインストールも完了です。amsynth_keyboard_180915.png
 次に、シンセから出る音をPCで録音する方法ですが、このサイトを参考に、Ubuntuソフトウェアから「PulseAudio音量調整」と「audacity」をインストールしました。pulseaudio_icon180915.png PulseAudio音量調整を起動し、入力装置を選択し、「見る」で「All Input Devices」を選択し、チェックを押して、背景をグレーにすれば完了です。(グレーに変化したのが非常に分かりにくいです・・)record_setting180915.png Audacityは、直感的に操作できるレコーダでした。なかなか良くできていて、多機能です。audacity_180915.png 今後、ソフトシンセで遊ぶ時に一緒に使ってみようと思います。

amsynthで遊ぶ(1)

 大学の一時期にコンピュータミュージック(MIDI)にハマっていた時があり、NEC PC-9801でRolandのLA音源SC-55mkⅡを鳴らして遊んでいました。年齢層が分かってしまいますね・・。
 LA音源はパソコンのC-busに指すタイプで、アナログシンセ並みに音を自由に触れたのが楽しかったです。
 おっさんになっても、学研のアナログシンセで遊んでしまいました。ただ、相変わらず期待する音を出すのは難しいですね。

 いつものことながら、現実逃避で、ふと、「ソフトシンセ」でいいから遊べそうな物はないかとネット検索していたら、amsynthというものを見つけました。早速インストールして味見をしてみました。amsynth_1809012.png
結構遊べそうです。
 個人的には、電子工作でMy-アナログシンセを作りたくて『 達人と作る アナログシンセサイザー自作入門 改訂版2017 』を購入したのですが、シンセの基礎知識がないと理解が非常に難しいと感じ、まだ読破できていません。ソフトシンセで遊びながら、ある程度の基礎知識を身につけようと思います。
今回はここまでで、amsynthのインストール方法の詳細は次回お話します。

magentaで遊ぶ(2)

 かなり前(9ヶ月前)になりますが、AIで自動作曲してくれるmagentaで遊んだことを思い出し、また触ってみたくなりました。その時はMacからのDocker環境で実行していました。今回はUbuntu環境を作成してのトライです。

 Ubuntuからのmagentaのインストールは、ターミナルからこのコマンドを実行するだけで、簡単に行えました。
curl https://raw.githubusercontent.com/tensorflow/magenta/master/magenta/tools/magenta-install.sh > /tmp/magenta-install.sh
bash /tmp/magenta-install.sh
 次に、仮想環境に移動し、magentaの開発環境をインストールします。githubのサイトを参考に進めました。
git clone https://github.com/tensorflow/magenta.git

 開発環境が整備できたら、実際に触ってみます。手順に環境に問題ないことをテストで確認することと書かれてあったので、その通り、bazel testを実行しておきます。
source activate magenta
cd magenta
bazel test //magenta/...
 実行すると以下の通り、表示されました。
(magenta) drbobt@ubuntu:~/magenta$ bazel test //magenta/...
Starting local Bazel server and connecting to it...
INFO: Analysed 279 targets (54 packages loaded).
INFO: Found 224 targets and 55 test targets...
INFO: Elapsed time: 21.017s, Critical Path: 0.84s
INFO: 0 processes.
INFO: Build completed successfully, 1 total action
//magenta/common:beam_search_test (cached) PASSED in 1.8s
//magenta/common:concurrency_test (cached) PASSED in 4.3s
....
....
....
//magenta/pipelines:statistics_test (cached) PASSED in 26.4s
//magenta/scripts:convert_dir_to_note_sequences_test (cached) PASSED in 35.8s

Executed 0 out of 55 tests: 55 tests pass.
There were tests whose specified size is too big. Use the --test_verbose_timeoutINFO: Build completed successfully, 1 total action
(magenta) drbobt@ubuntu:~/magenta$
テストは問題なくパスし、セットアップできていそうですね・・。

 次に、実際に作曲に移ります。Pre-Trainedのサンプルを使って、「ドラム」と「メロディ+コード」の曲を作成しました。Pre-Trainedのサンプルはそれぞれここ(drum_kit_rnn.magchord_pitches_improv.mag)からダウンロードしました。

1.ドラム
 以下のコマンドをターミナルから実行すると、10個のMIDIファイルがoutput_dirに出力されました。magファイルはbundle_fileに記載します。
drums_rnn_generate \
--config=drums_rnn \
--bundle_file=~/magenta/magenta/models/drums_rnn/drum_kit_rnn.mag \
--output_dir=~/magenta/magenta/output \
--num_outputs=10 \
--num_steps=128 \
--primer_drums="[(36, 42), (), (42,)]"
 前回と同じように、不可解な曲(リズム)もありましたが、ドラムパートもAIで作曲できるので感心しました。以下に一例をMuseScore2で表示したドラム譜も一緒に紹介します。
Drum_A_180909.pngDrum_B_180909.pngDrum_C_180909.png
2.メロディ+コード
 以下のコマンドをターミナルから実行しました。
improv_rnn_generate \
--config=chord_pitches_improv \
--bundle_file=~/magenta/magenta/models/improv_rnn/chord_pitches_improv.mag \
--output_dir=~/magenta/magenta/output \
--num_outputs=10 \
--primer_melody="[60]" \
--backing_chords="C Dm7 C G G7 C G7 C" \
--render_chords
 何曲か以下に紹介します。懐かしさを感じる童謡?のようです・・(苦笑)。



 今回はPre-Trainedのサンプルを使いましたが、次の機会には学習サンプルの作成にトライアルしたいと思います。

UbuntuからのRaspberry Piへのリモート接続

 PCをWindowsからUbuntuに切り替えて3ヶ月経ちました。何不自由なく、いやWindowsよりも遥かに快適にストレスないPCライフを送れています。
 さて、今回、久々にファイルサーバで使っているRaspberry PiにUbuntuから接続しようと思い立ちました。どうやってリモート接続するんだったっけ?Macと似たようなコマンドで行けたはずと思いながら、早速試してみました。

 自宅にはWindows10、Mac、Ubuntu(Linux)のPCがありOSも様々です(趣味の世界です)。リモート接続について復習も兼ねて取りまとめました。以下、覚書です・・。

1.Windows10からRaspiへ接続
 Windows10からRaspiへの接続は以前のブログで話していました(3年前のことで、すでに記憶のかなたでした・・)。
 Raspiのターミナルを操作する際は「TeraTerm」、GUIを操作するリモートデスクトップは「VNC Viewer」で操作しました。この辺りは、Windowsの類似のソフトでも対応可能ですね。

2.MacからRaspiへ接続
 Raspiのターミナルを操作する際は、Macのターミナルからsshコマンドで接続できます。RaspiのIPアドレスが192.168.11.14でユーザpiに接続する場合は以下のコマンドを実行します。切断する際は「exit」です。
ssh pi@192.168.11.14
パスワードを入力するとraspiに接続できます。Remote_mac1_180908.png 次にリモートデスクトップですが、メニューの「移動」から「サーバへ接続」を選択します。Remote_mac2_180908.pngサーバへ接続のウィンドウが出たらサーバアドレスに以下のアドレスを記入し、「接続」ボタンを押します。5901はポート番号です。
vnc://192.168.11.14:5901
Remote_mac3_180908.png 次に、パスワードを入力すれば、Remote_mac4_180908.pngリモートデスクトップ接続成功です。Remote_mac5_180908.png
3.UbuntuからRaspiへ接続
 前置きが長くなりました。これが本題です。Raspiのターミナルを操作する際は、Macの時と全く同じでした。Remote_ubuntu1_180908.png 次にリモートデスクトップですが、ターミナルから以下のコマンドを入力します。
xtightvncviewer 192.168.11.14:1
IPアドレスの後の1はRaspi側のディスプレイ番号です。Remote_ubuntu2_180908.pngパスワードを入力すれば、リモートデスクトップ接続成功です。Remote_ubuntu3_180908.png Windows、Mac、Ubuntuそれぞれからのリモート接続ですが、根っこは全く同じですね・・。覚えておこうと思います。

VS CodeでMarkdownとLaTeXで遊ぶ

 Visual Studio Codeの拡張機能でMarkdownやLaTeXを取り扱えると知りましたので、早速試してみました。

以下の2つの拡張機能をインストールしました。
 ① Markdown Preview Enhanced (以下、MPE)ext_func1_180904.png ② Markdown+Mathext_func2_180904.png①はMarkdownのプレビューやhtml、pdf出力に使い、②は数式をLaTeXで出力するのに使いました。

拡張子をmd(Markdown)にしてファイルを作成すると、右上に虫眼鏡マークの「プレビュー」ボタンが出ます。
左側の白い虫眼鏡はMPEのもので、右側の青い虫眼鏡はVS Codeのデフォルトのプレビューボタンです。markdown1_180904.png青色の虫眼鏡を押すと、画面右半分にMarkdownのプレビューが表示されました。markdown2_180904.png白色の虫眼鏡を押すと、白背景のプレビューが表示されました。markdown3_180904.pngこのプレビュー画面上でマウス右クリックすると出力メニューが表示されました。HTMLやPDFに出力できるようです。markdown4_180904.pngHTML出力した結果は以下の通りです。正しく表示できました。markdown5_180904.pngPDF出力は、私の環境ではPhantomJSの選択で、問題なく動作しました。markdown6_180904.png最後に、数式をLaTeXで表現してみましたが、きれいに出力できました。markdown7_180904.png
 今回セットアップした拡張機能は、もともと印刷機能のないVS Codeで、一旦PDFを作成することができることから、何かと重宝しそうです。

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。

月別アーカイブ

メールフォーム

名前:
メール:
件名:
本文: