辞書
FC2ブログ

拍子の扱い方

 2009-01-18
高校生になるまで、拍(4/4とか)を約分しても良いと思っていたという
人がおられるそうだ。


音楽の拍子に関しては、拍子の種類と拍子記号にうまくまとめられています。


以下、拍子分子という変数がたくさんあるが、前回の投稿時、4という定数を使っていたところを
拍子分子という変数に置き換えます。そうすることで、
拍子分子のコンボを変化させる都度、●  罫線描画処理のイベントを呼べば、
拍子に合わせて罫線と小節番号が再描画されます。 






●  罫線描画処理
   PianoRollを白色で画面クリア
   線太さ=1
   線色=$B4CCE0
   線描画回数とは整数
   線描画回数=0
   (PianoRollのW)>(横縮尺*48)+(線描画回数-2)*(横縮尺*48)の間
     PianoRollの(横縮尺*48)+(線描画回数-1)*(横縮尺*48),0から(横縮尺*48)+(線描画回数-1)*(横縮尺*48),1408へ線
     線描画回数=線描画回数+1
   線太さ=2
   線色=$8F9DAD
   線描画回数=0
   (PianoRollのW)>(横縮尺*48*拍子分子)+(線描画回数-2)*(横縮尺*48*拍子分子)の間
     PianoRollの(横縮尺*48*拍子分子)+(線描画回数-1)*(横縮尺*48*拍子分子),0から(横縮尺*48*拍子分子)+(線描画回数-1)*(横縮尺*48*拍子分子),1408へ線
     PianoRollの(横縮尺*48*拍子分子)+(線描画回数-1)*(横縮尺*48*拍子分子),0へ線描画回数を文字描画
     線描画回数=線描画回数+1

   PianoRollのH=縦縮尺*88
   線太さ=1
   線色=$B4CCE0
   89回
        PianoRollの0,縦縮尺*(回数-1)から1000,縦縮尺*(回数-1)へ線
   
   


スポンサーサイト



カテゴリ :なでしこで作るMidiシーケンサー トラックバック(-) コメント(-)

縦横の罫線に縮尺

 2009-01-17
# ページ切り替え式ピアノロールシーケンサの試み (製作途中 STEP 1)

# 目標
# ガイド針の位置にマウスで音符を入力する。
# マウスを押し続ける長さで音符の長さを決定する。(タイマー部品)
# ガイド針は、指定した精度で割り切れる値を移動すること。
# 音楽的な位置が画面を越えた場合には自動的にページを変えること
# 縦 横に 縮尺機能をつけること
# PianoRoll(イメージ)の親部品はPanel(スクロールパネル)
# PianoRollは88個のピアノ鍵盤のノートに対応
# 縦の縮尺変化で、PianoRollの駒のHeightを変化させる。
# 縦縮尺の最大値=16ピクセル。 16*88=1408 PianoRoll(イメージ)のHeight=1408
# 初期状態で48横ピクセルを1拍とする。
# 拍子を設定できるようにする。
# データは保存、読み込みを可能とする


#  STEP 1  縦横の罫線に縮尺機能をつけた。


母艦について
   タイトル=「ページ切り替え式ピアノロールシーケンサの試み」
   W=1024
   H=768
   X=0
   Y=0
   $EEEEEAで画面クリア
   文字サイズ=9


# 拍子の指定をする

拍子分母とはコンボ
拍子分母について
   W=40
   H=20
   X=20
   Y=5
   文字サイズ=10
   アイテム=「2{~}4{~}8{~}16」
   値=1

68,10へ移動して「分の    拍子」を表示

拍子分子とはコンボ
拍子分子について
   W=40
   H=20
   X=100
   Y=5
   文字サイズ=10
   アイテム=「1{~}2{~}3{~}4{~}5{~}6{~}7{~}9{~}10{~}11{~}12{~}13{~}14{~}15{~}16{~}17」
   値=3



# 縮尺機能をセットする

横縮尺配列とは配列=「0.125,12.5%
0.25,25%
0.5,50%
0.75,75%
1,100%
1.25,125%
1.5,150%
2,200%
3,300%
4,400%
6,600%
9,900%」

