カボチャスープ

1)カボチャはワタとタネを取って、一口大に小割します。本当は皮も剥くそうなのですが、硬くてとても無理でした。

2)圧力鍋に蒸し器を据付けます。蒸し器の上に水が出ない程度、つまりカボチャが水に浸らない程度の水量にします。

f:id:S_E_Hyphen:20170922093345j:plain

3)鍋を火に掛け加熱します。少し短いかなと思いましたが、圧力鍋のピンが上昇してから2分半程度で十分でした。開けてみてから、もし未だ硬いようなら少し水を注ぎ足して再加熱しても良いそうです。

f:id:S_E_Hyphen:20170922093737j:plain

4)もう軟らかくなっているので皮も簡単に剥くことができます。皮は火が通っているのでおやつ代わりにかじったり、お惣菜に混ぜたりして再利用することができます。あと試してないのですが、カボチャをマルのまま蒸して、軟らかくなってから一口大に小割した方が楽だったのかもしれません。とにかく生のカボチャは硬い。。。

5)先にカボチャだけをマッシュしてから牛乳で伸ばしてもよいのでしょうが、それだと じゃがいもスープ  の時みたいに焦がしてしまいそうでしたので、皮を剥いたカボチャ約100gと、ほぼ同量の牛乳をミキサーで撹拌しました。

f:id:S_E_Hyphen:20170922094424j:plain

カボチャスープの出来上がりです。

SCILABでDTM

SCILABで正弦波を作成し、soxで音声ファイルに変換するシェルスクリプトです。

6行目から20行目は音符ファイルです。音符ファイルは主として周波数と音量(振幅)で与えています。http://tomari.org/main/java/oto.html などを参考にさせて頂きました。音階と周波数を関連付けるユーザーインターフェースを作っておけば、さらに操作性は良くなると思います。

シンセサイザーはAttack、Decay、Sustain、Releaseといった変数で様々な音作りをしているそうです。今回は鍵盤を押しているあいだ音は鳴ったままという設定の効果としました。

test.txtの各行で指定された音階から65行目の正弦関数によって波形を計算し、順次waveというベクトル変数に加算してゆきます。そして最後にtest.rawというファイルにraw形式で書き出します。

raw形式というのは2バイト長整数の羅列からなるバイナリファイルでヘッダも何もありません。これをsoxコマンドでWAV形式の音声データに変換しています。

65行目の正弦関数を、例えば

wave=wave+amp(w)*(2*(fm(w)*t-floor(fm(w)*t))-1).*taper;

といった関数に変更すればsaw toothと呼ばれるノコギリ状の繰り返し波になります。

また

for i=1:N
if (fm(w)*t(i)-floor(fm(w)*t(i))) < 0.5 then
pulse(i)=1.0;
else
pulse(i)=-1.0;
end
end
wave=wave+amp(w)*pulse.*taper;

としてやると矩形波となります。

DTMの世界では正弦波よりノコギリ波や矩形波の方が高音がより多く含まれるため好まれているらしいです。

 


 

#!/bin/bash
fs=22050 #サンプリング周波数
leng=8 #全体は8秒間
count=8 #8拍

#音符ファイルの出力
#周波数(Hz),開始拍,終了拍,音量,Attack,Decay,Sustain,Release
cat << + > test.txt
523.251 0 0.25 1000 0 0 1 0
587.33 0.25 0.5 1000 0 0 1 0
659.255 0.5 2.5 1000 0 0 1 0
587.33 2.5 2.75 1000 0 0 1 0
523.251 2.75 3 1000 0 0 1 0
523.251 4 4.25 1000 0 0 1 0
587.33 4.25 4.5 1000 0 0 1 0
659.255 4.5 4.75 1000 0 0 1 0
587.33 4.75 5 1000 0 0 1 0
523.251 5 5.25 1000 0 0 1 0
587.33 5.25 7.25 1000 0 0 1 0
+

scilab -nw << _SCI_
fs=${fs}; // シェル変数をSCILABに取り込みます
leng=${leng};
rhythm=fs*${leng}/${count};

dt=1/fs;
t=[0:dt:leng]'; // 時刻ベクトルを作成します
N=size(t,'*');
wave=zeros(1:N)'; // 波形ベクトルを初期化します

// 音符ファイルをオープンして読み込みます
fd=mopen('test.txt','r');
[n,fm,st_beat,en_beat,amp,a_beat,d_beat,s_amp,r_beat]=\
mfscanf(-1,fd,'%f %f %f %f %f %f %f %f');
mclose(fd);

nwave=size(fm,'*');
for w=1:nwave
st=st_beat(w)*rhythm;
en=en_beat(w)*rhythm;
a=a_beat(w)*rhythm;
d=d_beat(w)*rhythm;
s=s_amp(w);
r=r_beat(w)*rhythm;

