Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ja] Time Value Syntax #2

Closed
mohayonao opened this issue Oct 21, 2013 · 3 comments
Closed

[ja] Time Value Syntax #2

mohayonao opened this issue Oct 21, 2013 · 3 comments

Comments

@mohayonao
Copy link
Owner

Max/MSPのような時間値シンタックスを導入したい。

http://www.cycling74.com/docs/max5/vignettes/core/maxtime_syntax.html

Line.kr(0, 1, dur:"1.0.0") # 1小節かけて 0 から 1 に変化する

実装案

  1. コンパイル時に文字列がシンタックスに合致していればその場で数値に変換する
    • 実行時のパフォーマンス good
    • 時間単位が異なる (UGen系は秒、タスクwait はミリ秒を使っている)
    • 周波数を期待する箇所で書けない
    • マスターBPMに対応できない
  2. 受け取る関数内で変換する
    • 実行時のパフォーマンスの問題 bad
    • 時間単位を柔軟に決められる
    • 周波数を期待する箇所で書ける (実行時に変換すればよい)
    • マスターBPMに対応できる
    • 実装量が増える
  3. コンパイル時に合致していれば関数呼び出しに変換する
    • 実行時のパフォーマンスの問題 bad
    • 時間単位が異なる (UGen系は秒、タスクwait はミリ秒を使っている)
    • 周波数を期待する箇所で書けない
    • マスターBPMに対応できる

対応策

  • 時間単位の変換は手動で行う
@wait "1.0.0" * 1000 # 1小節待つ
  • 周波数変換用シンタックスを作る
SinOsc.kr("~1.0.0") # 1小節を周波数に変換する ( ~ はサイン波のイメージ)
  • マスターBPMへの対応は関数で処理しないと不可能

記法 (案)

  • 周波数
    • 100hz → 0.01
  • ミリ秒
  • 50ms → 0.05
    • 10sec → 10
    • 1min → 60
  • 時:分:秒.ミリ秒
    • 00:03:25.230 → 205.230
  • サンプル数
    • 1000samples → (1000 / samleRate)
    • 1000samples/44100hz → (1000 / 44100)

以下はマスターBPMとの連携が必要となり、省略した場合は定数として扱えない

  • ノート長
    • L4
    • bpm140 L4 → 0.42857142857142855
  • 小節/拍/ticks
    • 2.3.240
    • bpm140 2.3.240 → 4.928571428571428
  • ticks
    • 1 tick は四分音符の 1/480 とする
    • 480ticks
    • bpm140 480ticks → 0.42857142857142855
@mohayonao
Copy link
Owner Author

コンパイル時に数値変換して、定数化できないものだけ関数にしたら?

@mohayonao
Copy link
Owner Author

こういう感じで書くようになった場合、ちゃんとテンポ反映される?

Task.do ->
  Master.setBPM 120
  s.play freq:440, dur:"L8"
  Task.do ->
    Master.setBPM 140
    s.play freq:660, dur:"L4"
    @wait 100
    Master.setBPM 180
    s.play freq:660, dur:"L4"
    @wait 100
  .play()
  s.play freq:440, dur:"L8" # ここのBPMは?
  @wait 1000
.play()

@mohayonao
Copy link
Owner Author

Tempo Related Time Value Syntax については #7 で検討する

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant