axjack's blog

axjack is said to be an abbreviation for An eXistent JApanese Cool Klutz.

損益分岐点(Break Even Point)

f:id:axjack:20180214231119j:plain 図1:損益分岐点(Break Even Point)

BEPを求めるとは

BEPのy座標の値(=赤色矢印の長さ)を求めることに等しい。そのため、図より、直線:L1と直線:L2の交点を求めれば良い。

用語

  • BEP : Break Even Point → 損益分岐点
  • Revenue : 売上高
  • Total Cost : 総費用
  • Variable Cost : 変動費
  • Fixed Cost : 固定費

xとy

yはcostやらprofit/lossやら, xはNumber of units soldやら・・・とググると書いてあったりするが、ひとまず横に置いておくことにする。パラメータ:xの一次関数で表されると漠然と考えておけばOK(なはず。)

L1およびL2

L1

Revenueは原点を通る直線である。RevenueをRと表記すれば、

y = Rx

L2

Variable Cost = tanθとはすなわち、Total Costの傾きがVariable Costであることを指す。

また、Total Cost = Variable Cost(x) + Fixed Costとなる。

まとめると、Variable CostをV、Fixed CostをFとそれぞれ表記すれば、

y = Vx + F

L1とL2の交点

交点を求めるには連立方程式を解けば良いので、