横縮尺指数とは整数=4

横縮尺とは実数=横縮尺配列\横縮尺指数,0

横縮尺Positiveとはボタン
横縮尺Positiveについて
   W=20
   H=20
   X=940
   Y=50
   文字サイズ=10
   テキスト=「+」
   クリックした時は
    もし横縮尺が9でないならば
      横縮尺指数=横縮尺指数+1
      横縮尺Labelのテキスト=横縮尺配列\横縮尺指数,1
      横縮尺=横縮尺配列\横縮尺指数,0
      罫線描画処理
      針位置=60+(横縮尺*48*4)
      
横縮尺Negativeとはボタン
横縮尺Negativeについて
   W=20
     H=20
   X=912
   Y=50
   文字サイズ=10
   テキスト=「-」
   クリックした時は
    もし横縮尺が0.125でないならば
      横縮尺指数=横縮尺指数-1
      横縮尺Labelのテキスト=横縮尺配列\横縮尺指数,1
      横縮尺=横縮尺配列\横縮尺指数,0
      罫線描画処理
      針位置=60+(横縮尺*48*4)

横縮尺Labelとはラベル
横縮尺Labelについて
   W=50
   H=20
   X=920
   Y=20
   文字サイズ=10
   テキスト=「100 %」


縦縮尺配列とは配列=「2
3
4
5
6
7
8
9
10
11
12
14
16」

縦縮尺指数とは整数=4

縦縮尺とは整数=縦縮尺配列\縦縮尺指数

縦縮尺Positiveとはボタン
縦縮尺Positiveについて
   W=20
   H=20
   X=970
   Y=530
   文字サイズ=10
   テキスト=「+」
   クリックした時は
    もし縦縮尺が16でないならば
      縦縮尺指数=縦縮尺指数+1
      縦縮尺Labelのテキスト=縦縮尺配列\縦縮尺指数
      縦縮尺=縦縮尺配列\縦縮尺指数,0
      罫線描画処理
      
      
縦縮尺Negativeとはボタン
縦縮尺Negativeについて
   W=20
   H=20
   X=970
   Y=505
   文字サイズ=10
   テキスト=「-」
   クリックした時は
    もし縦縮尺が2でないならば
      縦縮尺指数=縦縮尺指数-1
      縦縮尺Labelのテキスト=縦縮尺配列\縦縮尺指数
      縦縮尺=縦縮尺配列\縦縮尺指数,0
      罫線描画処理
縦縮尺Labelとはラベル
縦縮尺Labelについて
   W=50
   H=20
   X=970
   Y=480
   文字サイズ=10
   テキスト=6



# PianoRollWindowを確保する

Panelとはスクロールパネル
Panelについて
   W=48*19+22
   H=4*88
   X=60
   Y=100


PianoRollとはイメージ
PianoRollについて
   親部品=Panel
   H=1408
   W=48*19
   X=0
   Y=0
   可視=オン

罫線描画処理



# 位置表示部

Pageとはエディタ
Pageについて
   W=20
   H=20
   X=250
   Y=10
   文字サイズ=11
   Page=「01」
220,16へ移動して「Page」を表示

針位置とはエディタ
針位置について
   W=40
   H=20
   X=330
   Y=10
   文字サイズ=11
   針位置=60+(横縮尺*48*4)
   変更した時は
      ツマミのX=針位置
      針のX=針位置

290,16へ移動して「Guide」を表示

# ガイド針

ツマミとはイメージ
ツマミについて
   W=30
   H=23
   X=60+48*4
   Y=75
   $7DF2CCで画面クリア

針とはパネル
針について
   W=2
   H=352
   X=60+48*4
   Y=98
   背景色=$7DF2CC



