Nature | Photography | Music | Art -10ページ目

Nature | Photography | Music | Art

日々好奇心の趣くまま

サイト内の写真の使用ならびに無断転用を禁じます。

music21の実用例を兼ねて、先月GIGAZINE(出典:Medium)に掲載された以下の記事に触発されて書いたものです。。

https://gigazine.net/news/20180313-coltrane-pitch-diagrams/

https://medium.com/@lucas_gonze/coltrane-pitch-diagrams-e25b7d9f5093

確かにウチにあるYusef本を見てみると上で言及されている記号が…


それより表紙の三本足クリーチャーの正体の方が気になる…

 


 

Repository of Scales and Melodic Patterns

 

上でSlonimskyとYusef二つの書籍について書かれているが、今回取り上げるのがそのうちの一つ。
現代音楽・ジャズ界隈のネタ本で有名ないわゆるSlonimsky本。1947年の著作らしい。
 

Thesaurus of Scales and Melodic Patterns

 

この本を初めて知ったのは随分昔1990年代、Jazz LifeのHerbie Hancockのインタビューだったか。

インターネットやAmazonなど使えない当時の洋書事情は悲惨で、入手できたとしても$1=\360固定相場かと思うほどぼったくり価格。
この本も取り寄せると\10000近くの値段だったのでとても手が出なかったが、その後観光でボストンに行ったときに立ち寄ったバークリー音楽大学の書店で適正価格で買うことが出来た。
その後ペーパーバック版で更に安くなった。

この本の骨子は要は12半音を順列組み合わせを駆使して生成した膨大な数の音階やパターンをもれなく羅列したもので、そのほとんどはたぶん一生使うことはないかと思う。

200ページ以上の分厚い本だが、多分にアルゴリズミックな内容なので、おそらくアルゴリズムだけ記述すれば10ページ以内に収まるような気もする。
ということで折角なのでpythonとmusic21を使って本書冒頭100ページほどを占めている"Equal Division of N octave into M parts"のアルゴリズムをmusic21の活用事例にもなるかと思って一部だけインプリしてみた。

https://github.com/delphinus1024/slominsky_generator

本書の用語で言うとInterpolation,Ultrapolation,Infrapolation(もしくはその組み合わせ)のうち今回インプリしたのはInterpolationのみ。

使用例として

python slonim_gen.py 2 3 3 64

上の例を説明すると、midinote64=E4 を起点とした2 octaveに含まれる2*12=24個の半音階を3等分して、それぞれの部分の追加の構成音(3-1)=2個(共通のインターバル)の組み合わせの可能性をすべて網羅した譜面が生成される。

 


Slonimsky本では既存の音階(Major scale,3種のMinor scale)に一致するものは意図的に割愛されているが、このプログラムではそのままにしている。
 

 

前回の続き。

 

music21は広範囲な機能を有しており、おそらく全部は使わないし把握もしきれていないので、自身がよく使う機能の備忘録となりますがご了承を。


とりあえずは楽譜をPythonプログラムから生成するまでの必要最低限の操作を順を追って。

まずは音符の生成から。いろいろな方法でF#4のQuater Noteの作り方。
 


from music21 import *

noteList = []

# from note name
n = note.Note("F#4",quarterLength = 1)
noteList.append(n)

# from pitch with note name
p = pitch.Pitch("F#4")
n = note.Note(pitch=p,quarterLength = 1)
noteList.append(n)

# from midi note F#4=66
curnote = 66 
n = note.Note(midi=curnote,quarterLength = 1)
noteList.append(n)

# deep copy
n2 = note.Note(n.pitch,quarterLength=n.quarterLength)
noteList.append(n2)

meas = stream.Measure()
meas.append(noteList)

meas.show('lily.png')

noteクラスはそのまま音符になる。音高や音長やその他の音符を構成するための情報を持っている。
pitchクラスは音高の情報で音長の情報はもたない。通常noteクラスのattributeとして使われる。
midiノート番号から音高を指定する方法もあり、便利なので個人的にはこればかり使っている。ただし#/bのエンハーモニックの制御ができない短所あり。
最後は既存のnoteを複製(深いコピー)する方法。単純にnoteクラスを=で代入すると浅いコピー(参照)になって片方を変更するとコピー先も変更される。


streamの詳細に関しては後述するが、ここではnoteListにnoteをappendしてnoteリストを作成してから最後にmeasに一括してappendしている。
直接measにnoteをappendしていっても構わない。