{\displaystyle 
\begin{eqnarray}
  \left\{
    \begin{array}{l}
      y = Rx \\
      y = Vx + F
    \end{array}
  \right.
\end{eqnarray}
}

より、 x = \frac{F}{R-V}

また、  y = R(\frac{F}{R-V}) = \frac{RF}{R-V} = \frac{F}{1-\frac{V}{R}}

となる。

確認

Wikipedia損益分岐点によると、その公式は

損益分岐点売上高 = 固定費 ÷{1-(変動費÷売上高)}

であるので、今回の導出は正しい。

余談

資格試験のため損益分岐点の式を覚えようとしたが漢字が数式に入って気持ち悪かったので、英語に直して導出して覚える作戦を採ってみました。

MacBook AirをApple 表参道にて購入

買いました。前回は2010年08月08日にMacBookを買ったそうです。実に7年ぶりのパソコン購入ですね。 MacBookさんは一応使えないこともないのですが、電源がそろそろヤバそうなので寿命かな、と。 次買うのは2024年ですかねぇ。

型番号など

  • MB AIR 13.3/1.8GHZ/8GB/128GB
  • 部品番号: MQD32J/A

numpyとscipyのインストールログ

インストールログって作っても消しちゃうことが多いので、ブログに書いておけば良いかなと思い書いてみるテスト。pandasとかmatplotlibはよく分からんのでとりあえずはnumpyとscipyからスタートしてみます。

axjack:~ $ pip3 install numpy
Collecting numpy
  Downloading numpy-1.14.0-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (4.7MB)
    100% |████████████████████████████████| 4.7MB 149kB/s 
Installing collected packages: numpy
Successfully installed numpy-1.14.0
axjack:~ $ 
axjack:~ $ pip3 install scipy
Collecting scipy
  Downloading scipy-1.0.0-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (16.7MB)
    100% |████████████████████████████████| 16.7MB 43kB/s 
Requirement already satisfied: numpy>=1.8.2 in /usr/local/lib/python3.6/site-packages (from scipy)
Installing collected packages: scipy
Successfully installed scipy-1.0.0
axjack:~ $ 

最近pythonを始めました

新年恭しく賀し奉り候。年末ぐらいからpythonをインストールし、毎日ちょっとずつpythonに触れています。

pythonに触れるきっかけは、バンドのホームページのバックアップ機能を作るためです。私がバックアップ機能を作るわけではないのだけれど、自分で作れないのに他人に指示を出すのは少々気が引けると思う性格ゆえ。

と言っても、所定のURLにアクセスしてファイル落として、ファイルIOと文字列処理をするだけなので、あまりpythonらしさが発揮できていないような…。

余力があったら機械学習や音楽情報処理やSuperColliderと連携させたりしてみたいですね。

今年も何卒よろしくお願い申し上げます。

Xmas Liveを終えて

去る12/10(日)、Xmas Live@赤坂B♭にて演奏してきました。メンバー含めお客さまや色んな方から「ドラム凄かった」「ドラムのビートやべぇ」などお褒めの言葉を頂き、とても嬉しく存じ上げます。ありがとうございます。 ただ、全身全霊で叩いたせいもあり、そして歳を重ねた事もあり、ライブの翌日から右腕左腕が嬉しい悲鳴という名の筋肉痛に襲われて居る次第です。私は今年で齢三十を迎えました。

扨、演奏中の記憶は全く以って吹き飛んでおりますのでここでは先日右手中指を痛めてからのドラムプレイングの変化などを書き残し今後に生かそうと思います。

右手中指を痛めて

最悪の場合もうドラムは叩けないのかなぁ、としょんぼりしてました。幼い頃からピアノを弾いていた事もあり、指の怪我は絶対に避けなければならないと思っていたので、指の痛み以上に精神的なショックが大きかったです。

突き指では無く腱鞘炎

怪我をして一ヶ月。痛みが完全には取れなかったので病院へ。すると医者曰く「腱鞘炎かもね。」と。腱鞘炎は一番聞きたくない怪我の名前です。。手術か注射か"動かさないようにする"のどれかで回復を待つしかなく、聞くたびにうんざりしてしまう。

それでもドラムを叩きたい

とはいえ、1.5ヶ月ぐらいで痛みもかなりデクレッシェンド。また痛くなるのは怖いけどそろそろドラムが恋しくなる時期。しかし右手中指はあまり使いたくない。さてどうするか?

フレンチグリップ

普段はアメリカングリップなので久しぶりにフレンチグリップにしてみました。この握り方は、親指と人差し指がメインで他の指は添える感じなので中指への負担が少ないのが特徴。

しかしフレンチグリップはバウンスを殺してしまいがちな握り方でもある。バウンスは命。でも中指はもっと命。命と命を比較すると中指の方が大事。ということで、フレンチグリップでバウンスの感覚を掴むことに専念する。

一度叩くと自信がつく

怪我をして最初のドラムはかなりヒヤヒヤしたのだけれど、2回目からは少し慣れてしまった。3回目からは、実はフレンチグリップでずっとやってきたのでは?ぐらいの気持ちにまで回復。自信がつく、自信を取り戻すのは自分にとってこれほど重要なことだったのか、と改めて気付く。

メンバーも、「怪我してるとは思えないプレイだった」と言ってくれたりもして、一安心を得る。メンバーに受け入れられるのは心強い。

そして本番

お酒を飲んだこともあり、怪我のことはだいたい吹っ飛んでしまった。と書いてしまうと元も子もないが、「怪我であると思っている自分」がイイ感じに吹っ飛んでしまったのはありがたい。

あと、いつもの音量・いつも以上の音量をフレンチグリップで叩いた結果、腕を多く使った。アメリカングリップだと手首のスナップで音量が出せるのに対して、フレンチグリップは手首のスナップは使えないからである。というのは知識としてはその時知らなくて、本番叩きながら「腕使うしか選択肢ないなー」と思った。

今後

腱鞘炎はしぶとく残るであろうから、フレンチグリップをメインに叩こうかと思う。そうすると、腕も使うことになるので腕力もつけないといけない?筋トレは苦手なり。

指・手首・腕に負担をかけないように心掛けながら、出したい音を表現出来るよう模索します。

releaseの方法 in depth

では、OSCコマンド(Server Command)でreleaseさせるにはどうすればよいのだろう?

前回書いたのだが、もう少しまとめる。というよりもっと前にも書いていた。今回含め3回も書くぐらいだし、releaseは重要なのだ。

releaseするには、大きく分けると、

  • setメソッド
  • releaseメソッド
  • sendMsgメソッド

の3つ方法がある。このうち、set/releaseメソッドはnodeインスタンスの、sendMsgメソッドはserverインスタンスのメソッドである。どれをいつ使うかは状況次第。

コード

//SynthDef
(
SynthDef(\h,{
    |amp=0.3,gate=1,rT=1,freq=440|
    var sig,e,eg;
    sig = SinOsc.ar(freq) + SinOsc.ar(freq + 1);
    e   = Env.adsr(releaseTime:rT);
    eg  = EnvGen.kr(e,gate,doneAction:2);
    sig = sig * eg;
    
    Out.ar(0,Pan2.ar(sig,0,amp));
}).add;

)

/* how to release */
//set
~x = Synth(\h,[\amp,0.1,\rT,0]);
~x.set(\rT,5);
~x.set(\gate,0);

//set gate: negative value
~x = Synth(\h,[\amp,0.1,\rT,0]);
~x.set(\gate,-5-1);

//release
~x = Synth(\h,[\amp,0.1,\rT,0]);
~x.release(5);

//sendMsg release -> gate: 0
~x = Synth(\h,[\amp,0.1,\rT,0]);
s.sendMsg('/n_set',~x.nodeID,\rT,5);
s.sendMsg('/n_set',~x.nodeID,\gate,0);

//sendMsg gate: negative value
~x = Synth(\h,[\amp,0.1,\rT,0]);
s.sendMsg('/n_set',~x.nodeID,\gate,-5-1);

メモ

/* how to release */以降は全て5秒でreleaseする方法である。

saw stringsを作って余韻(release)の伸びを確かめる

saw strings

その名の通りSaw.arを使えばできるだろうと思いググると、

まずオシレーターには通常のこぎり波や細いパルス波など倍音成分が多い波形を用います。最初に述べた通りこれらのオシレーター波形はストリングス系の楽器に近い倍音分布を持っています。これをデチューンするかオクターブ違いにするのがストリングス音の基本的なオシレーター設定です。

チュートリアル:シンセサイザー入門

と書いてある。なので、2つのSaw.arを素直にデチューンして作ってみることにした。

releaseの伸び

ストリングスと言えばreleaseの伸びが印象的。releaseの値を0から0.05ずつ加算して、混ざり合う音がどんな心地になるのかを確かめる。

コード

(
SynthDef(\saw_strings,{
    |freq=440,amp=0.3,gate=1,detune=2,rate=1,rT=0|
    var sig,e,eg;

    sig = Saw.ar(freq) + Saw.ar(freq * rate + detune);
    e   = Env.adsr(0.5,5,0.9,rT,curve:\sin);
    eg  = EnvGen.ar(e,gate,doneAction:2);
    sig = RLPF.ar(sig,freq*2,0.1);
    sig = sig * eg;

    Out.ar(0,Pan2.ar(sig,0,amp*SinOsc.kr(6.5,0,0.1,0.8)));
}).add;

)


(
~r = r({
    var rt = 0;
    var f = [1,1/2,3/2,4/3,5/4];
    var freq = 440!f.size * f;
    inf.do({
        "releaseTime: %\n".postf(rt);
        ~x = Synth(\saw_strings,[\freq,freq.choose,\detune,1,\rT,rt]);
        1.wait;
        ~x.release;
        rt = rt + 0.05;
        1.wait;
    });
});

)

~r.reset;
~r.play(TempoClock( 144/60 ));
~r.stop;


/*
http://danielnouri.org/docs/SuperColliderHelp/ServerArchitecture/SynthDef.html

    // if value is negative, it overrides the release time, to -1 - gate
        x = Synth(\synthDefTest);
        x.set(\gate, -5); // 4 second release
*/

~x = Synth(\saw_strings,[\freq,440,\detune,1,\rT,0]);
s.sendMsg('/n_set',~x.nodeID,\gate,-5);

メモ

感想

  • Synth面
    • デチューンしただけの割には、シンセサイザのプリセットにあるようなsaw stringsの音に聞こえる。
  • Routine面
    • releaseTimeが1を超えた辺りから音のオーバーラップが始まる。音楽的作品には全く以てほど遠いものの、時間が経つにつれてコーラル(合唱)のような響きを感じた。

releaseの方法

Synth(~xとする。)にEnvGenを噛ましてgateをaugとして持っている場合、~x.releaseを実行すればreleaseされる。また~x.release(3)と実行すれば3秒後にreleaseされる(release値の上書き)。

では、OSCコマンド(Server Command)でreleaseさせるにはどうすればよいのだろう?*1それは、

s.sendMsg('/n_set',~x.nodeID,\gate,-5);

のように、sendMsgコマンドの引数に\gate, <負の値>をセットすれば良い。そうすると、-1 - <負の値>後にreleaseされる。

動画に撮ってみた

画面キャプチャではなくiPhoneで撮ったものをiPhoneからYouTubeにアップロードしてみた。こちらより。録音や録画はコードを再実行する手間も省けて便利。

参考

チュートリアル:シンセサイザー入門

Server-Command-Reference

SynthDef

*1:これを書くきっかけ:s.sendMsg('/n_release',node_id)やs.sendMsg('/n_set',node_id,\release)ではreleaseできなかった故。