人気ブログランキング | 話題のタグを見る

【デジットオリジナル ギタープリアンプキットGETPRE-1をしゃぶりつくす その1】

 日本橋にある共立電子のキットで、ギターに内蔵させるためのプリアンプキットがあります。
 単純な汎用オペアンプの小さな基板ですが、ボリュームに基板がくっついたとても使いやすい形をしています。
 これを使うとマイクや電気楽器用のミキサーやエフェクタを簡単に作ることができます。
 自分で回路が設計できるようになるためには、この基板の回路を理解する必要がありますので、解説しましょう。
 
 図1にGETPRE-1の回路図を示します.
【デジットオリジナル ギタープリアンプキットGETPRE-1をしゃぶりつくす その1】_d0010259_11291065.png
 添付されているpdfにも回路図は載ってますが、少々分かりにくいです。
 ここでは、ボリュームをはさんでオペアンプが二つ載っていることが分かればOKです。
 前半部と後半部はほぼ同じ回路になっています。
 入力がオペアンプのプラス側に接続されているので、「非反転増幅器」であると分かります。

 図2に非反転増幅器と反転増幅器の基本回路を示します。
【デジットオリジナル ギタープリアンプキットGETPRE-1をしゃぶりつくす その1】_d0010259_11291710.png

 オペアンプは、プラス入力とマイナス入力の差分を無限大に増幅する素子です。
 ゲインを制限するために、マイナス側に出力を帰還させます。 これを負帰還といいます。
 出力をそのまま帰還させるとゲインが1.0になります。
 ここでは、抵抗分圧によって1/2を帰還させているので、ゲインは2.0です。
 非反転増幅の特徴は、プラス入力をそのまま入力端子にすることで、入力インピーダンスが高くなることです。
 ここで想定されている入力はエレキギターのピックアップなので、出力インピーダンスは500kΩ程度とかなり高いので非反転入力が適当です。

 図3にキットでの実際の回路の前半部分を示します。
【デジットオリジナル ギタープリアンプキットGETPRE-1をしゃぶりつくす その1】_d0010259_11292119.png
 部品番号はキットの回路図と合わせてあります。
 理想オペアンプは、プラスマイナスの両電源で動作しているので、ゼロボルトを中心とする音声信号を処理できますが、コンパクトエフェクタに9ボルト電池を二つも搭載したりdc/dcコンバータを搭載するのは「めんどくさい」ので9ボルト電池一つで動かします。
 このままですと、マイナス側の信号が処理できませんので、中間の4.5ボルトを仮想グランドとするのが、R1,R2です。
 C5,C7のコンデンサでDCカットして外界のゼロボルト中心と接続しています。
 このカップリングコンデンサに溜まってしまった電荷を逃すためにR3,R5があります。
 R3,R5を並列にした500kΩがこの回路の入力インピーダンスです。
 これは、エレキギターの出力インピーダンスが200k〜500kΩ程度なのに合わせてあります.
 また、R5,C5でハイパスフィルタを形成してしまいます。 
 そのカットオフ周波数は、1/(2πCR)ですので、この場合は1.6Hz程度です。


# by studio_do | 2020-10-23 11:31 | 音楽 | Comments(0)

python2.7 プログラミング作法

python プログラミング作法
 リストなど変数に代入するのは、参照のコピーでしかない。
 これは、関数、メソッドの呼び出しで引数を渡すのも同じこと。
 渡したつもりで、参照がコピーされただけなので、メソッドの中で引数が変化すれば参照元も変化して見える。
 これを知らなければ、
>>> a=[1,2,3]
>>> b=a
>>> b
[1, 2, 3]
>>> b[1]=11
>>> a
[1, 11, 3]
>>> b
[1, 11, 3]
>>>

 という、不可解な現象に悩むことになる。
 これは、bには、aから[1,2,3]への参照と同じ参照が渡されるだけだからだ。
 これだけ見ると、どうしてこうゆう仕様になっているのか不思議だが、メソッドの引数渡しでもこの動きはあって、