// ベクトルtaperは音色に関係します
// この例ではほとんど効果を発揮していません
taper=zeros(1:N)';
for i=1:N
if i<st then,
taper(i)=0.;
elseif i<st+a then,
taper(i)=(i-st)/a;
elseif i<st+a+d then,
taper(i)=(s-1)/d*(i-st)+(d-a*s+a)/d;
elseif i<en-r then,
taper(i)=s;
elseif i<en then,
taper(i)=s*(i-en)/r;
else
taper(i)=0;
end // if文の終わり
end // i-ループの終わり
wave=wave+amp(w)*sin(2*%pi*fm(w)*t).*taper;
end // w-ループの終わり

// バイナリファイルtest.rawを作成して
// 2バイト長整数を書き出します
fd=mopen('test.raw','wb');
mput(wave,'s',fd);
mclose(fd);
_SCI_

# test.rawをWAV形式音声ファイルに変換します
sox -r ${fs} -c 1 -b 16 -e signed-integer test.raw test.wav

じゃがいもスープ

じゃがいも 1個

牛乳 100cc

塩こしょう 適宜

 

1)じゃがいもは皮をむいて薄切りにし、やわらかくなるまで茹でます。

2)水分と合わせて150gとしてミキサーで撹拌します。

3)十分に潰せたら小鍋に移して牛乳を注ぎ、塩こしょうをして温めます。

 

3)の過程で、一瞬目を離したすきに鍋底が焦げ付いてしまいました。

色取りにパセリを散らしています。

 

f:id:S_E_Hyphen:20170912163052j:plain

新しい「らじる☆らじる」 録音方法の提案

2017年9月5日の記事「らじる☆らじる ~受信方法の変更 」におきましては、大勢の皆様に御閲覧頂き有難うございました。中でも、 rtmpdump を使用した録音、が突然できなくなったことに対して困っていらっしゃる方が多いような印象を強く受けました。

記事中に示したアドレス、例えば http://nhkradioikr1-i.akamaihd.net/hls/live/512098/1-r1/1-r1-01.m3u8 にはテキストで拡張子.tsのファイル名が列挙されています。これら.tsファイルをダウンロード→保存することができれば、このファイル自体が10秒程度の音声ファイルとなっています。

ダウンロードにあたっては、私はwgetを使用するのが便利と感じていますが、HTTP要求を送ることさえできればよいので、firefoxのようなブラウザでも不可能ではありませんでした。大量のアドレスを打ち込まないといけないので長時間にわたっての使用は手が疲れてしまうでしょうが・・・。

ダウンロードされた.tsファイルは、それ自体 WINDOWS MEDIA PLAYER で再生できます。しかし ffmpeg などを持っているならば、それを使って .wav 形式に変換した方が若干音質が良くなるような気がしています。

下に示したシェルスクリプトは、この「ダウンロード→wav形式変換」を ctrl+C などで強制終了するまで自動的に実行することを目的として作成してみました。.m3u8形式のリスト中には十数個のファイル名しか列挙されていませんので、概ね3分程度で音声ファイルが尽きてしまいます。そこで180秒後に同じ手順を再実行する無限ループとしています。パソコンやネットワークが遅い場合、sleep間隔が180秒ではファイルに「抜け」が生じる可能性もありますので、その場合は180を150とか少し小さな値にして下さい。30秒まで小さくしても一応動作することは確認していますが、不必要に小さいとネットワーク負荷が大きくなります。

以上、お悩み解決の参考になれば幸いに思います。

 


 

#!/bin/bash
index=1-r1-01.m3u8
#URL="http://nhkradioikr1-i.akamaihd.net/hls/live/512098/1-r1" #札幌局第1
URL="http://nhkradiohkr1-i.akamaihd.net/hls/live/512075/1-r1" #仙台局第1

while true
do

 wget ${URL}/${index} 2> /dev/null # .m3u8形式ファイルのダウンロード
 declare -a file=( `\
 cat ${index} |\
  sed -e "s/#.*$//g" |\
  sed -e "/^$/d" |\
  fromdos ` )
 rm $index