●  罫線描画処理
   PianoRollを白色で画面クリア
   線太さ=1
   線色=$B4CCE0
   NN=0
   (PianoRollのW)>(横縮尺*48)+(NN-2)*(横縮尺*48)の間
     PianoRollの(横縮尺*48)+(NN-1)*(横縮尺*48),0から(横縮尺*48)+(NN-1)*(横縮尺*48),1408へ線
     NN=NN+1
   線太さ=2
   線色=$8F9DAD
   NN=0
   (PianoRollのW)>(横縮尺*48*4)+(NN-2)*(横縮尺*48*4)の間
     PianoRollの(横縮尺*48*4)+(NN-1)*(横縮尺*48*4),0から(横縮尺*48*4)+(NN-1)*(横縮尺*48*4),1408へ線
     PianoRollの(横縮尺*48*4)+(NN-1)*(横縮尺*48*4),0へNNを文字描画
     NN=NN+1

   PianoRollのH=縦縮尺*88
   線太さ=1
   線色=$B4CCE0
   89回
        PianoRollの0,縦縮尺*(回数-1)から1000,縦縮尺*(回数-1)へ線

カテゴリ :なでしこで作るMidiシーケンサー トラックバック(-) コメント(-)

縮尺のプログラム法

 2009-01-17

 

# 縮尺機能をセットする

横縮尺配列とは配列=「0.125,12.5%
0.25,25%
0.5,50%
0.75,75%
1,100%
1.25,125%
1.5,150%
2,200%
3,300%
4,400%
6,600%
9,900%」

横縮尺指数とは整数=4

横縮尺とは実数=横縮尺配列\横縮尺指数,0

横縮尺Positiveとはボタン
横縮尺Positiveについて
   W=20
   H=20
   X=940
   Y=50
   文字サイズ=10
   テキスト=「+」
   クリックした時は
    もし横縮尺が9でないならば
      横縮尺指数=横縮尺指数+1
      横縮尺Labelのテキスト=横縮尺配列\横縮尺指数,1
      横縮尺=横縮尺配列\横縮尺指数,0
      罫線描画処理
      針位置=60+(横縮尺*48*4)
      
横縮尺Negativeとはボタン
横縮尺Negativeについて
   W=20
     H=20
   X=912
   Y=50
   文字サイズ=10
   テキスト=「-」
   クリックした時は
    もし横縮尺が0.125でないならば
      横縮尺指数=横縮尺指数-1
      横縮尺Labelのテキスト=横縮尺配列\横縮尺指数,1
      横縮尺=横縮尺配列\横縮尺指数,0
      罫線描画処理
      針位置=60+(横縮尺*48*4)

横縮尺Labelとはラベル
横縮尺Labelについて
   W=50
   H=20
   X=920
   Y=20
   文字サイズ=10
   テキスト=「100 %」

 

 

# PianoRollWindowを確保する

Panelとはスクロールパネル
Panelについて
   W=48*19+22
   H=4*88
   X=60
   Y=100


PianoRollとはイメージ
PianoRollについて
   親部品=Panel
   H=1408
   W=48*19
   X=0
   Y=0
   可視=オン

 

# 位置表示部

Pageとはエディタ
Pageについて
   W=20
   H=20
   X=250
   Y=10
   文字サイズ=11
   Page=「01」
220,16へ移動して「Page」を表示

針位置とはエディタ
針位置について
   W=40
   H=20
   X=330
   Y=10
   文字サイズ=11
   針位置=60+(横縮尺*48*4)
   変更した時は
      ツマミのX=針位置
      針のX=針位置

290,16へ移動して「Guide」を表示

# ガイド針

ツマミとはイメージ
ツマミについて
   W=30
   H=23
   X=60+48*4
   Y=75
   $7DF2CCで画面クリア

針とはパネル
針について
   W=2
   H=352
   X=60+48*4
   Y=98
   背景色=$7DF2CC

 