def func_a(rec):

rec[1]=22

a=[1,2,3]
print a
func_a(a)
print a

ーーーー
[1, 2, 3]
[1, 22, 3]

 からわかるとおり、メソッドの受け取った引数recはローカル変数かと思いきや、参照しか渡されていないので、メソッドの中で引数を変更すると、メインルーチン側でも変数が変化していることがわかる。

 そうすると、メソッドと上位ルーチン間での引数、リターン値のやり取り方法にいくつか方法が考えられる。
import time

def func_a(rec):

rec[1]=rec[1]+1
return rec

def func_b(rec):
rec2 = rec[:]
rec2[1]=rec2[1]+1
return rec2

def func_c(rec):

rec[1]=rec[1]+1

def func_d():

rec[1]=rec[1]+1

# way 1
start = time.time()
a=[1,2,3]
for i in range (int(1e6)):
r=func_a(a)
r1=func_a(r)
r2=func_a(r1)
print r2
stop = time.time()
elapsed= (stop - start) * 1e3
print ("elapsed_time:{0}".format(elapsed) + "[ms]")

# way 2
start = time.time()
a=[1,2,3]
for i in range (int(1e6)):
r2=func_a(func_a(func_a(a)))
print r2
stop = time.time()
elapsed= (stop - start) * 1e3
print ("elapsed_time:{0}".format(elapsed) + "[ms]")

# way 2-1
start = time.time()
a=[1,2,3]
for i in range (int(1e6)):
r2=func_b(func_b(func_b(a)))
a=r2
print r2
stop = time.time()
elapsed= (stop - start) * 1e3
print ("elapsed_time:{0}".format(elapsed) + "[ms]")

# way 3
start = time.time()
a=[1,2,3]
for i in range (int(1e6)):
func_c(a)
func_c(a)
func_c(a)

print a
stop = time.time()
elapsed= (stop - start) * 1e3
print ("elapsed_time:{0}".format(elapsed) + "[ms]")

# way 4
start = time.time()
rec=[1,2,3]
for i in range (int(1e6)):
func_d()
func_d()
func_d()

print rec
stop = time.time()
elapsed= (stop - start) * 1e3
print ("elapsed_time:{0}".format(elapsed) + "[ms]")



結果
[1, 3000002, 3]
elapsed_time:1574.20301437[ms]
[1, 3000002, 3]
elapsed_time:1273.03004265[ms]
[1, 3000002, 3]
elapsed_time:2094.46501732[ms]
[1, 3000002, 3]
elapsed_time:1342.04602242[ms]
[1, 3000002, 3]
elapsed_time:1299.40485954[ms]

 一番早いのは、way4の、グローバル変数をメソッドの中でそのまま変更する方法。
 だがこれは何やってるのかソースの可読性が悪い。
 一番遅いのは、way2-1のループの中に代入がある方法。
 普通は、way1の、引数とリターンを使う方法。

 以上で分かるように、出来るだけ、値のコピーをしないほうが速度が向上する。
 
 pythonの解析サイトで、「代入が参照なので、気をつけるように」というのはよく解説されていることだが、どうしてそうなっているのかの理由まで言及しているところが見当たらない。
 現象としては、「代入文の右辺が左辺に影響される」という現象がよく言われるのだが、実はこれは副作用ではないかと思う。
 やりたかったのは、メソッドへの引数をコピーなしに渡したい、ということではなかったかと思う。
 代入文で右辺が左辺に影響されるというのは、バグを誘発する要因でしかないが、メソッドへの引数がコピーなしに渡せるというのは思想だと思う。
 それだけに、その思想は理解しないと、変数のスコープが曖昧だというデメリットばかりが目にについてしまう。
 
 先ほどの実験でも、なるべく値のコピーを発生させないようなコーディングのほうが早いというのが見て取れた。
 引数渡しは、変数がグローバルかローカルかというのより上位の概念のようで、変数名にかかわりなく、参照がコピーされるだけだ。
 
 プログラミング作法としては、メソッドの中の引数は、ローカルではなくグローバルのつもりでアクセスすることが必要だし、必要ない中間の変数をやたらと生成しないようにするほうが良い。
 
 

