2018年4月30日月曜日

それぞれの用語

私は、技術者であると自分では思っている。
とはいえ、時間があれば、海にもぐったり、植物を育てたり、ウクレレを弾いたり、絵を書いたり、料理を作ったり、うまいものを食べに行ったり、旅行に行ったり…。

物を作るばかりではなく、そのとき興味のあることをやる。
まだまだやってない事は多いし、これからも色々な事をやるだろう。誰もがそうであるように。

先日、世田谷ベースを見ている時に、所さんが普通の電子ガジェットとPCで音楽をレコーディング&ミキシングしているのを見て、自分でもやってみたくなった。
ということで、Ardourをインストールして使い始めたが、使い方がさっぱりわからない。
そもそも私は楽譜が読めない。
ウクレレを弾いてはいるが、以前Cebuへ行った時に買ってきた1500円程度の、楽器というよりも置物に近いウクレレ(弦は張り直しているけど)なので、真剣に勉強しようという気は無かった。数年前、NHKのウクレレ講座があったときに、本を買ってきたのだが、その本は「タブ譜」という普通の楽譜ではないものが書かれており、さらに買ったはいいが、それすらろくに読んでいない。
コードは、ウクレレファンのページを見て練習し、C, Am, F, G7 の4つは弾けるようになったけど、それぞれの意味もわからない。 ただただ、TVやラジオで聞いた音楽を真似して弾いているだけだ。

LubuntuでArdourを使おうとした時、最初につまづくのは、JACKだ。
音環境でもLubuntuは最小構成なので、Alsaのサウンドサーバ機能が使われていた。去年FireFoxがPulseAudioを要求するようになったあたりから、Ubuntu同様、LubuntuでもPulseAudioが主流になった。
自分でAlsa用に作っていたプログラムが動かなくなるのではと心配したが、そのままPulseAudio環境で鳴った。なんかエミュレーションされている?
この辺の関係性がややこしい。
Ardourの新しいやつなら、PulseAudioでも動きそうな感じ(これもややこしい)だが、変なことをしてハマるくらいなら、JACKを使ったほうがいい。
ネットで色々調べて、JACKをインストールしたが、数週間前の話なので、かなり忘れてしまった。
自分をaudioグループに追加するということが重要だったと、うっすら記憶している。

JACKもArdourも動くが、基本的に音楽の知識が全く無いに等しいので、使い方がわからない。
Ardourのマニアルをつまみ読みしてみたが、音楽やDAW/DTMの用語で説明されているので、読んでいてさっぱり意味がわからない。
たとえは、Pitch, Velocity, Track、Bus それぞれ技術用語でも普通に見かける単語なので、言葉として意味はわかるが、DAW用語では何を表しているのかがわからない。
Pitchは、ICの足の間隔ではないだろう。それとも速さか?
Velocityは技術用語のみならず物理でも「速度」という意味だ。速さを表すとしたら、Pitchとの関係は?
Trackもハードディスクのトラックとは関係ないだろう。いくらHDDレコーディングができるとしても。
Busって、Bassの間違い?なんで音楽にバスが関係ある?
こんな感じで、単語を知っていても、意味がさっぱりわからない。
そんなものが、まだまだいくつも、いくつもある。

Ardourのマニアルをしっかりと読んだり、ネットで調べたりしながら、少しずつ意味がわかってきた。
上記の例について調べた結果を以下に示す。
用語 調べた結果
Pitch 音程を表す。周波数の高さをイメージしているようだ。とはいえ、半音のとこをsemitoneのように、toneという単語も使うようだ。
Velocity 音の強さを表す。ピアノの鍵盤やウクレレの弦を弾く速度をイメージしているようだ。速く弾けば、強い音が出る。
Trackデータ記録・再生の単位。テープのトラックのイメージだ。
Bus トラックを束ねたもの。たとえば、ドラムセットは、キックドラムやスネアドラムその他の楽器がある。録音時にキックに1トラック、スネアに1トラック、オーバヘッド(ドラムセットの上方に設置されるマイクで収集)に1トラックのように記録されたものを、Busでまとめ、1つのものとして扱うらしい。そもそもドラムがそのように録音されるものとは知らなかったので、そういう発想にはならなかった。