●  罫線描画処理
   PianoRollを白色で画面クリア
   線太さ=1
   線色=$B4CCE0
   NN=0
   (PianoRollのW)>(横縮尺*48)+(NN-2)*(横縮尺*48)の間
     PianoRollの(横縮尺*48)+(NN-1)*(横縮尺*48),0から(横縮尺*48)+(NN-1)*(横縮尺*48),350へ線
     NN=NN+1
   線太さ=2
   線色=$8F9DAD
   NN=0
   (PianoRollのW)>(横縮尺*48*4)+(NN-2)*(横縮尺*48*4)の間
     PianoRollの(横縮尺*48*4)+(NN-1)*(横縮尺*48*4),0から(横縮尺*48*4)+(NN-1)*(横縮尺*48*4),350へ線
     PianoRollの(横縮尺*48*4)+(NN-1)*(横縮尺*48*4),0へNNを文字描画
     NN=NN+1

 

Flash Movie

 

 

カテゴリ :なでしこで作るMidiシーケンサー トラックバック(-) コメント(-)

音楽シーケンサのページ切り替え実験(第2話)

 2009-01-16
fc004.jpg


今回 STEP2 では、ツマミをマウスで画面の右端に運ぶと、画面がパッと次のページに
切り替わるということをやってみた。
Pageというエデイタを書き換えれば、そのイベントで、画面が切り替わる。
ツマミに連動して針位置が変化するのでその変化のイベントでもし針位置>912ならば
Page=Page+1としてページを切り替えている。


         ツマミマウス状況=「離している」
         ツマミのX=192-48
         192-48+68,120へマウス移動
         ツマミマウス状況=「押している」
以上の4行で、ページ切り替え後に、ツマミと針の位置がちょうど適した位置に就くように
配慮した。
なでしこのプログラミングは面白い!
アイデアがすぐに実現できるからだ。


エデイタが多くなったので一応整理しておきます。

Page     ページを示す
針位置    針の位置が画面の中でどこにいるのかを示す
現在位置   音楽的シーケンスの対象位置
音楽位置   現在位置をMML文用に小節、拍、Tickに分解して記述しなおしたもの。

現在位置と音楽位置のコンテンツはまったく同じ。
全楽曲を通じて、ページが変わっても通し番号になる。

針位置は、 画面上の位置なので、ページごとに、左から右に向かってスライドする。  




# ページ切り替えの練習プログラム STEP2
# 2009/1/16 

母艦について
   W=1024
   H=768
   X=0
   Y=0

30回
   「Page{回数}とはイメージ
Page{回数}について
   W=912
   H=330
   X=48
   Y=120
   $E1F5FFで画面クリア
   可視=オフ
線色=黒色
線太さ=1
Nを0から20まで繰り返す
   Page{回数}のN*48,0からN*48,330へ線
Nを0から5まで繰り返す
   Page{回数}のN*48*4,0へ{回数-1}*4+Nを文字描画

   」をナデシコする
   
   
Page1の可視=オン


Label1針位置とはラベル
Label1針位置について
   X=280
   Y=5
   W=70
   H=50
   文字サイズ=12
   Label1針位置=「針位置=」

針位置とはエディタ
針位置について
   X=350
   Y=5
   W=70
   H=50
   文字サイズ=20
   針位置=192
   
   変更した時は
      現在位置=(針位置-192)+(Page-1)*48*4*4

      もし針位置>912ならば
         ツマミマウス状況=「離している」
         ツマミのX=192-48
         192-48+68,120へマウス移動
         ツマミマウス状況=「押している」
         Page=Page+1
      
      もし針位置<0ならば
         ツマミマウス状況=「離している」
         ツマミのX=768+48
         768+48+20,120へマウス移動
         ツマミマウス状況=「押している」
         
         Page=Page-1

Label2Pageとはラベル
Label2Pageについて
   X=200
   Y=5
   W=70
   H=50
   文字サイズ=12
   Label2Page=「Page=」
  

Pageとはエディタ
Pageについて
   X=250
   Y=5
   W=20
   H=20
   文字サイズ=10
   Page=1
    変更した時は
     もしPage=0ならば
        Page=1
        ツマミマウス状況=「離している」
        ツマミのX=192-48
        192-48+68,120へマウス移動
        ツマミマウス状況=「押している」
     30回
        「Page{回数}の可視=オフ
Page{Page}の可視=オン」をナデシコする


Label3現在位置とはラベル
Label3現在位置について
   X=460
   Y=5
   W=70
   H=50
   文字サイズ=12
   Label3現在位置=「現在位置=」

