Closed yatli closed 4 years ago
I've implemented quick select in category. Use encoder buttons to jump within the cat. The category name is now displayed and fits 1602 LCD.
I've implemented quick select in category. Use encoder buttons to jump within the cat. The category name is now displayed and fits 1602 LCD.
Cool i'll check this out later tonight.
--
I was thinking that Button 1 should setPage(&grid_page)
Probably should draw_trigs() on PageSelect page to give visual indication that that the trig interfaces can be used.
@yatli
I think we should change encoder[0] range to category size. And encoder[1] range to number of categories.
Can we change encoder behaviour from relative to absolute. I don't see the need here unless I missed something.
Can we change encoder behaviour from relative to absolute. I don't see the need here unless I missed something.
The pages are not numbered consecutively.
Also, for category, the cat id is first determined with the page index of the current page (we only know the page number, not index), so that's also relative.
@jmamma can you revert the display code? It was intended for the legacy displays. I'll be working on a new visual layout tonight for OLED.
Also, for category, the cat id is first determined with the page index of the current page (we only know the page number, not index), so that's also relative.
Right.
Can we still achieve ->
I think we should change encoder[0] range to category size.
And encoder[1] range to number of categories.
The original HD44780 display code is still there. Just change the OLED code.
184 void PageSelectPage::display() {
185 #ifdef OLED_DISPLAY
186 oled_display.clearDisplay();
187 char str[16];
188 oled_display.setCursor(0,0);
189 oled_display.print("Page Select:");
190 get_category_name(page_select, str);
191 oled_display.print(str);
192
193 oled_display.setCursor(0,15);
194 get_page(page_select, str);
195 oled_display.print(str);
196 oled_display.display();
197
198 #else
199 GUI.setLine(GUI.LINE1);
200 char str[16];
201 GUI.put_string_at_fill(0, "Page Select:");
202 get_category_name(page_select, str);
203 GUI.put_string_at(12, str);
204
205 GUI.setLine(GUI.LINE2);
206 get_page(page_select, str);
207 GUI.put_string_at_fill(0, str);
208 #endif
209 }
210
Oh okay, overlooked that one. :)
@jmamma the concept art:
Cool!
I was debating whether or not Popup should be used.
Need to see if it looks too similar to Save/Chain pages.
If using a popup, there's no space for an icon. Thoughts?
If using a popup, there's no space for an icon. Thoughts?
Ah yeah.
Perhaps we go for blank page layout, and try and put the icons in.
Second try:
Better horizontal space utilization. More futuristic. :)
beauty.
I'll cleanup and implement this.
@jmamma it's done.
Cool. ill test now.
We need to decide new button layout for FIle Browser and Menu.
Eliminate the use of Encoder buttons would be ideal.
Save: NO/BACK. Write YES/FORWARD ?
@yatli looks really good. nice job
We need to decide new button layout for FIle Browser and Menu. Eliminate the use of Encoder buttons would be ideal.
Yeah. Let's try and unify the key assignments. The functionalities (and current key):
Also we should consider:
Select entry (Enc push) -> I think we should eliminate encoder button completely where possible.
We probably need some kind of table to help designing the layout. Excel?
I was hoping there was some online tool for this exact purpose.
8011a07
implements my above suggestion.
There is a complication in how you access the SYSTEM MENU, and the Save / Chain pages.
Save/Write pages are opened on BUTTON_RELEASED
System Menu is exited on BUTTON_PRESSED.
When you Exit System menu you immediately trigger a BUTTON RELEASE in the GridPage and open the SAVE page.
Let's try this:
@yatli We're going to need a way of changing tracks from the MC sequencer pages.
Because the Trig interface is active in the PageSelect page it won't be possible to switch tracks unless exiting back to Grid.
I'm thinking [ Shift 2] opens up a track menu with
Thoughts?
Yeah that's what I thought about. One comment is about Clear current track. If it's moved from WRITE to the menu, it'll be a bit harder to invoke, which slows down real time dubbing/clearing workflow.
A workaround is to have the menu "sticky" -- if one selects clear track, the selection is not reset to the first entry when re-entering the menu.
S2 can then be thought of as a reconfigurable key -- by default it does what the user set last time. If last action is clear track, then it stays clear track, until reconfigured with enc2
Current progress:
S1 has a very consistent press-and-hold sense. S2 is mostly ex-menu, or backspace in text edit (could also be a menu, include backspace/clear/case).
The grid page S2+Enc push was "load and edit with seq page", currently commented out. Possible to add an option to re-enable this?
Added: wavd_icon.png loudness_icon.png
improved: lfo_icon.png mixer_icon.png (matches display of mixer page)
Nice work @yatli !
169 if (EVENT_RELEASED(event, Buttons.BUTTON3)) {
170 encoders[0] = &seq_param1;
171 encoders[1] = &seq_param2;
Because we do this, the underlying sequencer page draw_knob() values change as encoders 1 and 2 are rotated when show_seq_menu == true.
If I recall, my solution for GridPage was to hardcode the encoder pointers in the sequencer pages member functions.
Unless there is a better way?
Track Select, offset by 1 so that the number are 1->16.
Also, track select beyond 5 doesn't appear to work
Page Select Icon's are so beautiful 😂
@jmamma I'm burning out. It's still a bit messy, could you help to clean it up a bit?
Will look at it tomorrow. Need to eat dinner and have a few hours of rest.
Thanks for your effort!
Incorrect behaviors:
When operating the menu, it's easy to trigger S2 + ENC3, which is currently change all track length. I'm changing it to WRITE + ENC3.
Cleaning up code, powered by zen inertia. I've no idea what I'm writing but it fixes problems!
It's taking the shape now. I'll leave the stubs (copy, paste etc.) to you.
ALL DONE
I've compiled the current key assignment table:
It's in the second sheet in the excel link.
@yatli
I'm wondering if SoundBrowser should be moved from PageSelect in to TrackMenu. Kind of makes more sense as it is related to the current track.
Thoughts?
TrackMenu vs GridSlotMenu
Different behaviour relating to clear / copy / paste
In grid slot Menu.
Clear: [ -- , YES ]
Copy: [ -- , YES ]
Paste: [ -- , YES ]
When you close the menu options revert back to --
Where as Track Menu
Clear: [ TRK , ALL ]
Copy: [ TRK, ALL ]
Paste: [ TRK, ALL ]
The side effect of this is that when you open up the track menu, it may already be positioned over Clear, and releasing the button may clear your track or all your tracks unintentionally.
Should we use the GridSlotMenu method? Or should we use the TrackMenu method, but add a confirmation dialog box?
The other option is to reset menu item position to "Track Select", but this feels weird and slows down workflow imo.
Should we use the GridSlotMenu method? Or should we use the TrackMenu method, but add a confirmation dialog box?
I prefer GridSlotMenu method. As an extra safety guard, we can implement undo in another PR.
I'm wondering if SoundBrowser should be moved from PageSelect in to TrackMenu.
Hmm. Considering the workflow, when editing the patch MC automatically exits to the GRID. If the sound browser is activated via TrackMenu, then it's going to either pull an untouched MD patch, or, go from GRID -> Seq -> TrackMenu
Put it in the GridMenu maybe?
@yatli copy/paste is working for MDTracks*
I decided to re-use MCLClipboard. Means the copied tracks are not stored in RAM but on the SDCard.
give it a test when you have some time.
Left Right shifting is working, but parameter locks are not being copied correctly.
Anything obvious here:
519 void MDSeqTrack::rotate_right() {
520
521 ROTATE_RIGHT(lock_mask, length);
522 ROTATE_RIGHT(pattern_mask, length);
523 ROTATE_RIGHT(oneshot_mask, length);
524
525 int8_t new_pos = 0;
526
527 MDSeqTrackData temp_data;
528
529 memcpy(&temp_data, this, sizeof(MDSeqTrackData));
530
531 for (uint8_t n = 0; n < length; n++) {
532 if (n == length - 1) { new_pos = 0; }
533 else { new_pos = n + 1; }
534 memcpy(&locks[0][new_pos], &(temp_data.locks[0][n]), NUM_MD_LOCKS);
535 conditional[new_pos] = temp_data.conditional[n];
536 timing[new_pos] = temp_data.timing[n];
537 }
538
539 }
@yatli ?
ah memcpy won't work. because of the array order.
@yatli the last commit implements what I had in mind for pageselect changes.
Split the 16 triggers in to 4 groups
Trigs [0 - 3]
Trigs [4 - 7 ]
Trigs [8 - 13]
Trigs [14 - 15]
--
I've started disabling Encoder[1-4] buttons for exiting to GridPage. Shift 2 now becomes page select in all relevant pages.
Care needs to be taken when switching pages whether to disable then re-enable the trigger interface.
I need to work out the details here. It might not be worth disabling the Trig interface if it's to be re-enabled immediately on the next page load. If the trig interface is to be disabled then the Global Settings may need to be retransmitted to make sure the Audio routing is consistent across the two globals if a routing change has occurred. Some juggling needs to be performed here as transmitting globals can cause brief sequencer dropout.