わかっていると思っていても、意味が違っている用語もあるかもしれない。Ardourのマニアルは全部、慎重に時間をかけて読んでおこう。
いつかは、楽譜が読めるようになるかな?

2018年4月22日日曜日

Ready Player One を見てきた。

当初は見るつもりが無かったのだが、NHKの朝のニュースで紹介されていたので、見てみた。
最初の戦闘シーンと自動車のレースシーンがド派手で、途中で「もういい!」って気分になるくらいだった(3Dで見たせいかもしれない)。
こういう派手な映画は、映画館で見るに限る。

2045年の現実世界が、グーニーズの出だしを思い出させるような曇り空。薄暗く肌寒い感じに表現されていた。
現実世界が面白くなく、皆がVRの世界に楽しみを見出している。

Back to the future のデロリアンが出てきたり、80年台のサブカルチャーが映画全体に散りばめられている。
いろいろなモノが出てくるのだが、あまりにも多すぎて、よくわからない。
ガンダムの動きが素晴らしかった。
考えてみると、あの頃の作品の焼き直しがなんと多いことか。
ストーリーは単純明快で、大企業の悪者オヤジの悪企みを、純粋な若者が叩き壊すというものだ。
伝統的なお約束のストーリ展開で見ていて気分がいい。

最近はTVの視聴率が伸びないそうだ。情報源がTVではなく、ネットやSNSが中心になりつつあり、そうなると自分の好みに合う情報ばかり集めるようになる。
その結果、メイン・カルチャーと言えるものがなくなり、何もかもが言うならばサブカルチャーだ。
(NHKばかり見ている私もまた少数派の1つだろう)
TV全盛の、皆が同じ物を楽しんでいた時代(だからスーパースターも誕生した)から、新しい時代に移ったようにも思える。しかし、TVやラジオなどのマスメディアが存在しない時代もまた、それぞれの社会毎に話題の中心がバラバラだっただろうと思うので、ある意味では昔に戻ったとも言える。

しかし、どんどんバラバラになることもないだろう。過去バラバラだった世界がどんどん統合されていったのだから、統合もまた自然の流れだ。
今は、貿易摩擦が貿易戦争に発展しそうな時代だが、どこかで共通の価値観が生まれ、また統合へ向かう時代が来るだろう。
その後にまた分裂、そして統合、分裂、統合…。分裂と統合は繰り返えされるものかもしれない。

2018年4月20日金曜日

ボールペンが詰まったら

SARASAボールペンの書き味が好きで、もう20年ぐらいは愛用しているだろうか。

先日、仕事部屋を整理していたら、かなり古いSARASAの赤が出てきた。
クリップ形式なのでそんなに古くはないだろうが、それでも5年ぐらい前だと思う。
まだ半分以上インクが残っているのに、インクが出にくくなっていた。

新品であればペンを強く振ると、インクがドバっと出てくることもある。
しかし、長年放置されていただけあって、その程度では何もならない。

後ろから圧力をかけてインクを出やすくすれば、良いかもしれないと考えた。
近所の"Can Do"(100円均一)で買った注射器の針を外すと、ちょうとSARASAの軸にぴったりだった。
それを使って、後ろから圧力をかけた。
ボールペンは、圧力をかけるだけではインクは出てこない。先端のボールを軽く押し込むことで、インクが出てくる仕組みになっている。
そのため、注射器で圧力をかけながら、線をひくように、先端を紙に軽くこすりつけた。
狙い通り、インクがドバドバ出てきた。

これでまた書きやすくなった。