音高を文字列で指定するには"C3","E#4","B-7","D##5"などピッチクラスと臨時記号の数とオクターブ番号で指定。flatが"-"であるのに注意。
 


from music21 import *

noteList = []

n = note.Note("C3",quarterLength = 1)
noteList.append(n)

n = note.Note("E#4",quarterLength = 1)
noteList.append(n)

n = note.Note("B-7",quarterLength = 1)
noteList.append(n)

n = note.Note("D##5",quarterLength = 1)
noteList.append(n)

meas = stream.Measure()
meas.append(noteList)

meas.show('lily.png')


次に音長の指定方法。幾つかの方法があるが、特殊な場合を除いてquarterLengthに分数の形式で指定するのが(個人的には)一番楽。 ただしtripletはlilypondではなぜかうまくいかない。
 


from music21 import *

noteList = []

# Mid C
curnote = 60 

n = note.Note(midi=curnote,quarterLength = 1)
noteList.append(n)
curnote = curnote + 2

for i in range(2):
    n = note.Note(midi=curnote,quarterLength = 1./2.)
    noteList.append(n)
    curnote = curnote + 2

for i in range(3):
    n = note.Note(midi=curnote,quarterLength = 1./3.)
    noteList.append(n)
    curnote = curnote + 2

for i in range(4):
    n = note.Note(midi=curnote,quarterLength = 1./4.)
    noteList.append(n)
    curnote = curnote + 2

meas = stream.Measure()
meas.append(noteList)

#meas.show('lily.png') # not work?
meas.show('musicxml')

複雑な連符の場合にはappendTupletを使う。
 


from music21 import *

s = stream.Stream()
tuplets = [3, 5, 7, 9, 11, 13]

for t in tuplets:
    d = duration.Duration('eighth')
    d.appendTuplet(duration.Tuplet(t, 2))
    n = note.Note(60)
    n.duration = d
    s.repeatAppend(n, t)


s.insert(0, meter.TimeSignature('2/4'))
s.makeNotation(inPlace=True)
s.makeBeams(inPlace=True)
s.show('lily.png')

 

休符はこんな感じ。音高の指定以外はnoteと同じ。
 


from music21 import *

meas = stream.Measure()
restList = []
curnote = 60

n = note.Rest(quarterLength = 1)
restList.append(n)
curnote = curnote + 2

for i in range(2):
    n = note.Rest(quarterLength = 1./2.)
    restList.append(n)
    curnote = curnote + 2

for i in range(3):
    n = note.Rest(quarterLength = 1./3.)
    restList.append(n)
    curnote = curnote + 2

for i in range(4):
    n = note.Rest(quarterLength = 1./4.)
    restList.append(n)
    curnote = curnote + 2

meas.append(restList)
meas.show('musicxml')

 

タイの付け方。
 


from music21 import *

noteList = []

n = note.Note("F#4",quarterLength = 1)
noteList.append(n)

n = note.Note("F#4",quarterLength = 1)
noteList.append(n)

n = note.Note("F#4",quarterLength = 1)
noteList.append(n)

n = note.Note("F#4",quarterLength = 1)
noteList.append(n)

noteList[0].tie = tie.Tie('start')
noteList[1].tie = tie.Tie('continue')
noteList[2].tie = tie.Tie('continue')
noteList[3].tie = tie.Tie('stop')

meas = stream.Measure()
meas.append(noteList)

meas.show('lily.png')

 

スラーの付け方。(lilypondだと動かない)
 


from music21 import *

noteList = []

n = note.Note("C4",quarterLength = 1)
noteList.append(n)

n = note.Note("G#4",quarterLength = 1)
noteList.append(n)

n = note.Note("B4",quarterLength = 1)
noteList.append(n)

n = note.Note("E4",quarterLength = 1)
noteList.append(n)

sl1 = spanner.Slur([noteList[0], noteList[3]])

meas = stream.Measure()
meas.append(sl1)
meas.append(noteList)
#meas.insert(0.0, sl1) # also works

meas.show('musicxml')

 

和音を作るにはchordクラスを使う。
 


from music21 import *

meas = stream.Measure()

for i in range(8):
    notes = []
    for n in range(5):
        p = pitch.Pitch(60 + (n * 5) + ((i * 7) % 12))
        notes.append(p)

    c = chord.Chord(notes,quarterLength = 1./2.)
    meas.append(c)

