LSDj-like Note Input

Post about feature requests here.
Posts: 28
Joined: Fri May 22, 2015 10:48 am

LSDj-like Note Input

Postby aishi » Fri Jun 19, 2015 8:34 pm

I think it might be really helpful to have the ability to input notes like LSDj where a certain input button (A-button in LSDj) creates a new note, effect letter, or effect number. As you probably already know, but just to rehash, in the case of a note, holding the input button while pressing UP and DOWN changes the octave while RIGHT and LEFT increment and decrement by half-step. The note that initially appears in the case of a new note is the last note you created, while hitting the button on an existing note allows you to simply edit that note. It also previews the sound of each note as you are holding down the input button. This would be extremely helpful for anyone coming from Gameboy land (and also I work similarly in Sibelius), and I think it would be an intuitive way to create/edit/transpose notes. Let me know if you think! Thanks.

User avatar
Posts: 475
Joined: Thu Apr 23, 2015 7:39 pm
Location: Hong Kong SAR

Re: LSDj-like Note Input

Postby HertzDevil » Fri Jun 19, 2015 9:24 pm

Here is a possible solution, using the existing repeat key, which only involves adding a single conditional per event handler:

Code: Select all

void CFamiTrackerView::OnKeyDirUp()
   // this test can be extracted in a way analogous to IsShiftPressed()
   if ((::GetKeyState(theApp.GetSettings()->Keys.iKeyRepeat) & 0x80) == 0x80) {
      // m_pPatternEditor->CancelSelection(); // optional; in LSDj a cursor is equivalent to a singleton selection
   else {

Then repeat similar edits for the other arrow key handlers, using:
  • OnTransposeDecreaseoctave for OnKeyDirDown;
  • OnTransposeIncreasenote for OnKeyDirRight;
  • OnTransposeDecreasenote for OnKeyDirLeft.
Using a switch statement for m_pPatternEditor->GetColumn(), it is further possible to enable the same behaviour even when the cursor lies outside the note columns, in which case OnIncreaseValues() and OnDecreaseValues() could be used.

In the official release, pressing the repeat key does not advance the pattern editor cursor if it is on the note column; therefore nothing else needs to be done since LSDj does not advance the cursor after inputting a note anyway. (Strictly speaking, this happens because bStepDown will never be set if CheckRepeatKey(nChar) returns true in CFamiTrackerView::HandleKeyboardInput(unsigned char); the same goes for inputting an effect with the repeat key.)

It is straightforward to extend this to other LSDj key combinations, however in such a case one should create separate hotkey entries in the accelerator (probably with a configuration item in CSettings::General) or directly in CSettings::Keys.
refactoring 0cc-famitracker

Site Admin
Posts: 112
Joined: Tue Jan 06, 2015 1:25 pm

Re: LSDj-like Note Input

Postby jsr » Thu Jun 25, 2015 8:54 pm

aishi: Would it be enough to provide an option for previewing notes when using the existing transpose commands? That way it would be possible for a user to remap transpose to the directional keys (along with ALT or CTRL for example).

It wouldn't insert new notes or work on effects though so another option would be to provide a mode that mimics that behavior precisely. In that case, what key combination would you prefer?
Famitracker developer

Posts: 28
Joined: Fri May 22, 2015 10:48 am

Re: LSDj-like Note Input

Postby aishi » Fri Jun 26, 2015 7:40 pm

Hey jsr, that would be great to have that option to preview notes while transposing, that way there doesn't need to be an entirely new mode. Could there be a way to have the repeat button create a new note and preview it as well? And if the repeat button is already on a note, just preview it? Or perhaps there can be a new shortcut created for this button since it might interfere with other people's use of the repeat button.