以下は、その後もう一度やり直した時に撮影した動画。

2018年4月18日水曜日

そろそろ新しいズボンを探さないと…

この記事を書いた時に買った3枚のズボンがどれもやばくなってきた。

今年は真剣に探さないと。あーぁ。

2018年4月10日火曜日

ffmpeg の -crf

ffmpegを最初に使ったのは、Ubuntu1004の頃だったと思う。
デジカメの動画を再圧縮したり、様々な連続的画像ファイル(気象衛星ひまわりの写真、海保の黒潮、某社のGPSシムレータの画面等)から動画を作ったりしていた。

時間があるときにmanページやドキュメントを読んだりしながら使って覚えるのだが、忙しくなると半年〜一年全く使わない。
その間にせっかく覚えたことも忘れてしまう。

とはいえ、ダイビングでの撮影などで、デジカメの動画の再圧縮を頻繁に行う必要があった。
最初のうちは、忘れては勉強し直しを繰り返していたが、数年前にこのshell script(最初はもっと単純なものだった)を書いてからは、だいぶ楽になった。

昨日、「飛び出す道具箱 番外編 」の動画を作成するときに、静止画から動画を作るためのscriptも書いていたような気がして、いろいろ探した。
今年の頭に再インストールした母艦の中には当然存在しない。
NotePCの中には無かった。
VAIO-C1は、必要以上に起動したくないので確認していない。

NASの中を探していると、shell scriptというよりもメモ書きに近いものが見つかった。
海保の黒潮の図を動画にするために書いたメモだったが、その中で謎のオプション"-crf"を使っていた。
「たしか品質に関連するオプションだったような気がする」と感じるのだが、細かいことがわからない。
manページ内には無いし、ネットで検索してもなかなか出てこない。

落ち着いて思い出す努力をすると、今日の朝、H.264専用だったような気がしてきた。
朝の通勤時の電車の中で、"ffmpeg H.264 crf"で検索してみたら、ビンゴ。FFmpeg, H.264 エンコーディングガイドを見つけた。

過去にこのオプションを調べて、使って、覚えていたはずなのに、忘れていた。
そして、今年の2月、様々なサイズの古い動画を再圧縮するときに、わざわざ動画サイズからビットレートを自動計算するようにスクリプトを改造していた。

相変わらず馬鹿だな。
忘れないようにブログに書いておくが、テキストファイルに書いておいても忘れてしまうんだから…
道具箱のアニメの画像データを作ったプログラムのソースコードと一緒に保存しておこう。そこなら忘れにくいだろう。

2018年4月9日月曜日

飛び出す道具箱 番外編

飛び出す道具箱の番外編。
pseudo_arc_to()(自家製cairo_arc_to())を使って作ったアニメーションを、H.264の動画にしてみた。
ただそれだけ。

一応、フルスペックハイビジョン動画。
全くの無駄だ。相変わらず、馬鹿なことをしている。

2018年4月8日日曜日

cairo_arc_to() #3

cairo_arc_to()#1 cairo_arc_to()#2
先週記事にした自家製cairo_arc_to()を使って、飛び出す道具箱のアニメーションを作ってみた。
多少手抜きをして、直線と円弧のみで構成した。
データを作るのが大変だったが、それさえできればcairoで簡単に描画できる。
アニメーションgifで動画にしたが、ffmpegで動画にしたほうが良かったかな。

別所沼公園の拡張工事定点観測

今年(2018年)1月末頃から、別所沼の拡張工事が行われていた。
ほぼ毎週行くので、行くたびに写真を撮った。
工事現場に設置されていた完成イメージ図で撮影位置を示すと、以下の赤い矢印のようになる。

完成イメージ図の上側(北側)からの撮影

2018-02-04

2018-02-09

2018-02-10

2018-02-12

2018-02-16

2018-02-25

2018-03-04

2018-03-10

2018-03-23