meas.show('lily.png')

 

Grace Noteの作り方。(lilypondだと動かない)
 


from music21 import *

meas = stream.Measure()

n = note.Note("G4",quarterLength = 1)
meas.append(n)

d = note.Note('A4', type='eighth')
dGrace = d.getGrace()
meas.append(dGrace)

n = note.Note("G4",quarterLength = 1)
meas.append(n)

n = note.Note("F4",quarterLength = 1)
meas.append(n)

n = note.Note("E4",quarterLength = 1)
meas.append(n)

meas.show('musicxml')

 

Lyricの付け方。個人的には音符の素性をノートしたり本来の用途以外で多用している。
 


from music21 import *

meas = stream.Measure()

n = note.Note("G4",quarterLength = 1.5)
n.addLyric('ho-')
meas.append(n)

n = note.Note("C5",quarterLength = 0.5)
n.addLyric('ge')
meas.append(n)

n = note.Note("B4",quarterLength = 1.5)
n.addLyric('ho-')
meas.append(n)

n = note.Note("F4",quarterLength = 0.5)
n.addLyric('ge')
meas.append(n)

meas.show('lily.png')

 

複数声部を持つ方法。
 


from music21 import *

note1 = note.Note("B4",quarterLength=2)
note2 = note.Note("A4",quarterLength=2)

note1.stemDirection='up'
note2.stemDirection='up'

note3 = note.Note("E4",quarterLength=2)
note4 = note.Note("D4",quarterLength=1)
note5 = note.Note("C4",quarterLength=1)

note3.stemDirection='down'
note4.stemDirection='down'
note5.stemDirection='down'

soprano = stream.Voice()
alto = stream.Voice()

soprano.append(note1);
soprano.append(note2);

alto.append(note3);
alto.append(note4);
alto.append(note5);

staff = stream.Part()

staff.insert(0,alto);
staff.insert(0,soprano);

staff.show('lily.png')

 

ここまでほとんどは一小節のみの例だったが、実用上は複数小節・複数パートの楽譜になるのが一般的。
その際に必要になるのがこれまで暗黙に使っていたStreamクラス。
説明が難しいが、Stream≒譜表もしくはその一部、もしくはその集合と考えれば大きく外さない。

一つのStreamは他の複数のStreamを含むことができ、更にStreamの主な派生クラスとしてScore,Part,Measureなどがあって、
大規模な楽譜の場合、構成は

Score -> 複数のPart -> 複数のMeasure

という感じで階層構造になる。
Streamはフレキシブルな使い方が可能なのだが、経験上以下の進め方が確実。

各Partの作成:Measureを一小節作成→それをPartにappend→その繰り返し
Scoreの作成: 完成したPartをScoreにappend

例を示すのが分かりやすいかと思うので以下。(lilypondだと変な動作)
 


from music21 import *

s = stream.Score()

stream1 = stream.Part()
stream2 = stream.Part()

inst1 = instrument.Instrument()
inst2 = instrument.Instrument()
inst1.partName = "Inst 1"
inst2.partName = "Inst 2"

stream1.append(inst1)
stream2.append(inst2)

tc = clef.TrebleClef()
bc = clef.BassClef()

stream1.append(tc)
stream2.append(bc)

half = duration.Duration(2)

r = note.Rest()
r.duration = half

# inst1
for x in range(8):
    meas = stream.Measure()
    x2 = x + 60
    n=note.Note(x2)
    n.duration = half
    meas.append(n)
    r = note.Rest()
    r.duration = half
    meas.append(r)
    stream1.append(meas)
    
# inst2
for x in range(8):
    meas = stream.Measure()
    x2 = x + 48
    n=note.Note(x2)
    n.duration = half
    meas.append(n)
    r = note.Rest()
    r.duration = half
    meas.append(r)
    stream2.append(meas)

s = stream.Score()
s.append(stream1)
s.append(stream2)

s.show('musicxml')

 

基本的に大規模な譜面の場合はlilypondよりmusescoreを使ったほうが誤動作が少ないように思う。

Streamに別のStreamを加えるにはここではappendを使用したが、insertも使える。
appendは後ろに加えていくやり方、insertは位置を指定して入れ込んでいくやり方。
個人的にはinsertの動作がイマイチ把握できてないので必要な時以外はほとんどappendしか使ってない。