# by studio_do | 2019-12-31 19:58 | 機械室から | Comments(0)

SAB JAM マンドリン編

2019年11月に逝去された、井上三郎氏が残された教則ビデオのうち、マンドリンの部を一覧にしました。 新しいものから古いものへと並んでいます。
|(52) Moonshiner Jam 201905 15 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of B - YouTube
|(52) Moonshiner Jam 201905 14 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of A - YouTube
|(52) Moonshiner Jam 201905 13 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of G 通 - YouTube
|(52) Moonshiner Jam 201905 12 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of G - YouTube
|(52) Moonshiner Jam 201905 11 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of G - YouTube
|(52) Moonshiner Jam 201905 10 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of G - YouTube
|(52) Moonshiner Jam 201905 09 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of G - YouTube
|(52) Moonshiner Jam 201905 08 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of G - YouTube
|(52) Moonshiner Jam 201905 07 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of D - YouTube
|(52) Moonshiner Jam 201905 06 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of D - YouTube
|(52) Moonshiner Jam 201905 05 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of D - YouTube
|(52) Moonshiner Jam 201905 04 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of D - YouTube
|(52) Moonshiner Jam 201905 03 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of D - YouTube
|(52) Moonshiner Jam 201905 02 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) Key of D - YouTube
|(52) Moonshiner Jam 201905 01 How To Play Bluegrass #05 Will the Circle Be Unbroken (Mandolin) ごあいさつ - YouTube

# by studio_do | 2019-11-25 23:32 | 音楽 | Comments(0)

python2.7 treeviewを使ったsambaクライアント

linux on androidのchroot環境では、カーネルの改変がやりにくいため、cifsをインストールするなどカーネルをいじるインストールが困難。
ファイルシステムが追加できないので、sambaクライアントの実装が出来ない。
 
samba自体は、ただn通信プロトコルであって、pythonでモジュールがある。
あとは、ファイルブラウザを作れば、sambaクライアント程度は実装出来そう。
 
python2.7 treeviewを使ったsambaクライアント_d0010259_14582412.png
というこで、作ってみた。
pythonには、ttkモジュールにtreeviewウィジェットがあってファイル一覧が簡単に実現できる。
pythonのsambaには、
pysmb
pysmbc
の2つがある。 ここで使ったのは簡単な、pysmbcのほう。


# by studio_do | 2019-09-30 15:11 | 機械室から | Comments(0)

ギターのコードを考えるソフトを考えた

ギターのコードを考えるソフトを考えた_d0010259_07381200.pngギターの練習をするときに、コードの押さえ方を本を見て覚えるとか、押さえにくいコードを押さえられるように練習するとかすると思うのだが、それよりは押さえられるコードを自分で考えた方が役に立つ。
 
で、コードを考えるソフトを作ってみた。

Windows用であるが、開発はlinux/Python。
考えたいコードをクリックすると、使える音が仮想指板上に示されるので、「どこが押さえられるかな?」と考える。
考えたコードは、テキストファイルにして自分用のコードブックとして編集できる。
特徴的なのは、ダイアトニックモードであって、そのキーのダイアトニックコードを表示できる。
ジャズのややこしいコードが出てきたとき、「これはダイアトニックなのか、転調してるのか?」と悩む
のに使う。
ウクレレとか、テナーギター(ビオラ、テナーバンジョー、マンドセロ)、マンドリン、ドブロに対応しているので、マンドリンでジャズをやりたいときに、C6ってどう押さえるなどと悩むのにも使える。
 

ギターのコードを考えるソフトを考えた_d0010259_07382488.pngギターのコードを考えるソフトを考えた_d0010259_07381814.png

# by studio_do | 2019-07-05 07:51 | 音楽 | Comments(0)