# これで音声ファイル名 .ts が配列変数 ${file[$i]} 中に収まった

 for (( i=0; i<${#file[*]}; i++ ))
 do
  echo ${URL}/${file[$i]}
  wget ${URL}/${file[$i]} 2>/dev/null # 音声ファイルのダウンロード
  tsfile=`basename ${file[$i]}` # .ts形式ファイル名の取得
  wavfile=`echo $tsfile | sed -e "s/.ts/.wav/g"` # 作成したい.wav形式ファイル名の作成
  ffmpeg -n -i $tsfile $wavfile 2> /dev/null # .ts形式を.wav形式に変換
  rm $tsfile
 done

sleep 180 # 3分間に1度実行
done

 

f:id:S_E_Hyphen:20170907111501j:plain

 

らじる☆らじる ~受信方法の変更

 以前、モニタレスPCでNHKラジオを受信 でrtmpdumpとffmpegを使用した「らじる☆らじる」の聴取を紹介しました。この受信方法が昨日(2017年9月4日)から上手くゆかなくなりました。

先週末、8月31日には問題なく利用していたので週末のメンテナンス時に何かあったのだろうと思います。

仕方がないので色々調べていたら、mplayer単体で受信できる方法もあることがわかりました(例えば  インターネットラジオの受信 - Raspberry Pi Forums など)

mplayer -playlist {リストファイル}

 

リストファイルのURLは、下の写真のようにfirefox右クリックの「要素を調査」機能を利用して、頻繁に要求しているURLを片っ端から試すことで突き止めました。

 

f:id:S_E_Hyphen:20170905153423j:plain

 例えば札幌局第一放送は http://nhkradioikr1-i.akamaihd.net/hls/live/512098/1-r1/1-r1-01.m3u8 というアドレスでした。このリストファイルをダウンロードすると、下記のようなテキストファイルでした。

#EXTM3U
#EXT-X-VERSION:2
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:286328
#EXTINF:10,
1-r1-20170802T080901-01-143/328.ts
#EXTINF:10,
1-r1-20170802T080901-01-143/329.ts
#EXTINF:10,
1-r1-20170802T080901-01-143/330.ts
#EXTINF:10,
1-r1-20170802T080901-01-143/331.ts

(中略)

#EXTINF:10,
1-r1-20170802T080901-01-143/344.ts
#EXTINF:10,
1-r1-20170802T080901-01-143/345.ts

 

この345.tsのような拡張子.tsのファイルが音声データらしいです。ファイル中にはこれらの音声データ名が十数個列挙されていました。リストファイル中の音声データが尽きるとmplayerが終了してしまいます。そこで無限ループによって、その都度mplayerを再起動するようにしてみました。

再起動の際に若干の「音飛び」のような現象が認められますが、今のところ下記のスクリプトで何とか成っているようです。

 


 

#/bin/bash
audio=alsa
URL="http://nhkradioikr1-i.akamaihd.net/hls/live/512098/1-r1/1-r1-01.m3u8" #札幌局第1
#URL="http://nhkradioakr1-i.akamaihd.net/hls/live/511633/1-r1/1-r1-01.m3u8" #首都圏第1
mode="-really-quiet -cache 700 "

while true
do
date +'%T'
mplayer -playlist ${URL} ${mode} -vo null -ao ${audio} 2>/dev/null
done

 

 

 

GMT ver5 で人口動態

人口の自然動態に季節変動みたいなものがあるのかどうかを調べてみようと思いました。

なるべく長期にわたって高頻度で公表されている資料を検索してみたところ、次のURLが見つかりました。

 長野県企画振興部(http://www3.pref.nagano.lg.jp/tokei/1_jinkou/jinkou.htm)

 大阪市都市計画局( http://www.city.osaka.lg.jp/toshikeikaku/page/0000014987.html)

長野県は2010年10月から、大阪市は2015年11月から各月1日の人口を資料にしてくれています。長野県の人口総数は約210万人、大阪市は約270万人と概ね同規模の母数です。

 

これらの調査結果資料をダウンロードしてきて、各月の死亡数から下記のようなテーブルを作成してみました。

mysql population << _SQL_
 create table dead(
 area varchar(10), // 大阪か長野か
 year int, // 調査年
 month int, // 調査月
 death int // 各月死亡数

);
_SQL_

 ただ、少しうっかりしていました。例えば2017年7月の調査結果資料は2017年7月1日の人口を示しているのですから、その資料中の死亡数は2017年6月のものです。これを2017年7月に登録してしまったため、描画にあたっては少し複雑なことをせざるを得ませんでした。

 

f:id:S_E_Hyphen:20170831103247j:plain

細線は実データで、これを月別に平均したものが太線となっています。夏に比べて冬に亡くなられる方が明瞭に多いようです。最大値は1月(冬)、最小値は7月(夏)に出現していることが多いのですが、最大値は最小値に比べて実に1.4~1.5倍となります。

ただ大阪市の8月は前後の月と比較して突出して大きな値となっています。「これは都市型熱中症の影響か!?」とも思いましたが、きっと標本数の不足が原因でしょうね。

 

#/bin/bash

psfile=dead.ps
gmt gmtset FORMAT_DATE_MAP mm
gmt gmtset FONT_TITLE 16p,GothicBBB-Medium-UniJIS-UTF8-H
gmt gmtset FONT_LABEL 12p,GothicBBB-Medium-UniJIS-UTF8-H
gmt gmtset FONT_ANNOT_PRIMARY 10p,GothicBBB-Medium-UniJIS-UTF8-H

# 軸の設定です
# 月毎の違いを示したいので年は2000年に統一します
gmt psbasemap -JX25cT/12c \
-R2000-1-1T0:0/2001-1-1T0:0/1500/3500 \
-BWESn+t"月別死者数" \
-Bxa1og1o+l"月" \
-Bya500f100g500+l"人" \
-K > $psfile

for area in 長野 大阪
do
for year in 2010 2011 2012 2013 2014 2015 2016 2017
do
# 「concat(year,"-",month,"-1") - interval 16 day」は
# 調査結果資料年月日の半月前の年月日を示します
mysql population -N << _SQL_ > temp2.txt
select concat(year,"-",month,"-1") - interval 16 day,"T00:00 ",death from dead
where year(concat(year,"-",month,"-1") - interval 16 day)=$year
and area="$area"
order by month(concat(year,"-",month,"-1") - interval 16 day);
_SQL_
# GMT用のデータファイルを作成します
# 縦軸と横軸の区切りはスペースとします
# タブをsedで消去したのち、仮に2000年とします
cat temp2.txt |\
sed -e "s/\t//g" |\
sed -e "s/$year/2000/g" > temp.txt
rm temp2.txt

pen=0p
case $area in
大阪) col=0/0/255;;
長野) col=255/0/0;;
*) col=128/128/128;;
esac
psxy -J -R temp.txt -W${pen},${col},. -O -K >> $psfile
done
# 大阪と長野の平均値を太線で描画します
mysql population -N << _SQL_ |\
sed -e "s/\t//g" |\
sed -e "s/$year/2000/g" > temp.txt
select "2000-",month(concat(year,"-",month,"-1") - interval 16 day),"-15T00:00 ",avg(death) from dead
where area="$area"
group by month(concat(year,"-",month,"-1") - interval 16 day)
order by month(concat(year,"-",month,"-1") - interval 16 day);
_SQL_
pen=2.0p
psxy -J -R temp.txt -W${pen},${col} -O -K >> $psfile
done
# pslegendは余り使ったことがなかったので試行錯誤で凡例をつくりました。
cat << + |\

gmt pslegend -R -J -Dx20c/11c+w3c/1.2c+jTL -F+p+gwhite -O >> $psfile
N 1
S 0.5c s 0.4c 0/0/255 0.0p 1.5c 大阪
G 0.1c
S 0.5c s 0.4c 255/0/0 0.0p 1.5c 長野
+
convert -density 200 -rotate 90 $psfile dead.jpg
rm temp.txt

 

atコマンドを使ってみた

UNIXに古くから存在するコマンドであるatを初めて使ってみました。

 

#【失敗1】

cat << + | at "2017-8-27 10:00"
SUB="出力したい文字"
echo ${SUB}
+

syntax error. Last token seen: 10:00
Garbled time

10時になったら標準出力に「出力したい文字」と表示されるつもりでしたが、予想外のエラーメッセージです。調べてみたら日付はMMDDYY(月日年)形式で指定するとのことでした。

 

#【失敗2】

cat << + | at "10:01 082717"
SUB="出力したい文字"
echo ${SUB}
+

warning: commands will be executed using /bin/sh
job 8 at Sun Aug 27 10:01:00 2017

 

待ち行列には登録されたみたいなので、なんか期待できそうです。

ところが10時01分になってもウンともスンともでした。標準出力には出してくれないのかな?

 

#【失敗3】

cat << + | at "10:02 082717"
SUB="出力したい文字"
echo ${SUB} > ./new.txt
+

 ならばとリダイレクションで外部ファイルに出力することにしました。10時02分になるとnew.txtというファイルは作成されましたが、中身は改行記号が1つ入っただけの空のファイルでした。このあたりからパニックになってます。

 

 

ようやく原因を突き止めることができたのは、下記のコマンドを打ち込んだ後でした。

#【鍵】

$ at -c 10 

-cオプションは、既に投入した10番ジョブの詳細を表示してくれる コマンドだそうです。その結果、

 

#!/bin/sh

# atrun uid=xxxx gid=xxxx
# mail user x
umask 2
(中略)

XAUTHORITY=/home/user/.Xauthority; export XAUTHORITY
cd /home/user/\�\�\�\�\�\�\�\�\�\�\�\�\�\�\�\�\�\� || {
echo 'Execution directory inaccessible' >&2
exit 1
}
SUB="出力したい文字"
echo "" > ./new.txt
 

うん? echo "" > ./new.txt  そりゃあ駄目でしょう。

 

#【成功】

cat << + | at "11:00 082717"
SUB="出力したい文字"
echo \${SUB} > ./new.txt
+

これでやっと11時00分に「出力したい文字」が書き込まれたnew.txtが、作成されることになりました。

crontabコマンドもそうでしたが、atコマンドも良く知られていて、とても重宝する割には意外と使い方が難しいです。