つづいてClef, Key, Time Signature, Barlineの指定をまとめて。
 


from music21 import *

stream1 = stream.Part()

ts = meter.TimeSignature('3/4')
ts.priority = -1
k = key.Key('C-')
k.priority = -1
bc = clef.BassClef()

meas = stream.Measure()
meas.insert(0, ts)
meas.insert(0, k)
meas.insert(0, bc)

a_note = note.Note('D-3')
a_note.quarterLength = 0.5
meas.append(a_note)

a_note = note.Note('C3')
a_note.quarterLength = 0.5
meas.append(a_note)

a_note = note.Note('B-2')
a_note.quarterLength = 0.5
meas.append(a_note)

a_note = note.Rest()
a_note.quarterLength = 1.5
meas.append(a_note)

stream1.append(meas)

ts = meter.TimeSignature('4/4')
ts.priority = -1
k = key.Key('F#')
k.priority = -1
bc = clef.TrebleClef()

meas = stream.Measure()
meas.insert(0, ts)
meas.insert(0, k)
meas.insert(0, bc)

a_note = note.Note('G#5')
a_note.quarterLength = 1
meas.append( a_note)

a_note = note.Note('F5')
a_note.quarterLength = 1.5
meas.append(a_note)

a_note = note.Note('E5')
a_note.quarterLength = 0.5
meas.append(a_note)

a_note = note.Note('D-5')
a_note.quarterLength = 1
meas.append(a_note)

meas.rightBarline = bar.Barline('double')

stream1.append(meas)

stream1.show()

 

priorityは同じタイミングに挿入されたアイテムの並べる順番を指定するもので、数が小さいほど左に現れる。

その他にも数限りなく機能があるが、とりあえずここまで踏まえていればメモ程度の譜面作成には十分かと思います。

 

補足

music21~Slonimsky Generator

表題のライブラリ、先月中旬に機能を更に充実したVer 5がリリースされ、いいタイミングなので紹介を兼ねて久しぶりに音楽ネタでも。

14~15世紀に発明されてから現代まで使われている「五線記譜法」。(Wikiの受け売り)
通常は「楽譜」といえばこれのこと。

最近の音楽制作の多くがPC上での波形の切り貼りとその素材選びというコラージュになってしまったこともあり(自省)、読み書きの習得に時間のかかる楽譜はもしかしたら今後徐々に廃れていくかもしれないという危惧を抱きながら、個人的にはかなりの割合で楽譜に依存している。

この楽譜とコンピュータというのが本当に仲が悪いというか相性がよくない。
というよりユーザの母数が少ないのでソフトの進化が非常に遅いというか、20年以上前から状況にあまり変化がない。

個人的には楽譜ソフトを初めて触ったのが今は亡き「Encore」。その後「Finale」や「Sibelius」や「LogicのScore機能(結局これが一番性に合って愛用していたがその後Windows版は廃版。)」なども触ってみたが、いずれもなんとも言えない違和感を感じていた。

つまり、このあたりの楽譜ソフトは清書…つまり出版用の綺麗な楽譜を作ることを目的としているため(Logicはちょっと違うが)、アイデアをさっさとメモするとかインタラクティブにアルゴリズミックなやり方でリアルタイムに楽譜を生成・試行錯誤するというような機能はあまり充実していない。

前者のメモ用途に関してはとりあえず作業中にMIDI信号を記録しておけばなんとか事足りる。概ね鍵盤楽器に限ってだが。
しかしながら後者の「インタラクティブにアルゴリズミックに」楽譜を生成できるフレームワークはまともなものはあまりない。

やりたいことは、沸いてきたアイデアを基にCやPythonからAPIを叩いて楽譜の断片が即座に作れてすぐに響きを確かめられるのが理想なのだが、その理想に現在最も近くて完成度が高いのが今回ネタにするMIT謹製のmusic21というPython用の音楽情報処理ライブラリ。

http://web.mit.edu/music21/



まあおそらく放っておいたら日本語できちんと紹介されることはないだろうから、このライブラリに普段お世話になっている謝辞をこめて使い方入門でも書ければということで。

基本的にmusic21が扱えるのは楽譜とMIDIデータなのだが、とりわけ前者をきちんとプログラムで扱えるライブラリはほぼ皆無に近い。
ここで書くのも前者について。

