colcat

コンソール上に色のついた文字を表示させるシェルスクリプト colcat を作成してみました

 


 

#!/bin/bash
color=`getparstr $# "$*" "color"`
if [ -z $color ]
then
color=red
fi
#
# 30 => 黒 : Black
# 31 => 赤 : Red
# 32 => 緑 : Green
# 33 => 黄色 : Yellow
# 34 => 青 : Blue
# 35 => マゼンダ : Magenta
# 36 => シアン : Cyan
# 37 => 白 : White
#
case $color in
black) icol=30;;
red) icol=31;;
green) icol=32;;
yellow) icol=33;;
blue) icol=34;;
mazenta) icol=35;;
cyan) icol=36;;
white) icol=37;;
*) icol=39;;
esac

############ この下が肝 ############
printf "\033[0;"${icol}"m"
cat
printf "\033[0;39m"

 


 

colcat color=blue < hoge

 

のようにすると標準入力(この場合ファイルhoge)が青色文字で表示されるようになります。

例えば下のようなシェルスクリプトではエラーだけを赤色文字で表示させることができるようになります。

 

f:id:S_E_Hyphen:20171009110457p:plain

  


 

tmp=`mktemp ./XXX` # 一時ファイルの作成
for ( ( i=0; i<10; i++ ) )
do
exec 2> $tmp #標準出力は画面へ標準エラーはファイルへ

ls -la file${i} # コマンドの実行
# 正常終了すれば標準出力へ
# 異常が有れば一時ファイルに出力される

# 一時ファイルの内容を赤色文字で表示する
cat $tmp | colcat color=red
done
rm $tmp # 一時ファイルの消去

 

嚥下障害 ~柿~

柿がおいしい季節になりました。

f:id:S_E_Hyphen:20171007083047j:plain

柿 半個(約70g)と水を合わせて100gとしました。これにとろみ剤大さじ1とビタミンC 1包を加えてミキサーで撹拌します。

ちなみにビタミンCを加えずに一晩寝かせると、新鮮な柿とは少し異なる味となります。なんだか懐かしい味だなと考えていたら「干し柿」の味でした。干し柿が好みの方はビタミンC無しでも大丈夫かも知れません。

 

ところで少し話は変わりますが、柿 半個に同量の牛乳を加えて撹拌した柿牛乳も作ってみました。これは普通に美味しかったです。

 

ミキサーでマヨネーズ =失敗=

f:id:S_E_Hyphen:20171003151957j:plain

材料A

 梅酢 7g

 卵黄 1つ分・・・充分室温に馴染んだもの

 コショウ 少々

材料B

 サラダ油 40cc

 オリーブ油 10cc

 

材料Aをミキサーで撹拌し、その後少しづつ材料Bを加えながら撹拌を続けます。

乳化は成功し、見た目は立派なマヨネーズになったのですが、味が…。

まずオリーブ油の風味が強すぎます。好みもあると思いますがマヨネーズにオリーブ油は合わないような気がします。

また梅酢そのものがよくないのか、量が不足なのかサッパリ感も得られません。

また全体としての量も…。考えてみれば50cc分の油なんですよね。少し胸焼けする結果となってしまいました。

 

 

嚥下障害~ブルーベリー

f:id:S_E_Hyphen:20170929083607j:plain

 

ブルーベリー 40g

水 60g

砂糖 小さじ1/2

とろみ剤 大さじ1

 

ミキサーで撹拌します。結構酸っぱいので、お好みで砂糖は増やした方が良いかも知れません。

ビタミンCを添加した分も作成してみましたが、一晩置いても殆ど違いがありませんでした。ビタミンCを添加していないのに一晩以上保つというのは、さすがブルーベリーといったところです。

 

カボチャスープ

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