現在位置とはエディタ
現在位置について
   X=550
   Y=5
   W=70
   H=50
   文字サイズ=20
   現在位置=(針位置-192)+(Page-1)*48*4*4
   変更した時は
      現在位置を位置分解
      音楽位置=それ
      
● 位置分解(Pを)
   節=INT(P/192)+1
   拍=INT((P-(節-1)*192)/48)+1
   T=P-(節-1)*192-(拍-1)*48
   「Time({節}:{拍}:{T})」で戻る


Label4音楽位置とはラベル
Label4音楽位置について
   X=660
   Y=5
   W=70
   H=50
   文字サイズ=12
   Label4音楽位置=「音楽位置=」

音楽位置とはエディタ
音楽位置について
   X=750
   Y=5
   W=190
   H=50
   文字サイズ=20
   音楽位置=「Time(1:1:0)」


ツマミマウス状況とは文字列=「離している」

ツマミとはイメージ
ツマミについて
   可視=オン
   W=30
   H=20
   X=192+48
   Y=100
   $2E60E2で画面クリア
   マウス離した時は
      ツマミマウス状況=「離している」
   マウス押した時は
      ツマミマウス状況=「押している」
      押時X=ツマミのマウスX

   マウス移動した時は
     もしPage=1かつ現在位置<-191ならば
         現在位置=-190
         抜ける
     もしツマミマウス状況=「押している」ならば
         ツマミ移動量=ツマミのマウスX-押時X
         針位置=ツマミのX+ツマミ移動量-46
         ツマミのX=ツマミのX+ツマミ移動量
         針のX=ツマミのX+ツマミ移動量
     


針とはパネル
針について
   W=3
   H=330
   X=192+48
   Y=120
   背景色=$2E60E2
   線太さ=1

カテゴリ :なでしこで作るMidiシーケンサー トラックバック(-) コメント(-)

音楽シーケンサのページ切り替え実験(第1話)

 2009-01-16
音楽シーケンサで、たとえばピアノロール譜(楽譜なら、なおさら)を設計する場合、
ひとつ考えなければならないことは、…たとえ大型のモニタでも
パソコンモニタの画面は、実際の音楽に比べて小さ過ぎるということだ…。
たとえば、たった60秒の音楽でも、テンポが120として4分の4拍子とすると…
拍の刻みは0.5秒に一回。 120回刻まれる計算となるのだが、1拍の横幅を
節約して48ピクセルとしても、一般的なモニタ1024ピクセルに収まるのは、わずか20拍だけ。
すなわち、60秒の音楽でも、6ページにわたって横スクロール、または、ページをあらためないと
いけないということがわかる。細やかな音符の流れの音楽の場合は、縮尺を大きくとってしまうから
なおさらページ数が大きくなる。
 ところで、音楽シーケンサを考える時、最近まで僕が考えていた方法は、『ページを改める』方法
ではなくて、 ひたすら横に長いイメージ部品を用意して、そのイメージ部品に対して描画を行い、
画面をスクロールさせるという方法を採ってきた。
 その結果、いたずらにメモリを酷使し、10ページもの長さの場合、編集スピードが落ちたり
フリーズすることもあったのだ。
 正直言って、なでしこが遅いからとなでしこのせいにしていたのだが、
最近、ひとつ、あることに、気がついた!
 音楽データ(どんなに長いデータでも良い)を、画面に収まる長さごとに区切って
ページごとに区切り、 パッパッと画面を切り替えたらよいではないか。
それなら、メモリを酷使しなくてもよいし、表示速度が落ちたり、フリーズすることもなくなるはずだ。
 正直、いままでそのことに少しも気がつかなかったのかというと、うそになる。
ある程度気がついていたのだが、頭の悪い僕は、実際の音楽的時間位置と画面位置とページ数との
関係式をどう作るのか、なかなかわからず、安易に逃げていたのだ。
 今、 もういちど、 実験を通じて、 この問題を解いてみたい。 そんな心境で
