Nusedriver manual

Overall

Features

MusicProgram

ControlChange

$00 Tempo
  1. bpm (1~255)
Beats per Minuteを指定する。
全channelでひとつの変数を共有している。
0だと曲が進行しない。

ex. BPMを150にしたい場合
    .db CcTempo,150
$01 GateTime
  1. note_gate_time lo
  2. note_gate_time hi
note_gate_timeを指定する。
Note前方から数えてnote_gate_time分、NoteのReleaseが早まる。
スタッカートのような使い方を想定。

ex. GateTimeを16分音符分にしたい場合
    .db CcGateTime
    .dw WHOLE_NOTE_LENGTH/16
$02 ReleaseTime
  1. note_release_time lo
  2. note_release_time hi
note_release_timeを指定する。
Note後方から数えてnote_release_time分、NoteのReleaseが早まる。

ex. ReleaseTimeを4分音符分にしたい場合
    .db CcReleaseTime
    .dw WHOLE_NOTE_LENGTH/4
$03 VolumeEnvelopeAttack
  1. volume_envelope_attack_address lo
  2. volume_envelope_attack_address hi
Attack用VolumeEnvelopeのLabel Addressを指定する。
Label以降の記述で、volume_envelope値として使用可能な範囲は0~15.

ex. Attack用VolumeEnvelopeを指定する場合
    .db CcVolumeEnvelopeAttack
    .dw .volume_attack

.volume_attack
    .db Literal+3,$07,$0A,$0D,Fill+127,$0F,JumpTo,-2
$04 VolumeEnvelopeRelease
  1. volume_envelope_release_address lo
  2. volume_envelope_release_address hi
Release用VolumeEnvelopeのLabel Addressを指定する。
Label以降の記述で、volume_envelope値として使用可能な範囲は0~15.

ex. Release用VolumeEnvelopeを指定する場合
    .db CcVolumeEnvelopeAttack
    .dw .volume_release

.volume_release
    .db Fill+127,$02,JumpTo,-2
$05 DutyEnvelopeAttack
  1. duty_envelope_attack_address lo
  2. duty_envelope_attack_address hi
Attack用DutyEnvelopeのLabel Addressを指定する。
Label以降の記述で、duty_envelope値として使用可能な範囲は0~3.

ex. Attack用DutyEnvelopeを指定する場合
    .db CcDutyEnvelopeAttack
    .dw .duty_attack

.duty_attack
    .db Fill+3,$01,Fill+127,$02,JumpTo,-2
$06 DutyEnvelopeRelease
  1. duty_envelope_release_address lo
  2. duty_envelope_release_address hi
Release用DutyEnvelopeのLabel Addressを指定する。
Label以降の記述で、duty_envelope値として使用可能な範囲は0~3.

ex. Release用DutyEnvelopeを指定する場合
    .db CcDutyEnvelopeRelease
    .dw .duty_release

.duty_release
    .db Fill+127,$03,JumpTo,-2
$07 PitchDetune
  1. pitch_detune (-128~127)
pitch_detune値を指定する。
正の値だと周波数が下がり、負の値だと周波数が上がることに注意。

ex. 周波数を少し下げたい場合
    .db CcPitchDetune,1
$08 PitchEnvelope
  1. pitch_envelope_address lo
  2. pitch_envelope_address hi
PitchEnvelopeのLabel Addressを指定する。
Label以降の記述で、pitch_envelope値として使用可能な範囲は-128~127.
正の値だと周波数が下がり、負の値だと周波数が上がることに注意。

ex. PitchEnvelopeを指定する場合
    .db CcPitchEnvelope
    .dw .pitch

.pitch
    .db Literal+1,-1,Fill+2,0,Literal+1,-1,Fill+2,0,Literal+1,1,Fill+2,0,Literal+1,1,Fill+2,0,JumpTo,-16
$09 PitchEnvelopeDelay
  1. pitch_envelope_delay_time lo
  2. pitch_envelope_delay_time hi
pitch_envelope_delay_timeを指定する。
NoteOn以降、pitch_envelope_delay_time分、PitchEnvelopeの開始を遅延できる。