2018-04-01
完成イメージ図の下側(南側)からの撮影

2018-02-03

2018-02-09

2018-02-10

2018-02-12

2018-02-16

2018-02-25

2018-03-04

2018-03-10

2018-03-23

2018-04-01

2018年4月7日土曜日

マリンダイビングフェアへ行ってきた

去年うっかり忘れて行かなかった、マリンダイビングフェアへ行ってきた。

普段、都心へ出ることはないので、人の多さにうんざり。午後に行ったのが失敗か。
途中で嫌になって、あまり見ないでとっとと出てきた。

池袋へ行ったついでに、mic21へ行った(ここも激混みだった)。

去年の末に、GULLマンティスフィンのバックルの爪の1本が折れていたし、前回のダイビングではダイコン(Bism Dive Beens Duo)のベルト金具が壊れていたので、それらを買いに行った。
行ったついでに、同ダイコンのバッテリ交換キットを買ってきた。
前回バッテリ切れになってからそろそろ2年。今年中にバッテリ切れになるだろう。

ウチを出てから池袋駅まで30分。遠くはないのだが、人の多さで足が向かない。バッテリが切れてからもう一度来るくらいなら、買っておいてもいいだろう。
次は、来年かな。

Jumanji: Welcome to The Jungle を見てきた

約20年前の、ロビン・ウイリアムズ主演映画"JUMANJI"の続編?リメイク?別バージョン?の"Jumanji: Welcometo The Jungle"を見てきた。

20年前はボードゲームだった。今回はファミコンゲームになる。
適度なバカバカしさと、キレのあるアクションシーンで、気分爽快。
ギクシャクしていた関係も、お互いの特性を活かして問題を解決していくうちに、良い関係になっていく。
終わった後でいい気分になった。

映画館に行った時間帯にやっていたいのは吹き替え版だったので、吹き替え版を見た。
普段は字幕版を見ることが多いのだが、この映画はダジャレも多く、言葉のジェネレーションギャップがストーリに織り込まれており、吹き替え版のほうがむしろ良かったと思う。
P.S. ハン・ソロを主人公とした映画が作られるらしい。
広告の Millennium Falcon で写真を撮った。

2018年4月1日日曜日

cairo_arc_to() #2

cairo_arc_to() #1

一応動作確認をした、自家製版コードを以下に示す。
cairo_arc_to()はすでに存在しているようなので、自分で作ったものはpseudo_arc_to()とした。
実際に、円弧ではなくベジエ曲線なので、擬似円弧だ。
#include <gtk/gtk.h>
#include <glib.h>
#include <math.h>

/*----------------------------------------------*/
/*   Get difference of angle between angles.    */
/* Arguments:                                   */
/*    st:  start angle. -π 〜 +π              */
/*    ed:  end angle.   -π 〜 +π              */
/*    dir: direction.                           */
/*          0: Normal direction.                */
/*          1: Reverse direction.               */
/* Return value:                                */
/*   Difference of angle.                       */
/*   if dir is zero, result will be positive    */
/*   value, otherwise, result will be negative. */
/*----------------------------------------------*/
static double get_angle_difference( double st, double ed, int dir )
{
    double angle = ed -st;

    if( dir == 0 ) {
        if( angle < 0.0 ) {
            angle += (M_PI *2.0);
        }
    }
    else {
        if( 0.0 < angle ) {
            angle -= (M_PI *2.0);
        }
    }
    return( angle );
}