ただ、music21自身は楽譜を作成する機能は持たず、MusescoreもしくはLilypondを裏で呼び出しており、前者はmusicxml、後者はly言語(いずれもテキストベースで楽譜を記述するデータ形式)を用いてデータのやり取りを行っている。

個人的には結果を保存・流用したいときはMusescore、その場限りの確認や画像出力する時はLilypondという風に使い分けている。

これを使って何ができるかというと、例えば個人的に過去にやった例はたとえば…

・Slonimsky本のスケールを生成して全12キーで書き出したい。(上の画像)
・あるPitch ClassのすべてのVoicingの可能性を書き出したい。
・コードトーンやテンションノートに[E,B]という2音を含むすべてのコードを書き出したい。(アコギストには重要)

などなど、人力でやれば結構な時間がかかることが(慣れれば)短いコードを書いて実行するだけで実現できる。

以下、Pythonの基本を理解していることが前提になります。
現在最新のVersion5.1.0+Windows7&10で動作確認。

[準備]
・お好みのPython(3.x)環境をインストール。個人的にはanacondaを使用。Python2系はサポートされていない。
・MuseScoreとLilypondをインストール。

https://musescore.org/ja

http://lilypond.org/index.ja.html

・必要であればPython用のMIDI入出力ライブラリをインストール。個人的にはpygameを使用。

[インストール]
以前はいろいろややこしかったが、最新バージョンは普通に

pip install music21

でインストールできる。
詳しくは本家のサイト参照。

[動作確認]
コマンドウインドウ上でpython -iを開いて以下を入力してエラーが出なければ無事インストールされているはず。

from music21 import *

[環境設定]
まずMuseScoreとLilypondの場所を教える必要がある。
(以下続けてやる場合はfrom music21 import *は不要)
環境上のpythonにて


from music21 import *

us = environment.UserSettings()
us.create() #first time only
us['lilypondPath'] = 'C:/LilyPond/usr/bin/lilypond.exe'
us['musescoreDirectPNGPath'] = 'C:/Program Files/MuseScore/bin/mscore.exe'
us['musicxmlPath'] = 'C:/Program Files/MuseScore/bin/mscore.exe'



を実行。環境に応じてパスは変更。
変更・間違いなどで二度目以降の場合はus.create()は省略しないとエラーになる。
これらの設定は最初に一度行っておけばアンインストールしない限りずっと記憶してくれる。

[とりあえず一音]

コマンドウインドウ上でpython -iを開いて
 

 


 

from music21 import *
n = note.Note("C4",quarterLength = 1)
n.show('musicxml')

 

でMuseScoreが開いてオタマ一個だけの楽譜が表示されればとりあえずは入門完了。

 



試しに最終行の

n.show('musicxml')


n.show('lilypond')

もしくは

n.show('lily.png')

に置き換えてみると、lilypondが呼ばれて楽譜のpngが表示されるはず。(複雑になってくるとlilypondとMuseScoreとでは同じコードでも挙動が異なることがあるので要注意)

n.show('midi')


に置き換えてみると、midiがプレイバック。

n.show('text')


に置き換えてみると、楽譜内容をテキスト出力。あまり使わないが…

結果をファイルに出力したい場合はそれぞれ以下の通り。lilypond使用時は拡張子不要なようです。

fn=n.write('lily.png',"./hoge")
fn=n.write('musicxml',"./hoge.xml")
fn=n.write('midi',"./hoge.mid")

飛び飛びになるかもしれませんが、時間を見つけて続きを書きます。
 

********************************************************

後日補足

 

・基本編

music21~基本操作

 

・実践例

music21~Slonimsky Generator

 

[music21] Voicing Explorer

 

 

今年から少々追及してみたくて時間を見つけて勉強している撮影技法。
機材が若干特殊で高価な上に海外から取り寄せなければならない、もしくは部品を取り寄せて自作する必要があるためまだ検討・準備中の段階。

ある種の昆虫が紫外線センサーを備えているのが明かになったのは100年以上も前のことらしい。
更には花と昆虫と紫外線の関係が明らかになり出したのは知っている限りではおそらく1970年前後。
昆虫は紫外線を見ることができるため、花もそれに合わせて(人間から見ると)密かに昆虫を呼び寄せるためにメッセージを送っているらしい。

その不思議な現象研究の第一人者はたぶんこの方。
http://www.naturfotograf.com/UV_flowers_list.html