ex. PitchEnvelopeの開始を付点4分音符分遅延させる場合
    .db CcPitchEnvelopeDelay
    .dw WHOLE_NOTE_LENGTH/2*3/4
$0A NoteTranspose
  1. note_transpose (-95~95)
note_transpose値を指定する。
Keyを変更できる。

ex. Keyを半音下げたい場合
    .db CcNoteTranspose,-1
$0B NoteEnvelopeAbsolute
  1. note_envelope_absolute_address lo
  2. note_envelope_absolute_address hi
絶対NoteEnvelopeのLabel Addressを指定する。
NoteTranspose, PitchEnvelope, PitchDetuneと併用可能。
NoteEnvelopeRelativeとは排他制御であり、NoteEnvelopeAbsolute読込み時にNoteEnvelopeRelative無効となる。
Label以降の記述で、note_envelope値として使用可能な範囲は33~127.
note_envelope値として0を指定すると、NoteOn時のNoteNumberで周波数設定される。

ex. 絶対NoteEnvelopeを指定する場合(Noteの先頭のみKick、その後にBass音を鳴らす)
    .db CcNoteEnvelopeAbsolute
    .dw note_absolute

.note_absolute
    .db Literal+8,72,64,56,52,48,44,40,36,Fill+127,0,JumpTo,-2
$0C NoteEnvelopeRelative
  1. note_envelope_relative_address lo
  2. note_envelope_relative_address hi
相対NoteEnvelopeのLabel Addressを指定する。
NoteTranspose, PitchEnvelope, PitchDetuneと併用可能。
NoteEnvelopeAbsoluteとは排他制御であり、NoteEnvelopeRelative読込み時にNoteEnvelopeAbsolute無効となる。
Label以降の記述で、note_envelope値として使用可能な範囲は-95~95.
note_envelope値は、NoteOn時のNoteNumberに対し相対指定する。

ex. 相対NoteEnvelopeを指定する場合(NoteOn時のNoteNumberをroot音としてmaj7を鳴らす)
    .db CcNoteEnvelopeRelative
    .dw note_relative

.note_relative
    .db Literal+6,0,4,7,11,7,4,JumpTo,-7
$0D JumpWithRepeat
  1. jump_with_repeat_address lo
  2. jump_with_repeat_address hi
  3. jump_repetition (1-255)
Jump先のLabel Addressと繰返し回数を指定する。
Jump先でReturnFromJumpが実行される毎にjump_repetitionが減算され、0になるとJump元に戻る。
無限ループにしたい場合はReturnFromJumpを実効しなければ良い。

ex. 同じフレーズを2回繰返す場合
    .db CcJumpWithRepeat
    .dw .riff
    .db 2

.riff
    .db 42,$7A,42,$7A,42,$7A,42,$7A,42,$7A,42,$7A,40,$7A,40,$7A,CcReturnFromJump
$0E ReturnFromJump
no operand

JumpWithRepeat参照
$0F ReturnFromMacro
no operand

Envelope

Switched Run Length Encoding
Envelopeの記述方法としてSwitched Run Length Encodingを参考にして実装した。
(一般的なSwitched Run Length Encodingとは異なると思われる)
先頭の1Byteでmode(Literal(不連続) or Fill(連続))とlength(modeの対象となるByte数)を指定する。
modeは7bit目で識別される。
下記のように定義されており、ex.に示すように記述することで視認性が上がる。
Literal = 0
Fill = $80
JumpTo
JumpTo = $80で定義してあり、続く1ByteでJump先のアドレスを相対指定できる。(正の値も指定可能)
ただし、Jump先及びEncoded Data長は、EnvelopeのLabel Addressから255Byteまでの範囲におさめる必要がある。

ex. 0,1,2,5,5,5,5,0,1,2,5,5,5,0,1,2...
.encoded_data
    .db Literal+3,0,1,2,Fill+4,5,JumpTo,-6

Note

$20 Rest
$21-$7F Note Number
  1. Note Info (%llllvvvv)
    • l = length number (0-15)
    • v = velocity (0-15)

Macro

$80-$FE Macro
no operand

End of Data

$FF End of Data
no operand