/*--------------------------------------------------------------*/
/*      pseudo arc to                                           */
/* Arguments:                                                   */
/*    cr:  a cairo context                                      */
/*    edX: the X coordinate of the end of the new line          */
/*    edY: the Y coordinate of the end of the new line          */
/*    ox:  X position of the center of the arc                  */
/*    oy:  Y position of the center of the arc                  */
/*    dir: direction of drawing arc                             */
/*           0: Normal direction                                */
/*           1: Reverse direction                               */
/*                                                              */
/*--------------------------------------------------------------*/
void pseudo_arc_to( cairo_t *cr, 
        double edX, double edY, // End point
        double oX,  double oY,  // Origin of arc
        int    dirFlag )        // Direction of rotation
                                //  0: Normal direction
                                //  1: Counter direction
{
    double stX, stY;    // Start point.
    double st,  ed;     // Angle of start point and end point.
    double r;           // Radius of arc
    double angle;       // Angle from st to ed. 

    int    n, i;
    double l;           // Distance to Ctrl point for each divided arc.
    double prvX, prvY;

    // Prepare each value.
    cairo_get_current_point( cr, &stX, &stY );  // Get start point.
    st    = atan2( (stY -oY), (stX -oX) );      // Angle of start point.
    ed    = atan2( (edY -oY), (edX -oX) );      // Angle of end point.
    r     = sqrt( ((edX -oX) *(edX -oX)) +((edY -oY) *(edY -oY)) ); // Radius of arc
    angle = get_angle_difference( st, ed, dirFlag );    // Angle from st to ed.

    // Draw divided arc.
    n    = ceil( fabs(angle / (M_PI*0.5)) );    // Number of division.
    l    = fabs( r *4.0 *tan((angle/n)/4.0) /3.0 );   // Distance to Ctrl point.
    prvX = stX;
    prvY = stY;
    for( i=1; i<=n; i++ ) {
        double c1X, c1Y;                // Ctrl1 point.
        double c2X, c2Y;                // Ctrl2 point.
        double a = st +(angle *i /n);
        double nowX = r *cos(a) +oX;
        double nowY = r *sin(a) +oY;

        if( i == n ) {                  // Last divided arc.
            // Only last part of arcs will be exactly drawn
            // with given end point.
            nowX = edX;
            nowY = edY;
        }

        if( dirFlag == 0 ) {
            c1X = prvX + (l * (-(prvY -oY)/r)); // cos(θ+π/2) = -sin(θ)
            c1Y = prvY + (l * ( (prvX -oX)/r)); // sin(θ+π/2) =  cos(θ)
            c2X = nowX + (l * ( (nowY -oY)/r)); // cos(θ-π/2) =  sin(θ)
            c2Y = nowY + (l * (-(nowX -oX)/r)); // sin(θ-π/2) = -cos(θ)
        }
        else {
            c1X = prvX + (l * ( (prvY -oY)/r)); // cos(θ-π/2) =  sin(θ)
            c1Y = prvY + (l * (-(prvX -oX)/r)); // sin(θ-π/2) = -cos(θ)
            c2X = nowX + (l * (-(nowY -oY)/r)); // cos(θ+π/2) = -sin(θ)
            c2Y = nowY + (l * ( (nowX -oX)/r)); // sin(θ+π/2) =  cos(θ)
        }

        cairo_curve_to( cr, c1X, c1Y, c2X, c2Y, nowX, nowY );
        prvX = nowX;
        prvY = nowY;
    }

    // 半径は、原点と終点の距離から計算される。
    // 回転方向は解りにくい。
    // 数学的には左回り(CCW:時計と逆)が順方向であるが、コンピュータの座標系は
    // Y軸が反転しているため、右回り(CW:時計方向)が順方向になる。
    // 回転方向は、表示装置の座標系のとり方に依存するもので、計算や処理に
    // 依存するものではない。
}
コメントにも書いてあるが、回転方向には注意が必要だ。
多くの処理系、表示デバイスでは、下方向がY軸の増加になり、時計回りが順方向になる。
この向きは、cairo_arc()の描画方向に一致している。

実装はしたものの、迷っている部分がある。
始点と終点が一致している場合、全く書かないのが良いのか?全周を描くのが良いのか?
これについては、描画方向も考慮するのが良いかもしれない。
現在は、一番シンプルな形で実装している。