紫外線写真の技術的なノウハウはこのあたりのページが非常に勉強になる。

http://www.beyondvisible.com/BV0-Barebasics.html

http://photoextremist.com/ultraviolet-induced-visible-fluorescence-photography-tutorial

春になって家の周りにもいろいろ花が咲き出したので、とりあえず手近な機材でちょっとばかり触りだけ試してみた。
家の周辺の花で試してみたところ、ユキヤナギが一番反応がよかったのでこれを採用。

花の単体を普通に白色LEDライトでマクロ撮影したもの。


同じものに暗室で以下の紫外線LEDライトで照らしてみる。(本来ならばもう少し短波長のものがいいのだが、現状持っているのがこれだけなので)
 

高性能 日亜化学工業社製 UV-LED (紫外線LED) 375nm 9灯使用 ブラックライト ハンドライトタイプ(PW-UV943H-04)

 

するとこんな感じで花弁周りに白いハロが現れてくる。

 


(法則によると昆虫は黒いものに寄っていく習性があるため花弁周りは黒くなるはずだが、なぜかこの場合はその限りではない。)

すでに受粉をしているであろう日数が経っている個体を撮ってみると。


白いハロは消えている。受粉の有無と関係しているのだろうか。

紫外線写真は大きく2つに分かれて 1.紫外線そのものを撮るもの 2.UVによって励起された可視光を撮るもの。
とりあえず個人的に興味があるのが後者の方。

実はこのUVに反応して可視光を出す蛍光現象は地上はもとより海中で数多く見られ、サンゴやイソギンチャク類などは前衛アートさながらの色の競演になるらしい。
実はそちらの方をメインに狙っているのだがまだまだ道のりは遠く、途中で挫折するかもしれません。
 

先日以下で試作したレリーズ制御システムの続編です。
 

https://ameblo.jp/delphinus1024/entry-12359166404.html

 

この時に作ったのはユニバーサル基板に手ハンダで配線したものなので製作やチェックに時間がかかるし、見た目も貧弱だし、何より信頼性がよろしくない。
今までも自作ガジェットを屋外に持ち出して過酷な環境で使用中に故障・断線などは何度も経験している。

上のような問題の対策としてオリジナルのプリント基板・所謂PCBを作ってしまうという選択肢が出てくる。

一昔前ならPCBを作ろうと思うと少なくとも\ン万~ン十万ほどは必要で、少なくとも個人的な道楽で気軽に手が出るようなものではなかった。
それが近年、格安PCBを売りにする中華ベンダーがBtoCの分野まで殴りこんできて価格崩壊が起きている様相。
二層で10cm四方のPCBが10枚程度なら$10以下、送料含めても$30程度。ほとんど名刺を作るような感覚。。
このあたりの価格になってくると自分でいちいち配線して基板を組んでいるよりPCBを作ってしまった方が早いし安上がりになる。
万一設計ミスで作り直しが入ったとしてもさほど痛くない。

ということで、試しに格安PCBの老舗でもあるFusionPCBを使ってPCB化してみた。

回路設計・レイアウトまではフリーPCBCADのKiCADで自前で作成。KiCADの吐き出したガーバーデータをPCBベンダーの注文ページでアップロードするだけ。
注文後10日ほどして送られてきたものがこれ。


雑な所もあるが、運用上は全く問題なさそう。

 


部品を実装してみる。


右側のLCDと中間のジョイスティックでメニュー操作をする。
左側に4つジャックが付いているが、これらをカメラのリモート端子に接続。最大4つのカメラを独立して操作することができる。

Arduino Unoから接続・制御できるように作ったので載せてみる。マルチカメラ制御ガジェットが完成。
LCDとジョイスティックが場所をとるため若干Arduinoより大きくなってしまった。



カメラも繋いでみる。 ケーブルが足りないので現状繋げられるのは2つまで。

 


Arduino側のプログラムと接続するデバイス次第で使い方は無限に考えられるが、さしあたってマルチカメラTimelapse制御を作ってみた。
まずは撮影間隔の秒数をセット。


スタートすると指定した間隔ですべてのカメラのシャッターが切られる。同時に撮影枚数を表示。


正直なところ、この程度のものであれば市販品で購入できるのだが、更なる拡張やカスタマイズを自由にするにはやはり自作するしかないのが実情。

味を占めたので、今後時間を見つけてはいろいろ勝手ガジェットを作ってみようかとも考えてます。