@@ -128,6 +128,7 @@ type |
| 128 |
|
128 |
|
| 129 |
function GetAt(SelectionPos: TSelectionPos): Integer; |
129 |
function GetAt(SelectionPos: TSelectionPos): Integer; |
| 130 |
procedure SetAt(SelectionPos: TSelectionPos; Value: Integer); |
130 |
procedure SetAt(SelectionPos: TSelectionPos; Value: Integer); |
|
|
131 |
procedure IncrementAt(SelectionPos: TSelectionPos; Value: Integer); |
| 131 |
procedure ClearAt(SelectionPos: TSelectionPos); |
132 |
procedure ClearAt(SelectionPos: TSelectionPos); |
| 132 |
|
133 |
|
| 133 |
procedure SelectAll; |
134 |
procedure SelectAll; |
@@ -137,6 +138,7 @@ type |
| 137 |
procedure DoRedo; |
138 |
procedure DoRedo; |
| 138 |
procedure DoRepeatPaste; |
139 |
procedure DoRepeatPaste; |
| 139 |
procedure TransposeSelection(Semitones: Integer); |
140 |
procedure TransposeSelection(Semitones: Integer); |
|
|
141 |
procedure IncrementSelection(Note, Instrument, Volume, EffectCode, EffectParam: Integer); |
| 140 |
procedure InterpolateSelection; |
142 |
procedure InterpolateSelection; |
| 141 |
procedure OpenEffectEditor; |
143 |
procedure OpenEffectEditor; |
| 142 |
|
144 |
|
@@ -574,19 +576,37 @@ begin |
| 574 |
end; |
576 |
end; |
| 575 |
|
577 |
|
| 576 |
procedure TTrackerGrid.TransposeSelection(Semitones: Integer); |
578 |
procedure TTrackerGrid.TransposeSelection(Semitones: Integer); |
|
|
579 |
begin |
|
|
580 |
IncrementSelection(Semitones, 0, 0, 0, 0); |
|
|
581 |
end; |
|
|
582 |
|
|
|
583 |
procedure TTrackerGrid.IncrementSelection(Note, Instrument, Volume, EffectCode, |
|
|
584 |
EffectParam: Integer); |
| 577 |
var |
585 |
var |
| 578 |
C, R: Integer; |
586 |
Pos: TSelectionPos; |
| 579 |
begin |
587 |
begin |
| 580 |
NormalizeCursors; |
588 |
NormalizeCursors; |
| 581 |
|
589 |
|
| 582 |
for R := Cursor.Y to Other.Y do |
590 |
Pos := Cursor; |
| 583 |
for C := Cursor.X to Other.X do |
591 |
|
| 584 |
if Patterns[C]^[R].Note <> NO_NOTE then |
592 |
while Pos.Y <= Other.Y do begin |
| 585 |
Patterns[C]^[R].Note := |
593 |
while Pos <= Other do begin |
| 586 |
EnsureRange(Patterns[C]^[R].Note + Semitones, LOWEST_NOTE, HIGHEST_NOTE); |
594 |
case Pos.SelectedPart of |
|
|
595 |
cpNote: IncrementAt(Pos, Note); |
|
|
596 |
cpInstrument: IncrementAt(Pos, Instrument); |
|
|
597 |
cpVolume: IncrementAt(Pos, Volume); |
|
|
598 |
cpEffectCode: IncrementAt(Pos, EffectCode); |
|
|
599 |
cpEffectParams: IncrementAt(Pos, EffectParam); |
|
|
600 |
end; |
|
|
601 |
IncSelectionPos(Pos); |
|
|
602 |
end; |
|
|
603 |
Inc(Pos.Y); |
|
|
604 |
Pos.X := Cursor.X; |
|
|
605 |
Pos.SelectedPart := Cursor.SelectedPart; |
|
|
606 |
end; |
| 587 |
|
607 |
|
| 588 |
Invalidate; |
608 |
Invalidate; |
| 589 |
SaveUndoState; |
609 |
SaveUndoState |
| 590 |
end; |
610 |
end; |
| 591 |
|
611 |
|
| 592 |
procedure TTrackerGrid.InterpolateSelection; |
612 |
procedure TTrackerGrid.InterpolateSelection; |
@@ -1017,6 +1037,18 @@ begin |
| 1017 |
end; |
1037 |
end; |
| 1018 |
end; |
1038 |
end; |
| 1019 |
|
1039 |
|
|
|
1040 |
procedure TTrackerGrid.IncrementAt(SelectionPos: TSelectionPos; Value: Integer); |
|
|
1041 |
begin |
|
|
1042 |
with Patterns[SelectionPos.X]^[SelectionPos.Y] do |
|
|
1043 |
case SelectionPos.SelectedPart of |
|
|
1044 |
cpNote: Note := EnsureRange(Note+Value, LOWEST_NOTE, HIGHEST_NOTE); |
|
|
1045 |
cpInstrument: Instrument := Max(Instrument+Value, 0); |
|
|
1046 |
cpVolume:; |
|
|
1047 |
cpEffectCode: EffectCode := EnsureRange(EffectCode+Value, $0, $F); |
|
|
1048 |
cpEffectParams: EffectParams.Value := EnsureRange(EffectParams.Value+Value, Low(Byte), High(Byte)); |
|
|
1049 |
end; |
|
|
1050 |
end; |
|
|
1051 |
|
| 1020 |
procedure TTrackerGrid.ClearAt(SelectionPos: TSelectionPos); |
1052 |
procedure TTrackerGrid.ClearAt(SelectionPos: TSelectionPos); |
| 1021 |
begin |
1053 |
begin |
| 1022 |
with Patterns[SelectionPos.X]^[SelectionPos.Y] do |
1054 |
with Patterns[SelectionPos.X]^[SelectionPos.Y] do |