とりあえず、そのための実験道具の製作を始めた。


# ページ切り替えの練習プログラム STEP1
# 2009/1/16 

母艦について
   W=1024
   H=768
   X=0
   Y=0

30回
   「Page{回数}とはイメージ
Page{回数}について
   W=912
   H=330
   X=48
   Y=120
   $E1F5FFで画面クリア
   可視=オフ
線色=黒色
線太さ=1
Nを0から20まで繰り返す
   Page{回数}のN*48,0からN*48,330へ線
Nを0から5まで繰り返す
   Page{回数}のN*48*4,0へ{回数-1}*4+Nを文字描画





   」をナデシコする
   
   
Page1の可視=オン


Label1針位置とはラベル
Label1針位置について
   X=280
   Y=5
   W=70
   H=50
   文字サイズ=12
   Label1針位置=「針位置=」

針位置とはエディタ
針位置について
   X=350
   Y=5
   W=70
   H=50
   文字サイズ=20
   針位置=0

Label2Pageとはラベル
Label2Pageについて
   X=200
   Y=5
   W=70
   H=50
   文字サイズ=12
   Label2Page=「Page=」
  

Pageとはエディタ
Pageについて
   X=250
   Y=5
   W=20
   H=20
   文字サイズ=10
   Page=1
    変更した時は
     30回
        「Page{回数}の可視=オフ
Page{Page}の可視=オン」をナデシコする


ツマミマウス状況とは文字列=「離している」

ツマミとはイメージ
ツマミについて
   可視=オン
   W=30
   H=20
   X=48
   Y=100
   $2E60E2で画面クリア
   マウス離した時は
      ツマミマウス状況=「離している」
   マウス押した時は
      ツマミマウス状況=「押している」
      押時X=ツマミのマウスX

   マウス移動した時は
     もしツマミマウス状況=「押している」ならば
       ツマミ移動量=ツマミのマウスX-押時X
       針位置=ツマミのX+ツマミ移動量-46
       ツマミのX=ツマミのX+ツマミ移動量
       針のX=ツマミのX+ツマミ移動量
       


針とはパネル
針について
   W=3
   H=330
   X=48
   Y=120
   背景色=$2E60E2
   線太さ=1

      

fc003.jpg


一応これでページ数を表示しているエディタの数値を書き換えたらそのイベントで
ページが切り替わるプログラムができたのだが…
もちろん、実際的には、エディタは直接使うわけではない。


作り終えてすぐに気がついたのだが、これはこれで、巨大なイメージ部品を一個用意する愚よりは
メモリーの節約になるかもしれないが、
もっと、良い方法は、 小さなイメージ部品を多数作るのではなく
小さなイメージ部品をたったひとつだけ作って
そのひとつのイメージ部品で必要な画面データだけを呼び起こして描画してしまうほうが
より良いのではないか。と思ったり思わなかったりする???

ま、とりあえず、これ(改善策)で 実験をすすめていこうと思う。



整理する。

一番愚かな方法
    巨大なイメージ部品を一個作ってスクロール

改善策
    画面に収まる小さなイメージ部品をページ数準備し、ページ切り替え時に可視をオンオフ
    長所---ページ切り替え時に描画をする必要がない
    短所---巨大な音楽データを一度に読み込む場合、重たいだろうな。

一番優れている方法
    画面に収まる小さなイメージ部品を一個だけ準備、ページ切り替え時にそのページに関係する
    データだけを抽出して再描画
    長所---常に描画すべき範囲は小さいのでメモリ的には最高かもしれない
    短所---ページを切り替える度に描画しなくてはいけない。
         しかし、その描画速度は問題にならないかもしれない。
         プログラムを書くのが、難しい!



どうなんだろうか?
上記の改善策は、一番優れている方法よりも メリットがある。



    



カテゴリ :なでしこで作るMidiシーケンサー トラックバック(-) コメント(-)
≪ トップページへこのページの先頭へ  ≫ 次ページへ ≫
最近の記事

最近のコメント

月別アーカイブ
カテゴリー
カウンター
ランキング
b_04.gif

プロフィール