Subversion Repositories svn.mios32

Rev

Rev 2263 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
406 tk 1
// $Id: seq_ui_midi.c 2659 2019-01-13 14:17:46Z tk $
2
/*
3
 * MIDI configuration page
4
 *
5
 * ==========================================================================
6
 *
7
 *  Copyright (C) 2008 Thorsten Klose (tk@midibox.org)
8
 *  Licensed for personal non-commercial use only.
9
 *  All other rights reserved.
10
 *
11
 * ==========================================================================
12
 */
13
 
14
/////////////////////////////////////////////////////////////////////////////
15
// Include files
16
/////////////////////////////////////////////////////////////////////////////
17
 
18
#include <mios32.h>
2263 tk 19
#include <blm_scalar_master.h>
406 tk 20
#include "tasks.h"
21
 
22
#include "seq_lcd.h"
23
#include "seq_ui.h"
24
 
1123 tk 25
#include "seq_file.h"
406 tk 26
#include "seq_file_c.h"
1052 tk 27
#include "seq_file_gc.h"
406 tk 28
 
29
#include "seq_midi_in.h"
30
#include "seq_midi_router.h"
31
#include "seq_midi_port.h"
32
#include "seq_bpm.h"
1020 tk 33
#include "seq_blm.h"
406 tk 34
 
35
 
36
/////////////////////////////////////////////////////////////////////////////
37
// Local definitions
38
/////////////////////////////////////////////////////////////////////////////
39
 
826 tk 40
#define SUBPAGE_TRANSPOSE  0
41
#define SUBPAGE_SECTIONS   1
42
#define SUBPAGE_ROUTER     2
1675 tk 43
#define SUBPAGE_EXT_CTRL   3
44
#define SUBPAGE_MISC       4
406 tk 45
 
46
 
826 tk 47
 
1794 tk 48
#define NUM_OF_ITEMS       27
826 tk 49
 
50
// Transpose
1023 tk 51
#define ITEM_IN_BUS        0
52
#define ITEM_IN_PORT       1
53
#define ITEM_IN_CHN        2
54
#define ITEM_IN_LOWER      3
55
#define ITEM_IN_UPPER      4
56
#define ITEM_IN_MODE       5
57
#define ITEM_RESET_STACKS  6
826 tk 58
 
59
// Sections
1023 tk 60
#define ITEM_S_PORT        7
61
#define ITEM_S_CHN         8
62
#define ITEM_S_OCT_G1      9
63
#define ITEM_S_OCT_G2      10
64
#define ITEM_S_OCT_G3      11
65
#define ITEM_S_OCT_G4      12
66
#define ITEM_S_FWD_PORT    13
67
#define ITEM_S_RESET_STACKS 14
826 tk 68
 
69
// MIDI Router
1023 tk 70
#define ITEM_R_NODE        15
71
#define ITEM_R_SRC_PORT    16
72
#define ITEM_R_SRC_CHN     17
73
#define ITEM_R_DST_PORT    18
74
#define ITEM_R_DST_CHN     19
75
#define ITEM_DEF_PORT      20
826 tk 76
 
1675 tk 77
// Ext. Ctrl
78
#define ITEM_EXT_PORT      21
1794 tk 79
#define ITEM_EXT_PORT_OUT  22
80
#define ITEM_EXT_CHN       23
81
#define ITEM_EXT_CTRL      24
82
#define ITEM_EXT_VALUE     25
1675 tk 83
 
826 tk 84
// Misc
1794 tk 85
#define ITEM_BLM_SCALAR_PORT 26
826 tk 86
 
87
 
406 tk 88
/////////////////////////////////////////////////////////////////////////////
89
// Local variables
90
/////////////////////////////////////////////////////////////////////////////
91
 
826 tk 92
static u8 selected_subpage = SUBPAGE_TRANSPOSE;
599 tk 93
static u8 selected_router_node = 0;
1023 tk 94
static u8 selected_bus = 0;
1675 tk 95
static u8 selected_ext_ctrl = 0;
406 tk 96
 
97
 
98
/////////////////////////////////////////////////////////////////////////////
99
// Local LED handler function
100
/////////////////////////////////////////////////////////////////////////////
101
static s32 LED_Handler(u16 *gp_leds)
102
{
103
  if( ui_cursor_flash ) // if flashing flag active: no LED flag set
104
    return 0;
105
 
1675 tk 106
  if( selected_subpage <= 5 ) {
107
    const u8 select_led_pattern[5] = { 0x03, 0x0c, 0x30, 0x40, 0x80 };
108
    *gp_leds = (u16)select_led_pattern[selected_subpage];
109
  }
826 tk 110
 
111
  switch( selected_subpage ) {
112
    case SUBPAGE_TRANSPOSE:
113
      switch( ui_selected_item ) {
1023 tk 114
        case ITEM_IN_BUS: *gp_leds |= 0x0100; break;
115
        case ITEM_IN_PORT: *gp_leds |= 0x0200; break;
116
        case ITEM_IN_CHN: *gp_leds |= 0x0400; break;
117
        case ITEM_IN_LOWER: *gp_leds |= 0x0800; break;
118
        case ITEM_IN_UPPER: *gp_leds |= 0x1000; break;
119
        case ITEM_IN_MODE: *gp_leds |= 0x2000; break;
826 tk 120
        case ITEM_RESET_STACKS: *gp_leds |= 0x8000; break;
121
      }
122
      break;
123
 
124
    case SUBPAGE_SECTIONS:
125
      switch( ui_selected_item ) {
126
        case ITEM_S_PORT: *gp_leds |= 0x0100; break;
127
        case ITEM_S_CHN: *gp_leds |= 0x0200; break;
128
        case ITEM_S_OCT_G1: *gp_leds |= 0x0400; break;
129
        case ITEM_S_OCT_G2: *gp_leds |= 0x0800; break;
130
        case ITEM_S_OCT_G3: *gp_leds |= 0x1000; break;
131
        case ITEM_S_OCT_G4: *gp_leds |= 0x2000; break;
848 tk 132
        case ITEM_S_FWD_PORT: *gp_leds |= 0x4000; break;
826 tk 133
        case ITEM_S_RESET_STACKS: *gp_leds |= 0x8000; break;
134
      }
135
      break;
136
 
137
    case SUBPAGE_ROUTER:
138
      switch( ui_selected_item ) {
139
        case ITEM_R_NODE: *gp_leds |= 0x0100; break;
140
        case ITEM_R_SRC_PORT: *gp_leds |= 0x0200; break;
141
        case ITEM_R_SRC_CHN: *gp_leds |= 0x0400; break;
142
        case ITEM_R_DST_PORT: *gp_leds |= 0x0800; break;
143
        case ITEM_R_DST_CHN: *gp_leds |= 0x1000; break;
144
        case ITEM_DEF_PORT: *gp_leds |= 0xc000; break;
145
      }
146
      break;
147
 
1675 tk 148
    case SUBPAGE_EXT_CTRL:
149
      switch( ui_selected_item ) {
1794 tk 150
        case ITEM_EXT_PORT:     *gp_leds |= 0x0100; break;
151
        case ITEM_EXT_PORT_OUT: *gp_leds |= 0x0200; break;
152
        case ITEM_EXT_CHN:      *gp_leds |= 0x0400; break;
153
        case ITEM_EXT_CTRL:     *gp_leds |= 0x3800; break;
154
        case ITEM_EXT_VALUE:    *gp_leds |= 0x4000; break;
1675 tk 155
      }
156
      break;
157
 
826 tk 158
    case SUBPAGE_MISC:
159
      switch( ui_selected_item ) {
160
        case ITEM_BLM_SCALAR_PORT: *gp_leds |= 0x0300; break;
161
      }
162
      break;
406 tk 163
  }
164
 
165
  return 0; // no error
166
}
167
 
168
 
826 tk 169
 
406 tk 170
/////////////////////////////////////////////////////////////////////////////
826 tk 171
// Help function
172
/////////////////////////////////////////////////////////////////////////////
173
static s32 SetSubpageBasedOnItem(u8 item)
174
{
175
  if( item <= ITEM_RESET_STACKS )
176
    selected_subpage = SUBPAGE_TRANSPOSE;
177
  else if( item <= ITEM_S_RESET_STACKS )
178
    selected_subpage = SUBPAGE_SECTIONS;
179
  else if( item <= ITEM_DEF_PORT )
180
    selected_subpage = SUBPAGE_ROUTER;
1675 tk 181
  else if( item <= ITEM_EXT_VALUE )
182
    selected_subpage = SUBPAGE_EXT_CTRL;
826 tk 183
  else
184
    selected_subpage = SUBPAGE_MISC;
185
 
186
  return 0; // no error
187
}
188
 
189
 
190
/////////////////////////////////////////////////////////////////////////////
406 tk 191
// Local encoder callback function
192
// Should return:
193
//   1 if value has been changed
194
//   0 if value hasn't been changed
195
//  -1 if invalid or unsupported encoder
196
/////////////////////////////////////////////////////////////////////////////
197
static s32 Encoder_Handler(seq_ui_encoder_t encoder, s32 incrementer)
198
{
199
  seq_midi_router_node_t *n = &seq_midi_router_node[selected_router_node];
200
 
826 tk 201
  if( encoder <= SEQ_UI_ENCODER_GP8 ) {
1675 tk 202
    switch( encoder ) {
203
    case SEQ_UI_ENCODER_GP1:
204
    case SEQ_UI_ENCODER_GP2:
205
      selected_subpage = SUBPAGE_TRANSPOSE;
206
      ui_selected_item = ITEM_IN_BUS;
207
      break;
406 tk 208
 
1675 tk 209
    case SEQ_UI_ENCODER_GP3:
210
    case SEQ_UI_ENCODER_GP4:
211
      selected_subpage = SUBPAGE_SECTIONS;
212
      ui_selected_item = ITEM_S_PORT;
213
      break;
406 tk 214
 
1675 tk 215
    case SEQ_UI_ENCODER_GP5:
216
    case SEQ_UI_ENCODER_GP6:
217
      selected_subpage = SUBPAGE_ROUTER;
218
      ui_selected_item = ITEM_R_NODE;
219
      break;
406 tk 220
 
1675 tk 221
    case SEQ_UI_ENCODER_GP7:
222
      selected_subpage = SUBPAGE_EXT_CTRL;
223
      ui_selected_item = ITEM_EXT_PORT;
224
      break;
225
 
226
    default:
227
      selected_subpage = SUBPAGE_MISC;
228
      ui_selected_item = ITEM_BLM_SCALAR_PORT;
826 tk 229
    }
1675 tk 230
 
826 tk 231
    return 1;
232
  }
406 tk 233
 
826 tk 234
  switch( selected_subpage ) {
235
    case SUBPAGE_TRANSPOSE:
236
      switch( encoder ) {
237
        case SEQ_UI_ENCODER_GP9:
1023 tk 238
      ui_selected_item = ITEM_IN_BUS;
239
      break;
240
 
241
        case SEQ_UI_ENCODER_GP10:
826 tk 242
      ui_selected_item = ITEM_IN_PORT;
243
      break;
406 tk 244
 
1023 tk 245
        case SEQ_UI_ENCODER_GP11:
826 tk 246
      ui_selected_item = ITEM_IN_CHN;
247
      break;
406 tk 248
 
826 tk 249
        case SEQ_UI_ENCODER_GP12:
1023 tk 250
      ui_selected_item = ITEM_IN_LOWER;
826 tk 251
      break;
252
 
253
        case SEQ_UI_ENCODER_GP13:
1023 tk 254
      ui_selected_item = ITEM_IN_UPPER;
255
      break;
256
 
826 tk 257
        case SEQ_UI_ENCODER_GP14:
1023 tk 258
      ui_selected_item = ITEM_IN_MODE;
826 tk 259
      break;
260
 
261
        case SEQ_UI_ENCODER_GP15:
262
      return -1; // not mapped
263
 
264
        case SEQ_UI_ENCODER_GP16:
265
      ui_selected_item = ITEM_RESET_STACKS;
266
      break;
267
      }
406 tk 268
      break;
269
 
826 tk 270
    case SUBPAGE_SECTIONS:
271
      switch( encoder ) {
272
        case SEQ_UI_ENCODER_GP9:
273
      ui_selected_item = ITEM_S_PORT;
274
      break;
275
 
276
        case SEQ_UI_ENCODER_GP10:
277
      ui_selected_item = ITEM_S_CHN;
278
      break;
279
 
280
        case SEQ_UI_ENCODER_GP11:
281
      ui_selected_item = ITEM_S_OCT_G1;
282
      break;
283
 
284
        case SEQ_UI_ENCODER_GP12:
285
      ui_selected_item = ITEM_S_OCT_G2;
286
      break;
287
 
288
        case SEQ_UI_ENCODER_GP13:
289
      ui_selected_item = ITEM_S_OCT_G3;
290
      break;
291
 
292
        case SEQ_UI_ENCODER_GP14:
293
      ui_selected_item = ITEM_S_OCT_G4;
294
      break;
295
 
296
        case SEQ_UI_ENCODER_GP15:
848 tk 297
      ui_selected_item = ITEM_S_FWD_PORT;
298
      break;
826 tk 299
 
300
        case SEQ_UI_ENCODER_GP16:
301
      ui_selected_item = ITEM_S_RESET_STACKS;
302
      break;
303
      }
406 tk 304
      break;
305
 
826 tk 306
    case SUBPAGE_ROUTER:
307
      switch( encoder ) {
308
        case SEQ_UI_ENCODER_GP9:
309
      ui_selected_item = ITEM_R_NODE;
310
      break;
311
 
312
        case SEQ_UI_ENCODER_GP10:
313
      ui_selected_item = ITEM_R_SRC_PORT;
314
      break;
315
 
316
        case SEQ_UI_ENCODER_GP11:
317
      ui_selected_item = ITEM_R_SRC_CHN;
318
      break;
319
 
320
        case SEQ_UI_ENCODER_GP12:
321
      ui_selected_item = ITEM_R_DST_PORT;
322
      break;
323
 
324
        case SEQ_UI_ENCODER_GP13:
325
      ui_selected_item = ITEM_R_DST_CHN;
326
      break;
327
 
328
        case SEQ_UI_ENCODER_GP14:
329
      return -1; // not used (yet)
330
 
331
        case SEQ_UI_ENCODER_GP15:
332
        case SEQ_UI_ENCODER_GP16:
333
      ui_selected_item = ITEM_DEF_PORT;
334
      break;
335
      }
406 tk 336
      break;
337
 
1675 tk 338
    case SUBPAGE_EXT_CTRL:
339
      switch( encoder ) {
340
        case SEQ_UI_ENCODER_GP9:
341
      ui_selected_item = ITEM_EXT_PORT;
342
      break;
343
 
344
        case SEQ_UI_ENCODER_GP10:
1794 tk 345
      ui_selected_item = ITEM_EXT_PORT_OUT;
1675 tk 346
      break;
347
 
348
        case SEQ_UI_ENCODER_GP11:
1794 tk 349
      ui_selected_item = ITEM_EXT_CHN;
350
      break;
1675 tk 351
 
352
        case SEQ_UI_ENCODER_GP12:
353
        case SEQ_UI_ENCODER_GP13:
354
        case SEQ_UI_ENCODER_GP14:
355
      ui_selected_item = ITEM_EXT_CTRL;
356
      break;
357
 
358
        case SEQ_UI_ENCODER_GP15:
359
        case SEQ_UI_ENCODER_GP16:
360
      ui_selected_item = ITEM_EXT_VALUE;
361
      break;
362
      }
363
      break;
364
 
826 tk 365
    case SUBPAGE_MISC:
366
      switch( encoder ) {
367
        case SEQ_UI_ENCODER_GP9:
368
        case SEQ_UI_ENCODER_GP10:
369
      ui_selected_item = ITEM_BLM_SCALAR_PORT;
370
      break;
371
 
372
        case SEQ_UI_ENCODER_GP11:
373
        case SEQ_UI_ENCODER_GP12:
374
        case SEQ_UI_ENCODER_GP13:
375
        case SEQ_UI_ENCODER_GP14:
376
      return -1; // not used (yet)
377
 
378
        case SEQ_UI_ENCODER_GP15:
379
        case SEQ_UI_ENCODER_GP16:
380
      // enter midi monitor page
381
      SEQ_UI_PageSet(SEQ_UI_PAGE_MIDIMON);
382
      return 1;
383
      }
406 tk 384
      break;
385
 
826 tk 386
    default:
387
      return -1; // unsupported subpage
406 tk 388
  }
389
 
390
  // for GP encoders and Datawheel
391
  switch( ui_selected_item ) {
1023 tk 392
    case ITEM_IN_BUS: {
393
      if( SEQ_UI_Var8_Inc(&selected_bus, 0, SEQ_MIDI_IN_NUM_BUSSES-1, incrementer) >= 0 ) {
394
    return 1; // value changed
395
      }
396
      return 0; // no change
397
    } break;
398
 
406 tk 399
    case ITEM_IN_PORT: {
1023 tk 400
      u8 port_ix = SEQ_MIDI_PORT_InIxGet(seq_midi_in_port[selected_bus]);
2659 tk 401
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_InNumGet()-1, incrementer) >= 0 ) {
1023 tk 402
    seq_midi_in_port[selected_bus] = SEQ_MIDI_PORT_InPortGet(port_ix);
2102 tk 403
    ui_store_file_required = 1;
406 tk 404
    return 1; // value changed
405
      }
406
      return 0; // no change
407
    } break;
408
 
409
    case ITEM_IN_CHN:
2150 tk 410
      if( SEQ_UI_Var8_Inc(&seq_midi_in_channel[selected_bus], 0, 17, incrementer) >= 0 ) {
2102 tk 411
    ui_store_file_required = 1;
513 tk 412
    return 1; // value changed
413
      }
414
      return 0; // no change
406 tk 415
 
1023 tk 416
    case ITEM_IN_LOWER:
417
      if( SEQ_UI_Var8_Inc(&seq_midi_in_lower[selected_bus], 0, 127, incrementer) >= 0 ) {
2102 tk 418
    ui_store_file_required = 1;
1023 tk 419
    return 1; // value changed
420
      }
421
      return 0; // no change
406 tk 422
 
1023 tk 423
    case ITEM_IN_UPPER:
424
      if( SEQ_UI_Var8_Inc(&seq_midi_in_upper[selected_bus], 0, 127, incrementer) >= 0 ) {
2102 tk 425
    ui_store_file_required = 1;
406 tk 426
    return 1; // value changed
427
      }
428
      return 0; // no change
1023 tk 429
 
430
    case ITEM_IN_MODE: {
431
      u8 fwd = seq_midi_in_options[selected_bus].MODE_PLAY;
2150 tk 432
      if( incrementer == 0 )
433
    incrementer = fwd ? -1 : 1;
1023 tk 434
      if( SEQ_UI_Var8_Inc(&fwd, 0, 1, incrementer) >= 0 ) {
435
    seq_midi_in_options[selected_bus].MODE_PLAY = fwd;
2102 tk 436
    ui_store_file_required = 1;
1023 tk 437
    return 1; // value changed
438
      }
439
      return 0; // no change
406 tk 440
    } break;
441
 
826 tk 442
    case ITEM_RESET_STACKS: {
443
      SEQ_MIDI_IN_ResetTransArpStacks();
444
      SEQ_UI_Msg(SEQ_UI_MSG_USER_R, 2000, "Transposer/Arp.", "Stacks cleared!");
1794 tk 445
 
446
      // send to external
1806 tk 447
      SEQ_MIDI_IN_ExtCtrlSend(SEQ_MIDI_IN_EXT_CTRL_ALL_NOTES_OFF, 127, 0);
1794 tk 448
 
826 tk 449
      return 1;
450
    } break;
451
 
452
 
453
    case ITEM_S_PORT: {
454
      u8 port_ix = SEQ_MIDI_PORT_InIxGet(seq_midi_in_sect_port);
455
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_InNumGet()-1, incrementer) >= 0 ) {
456
    seq_midi_in_sect_port = SEQ_MIDI_PORT_InPortGet(port_ix);
2102 tk 457
    ui_store_file_required = 1;
826 tk 458
    return 1; // value changed
459
      }
460
      return 0; // no change
461
    } break;
462
 
463
    case ITEM_S_CHN:
464
      if( SEQ_UI_Var8_Inc(&seq_midi_in_sect_channel, 0, 16, incrementer) >= 0 ) {
2102 tk 465
    ui_store_file_required = 1;
826 tk 466
    return 1; // value changed
467
      }
468
      return 0; // no change
469
 
470
 
471
    case ITEM_S_OCT_G1: {
472
      u8 oct = seq_midi_in_sect_note[0] / 12;
473
      if( SEQ_UI_Var8_Inc(&oct, 0, 11, incrementer) >= 0 ) {
474
    seq_midi_in_sect_note[0] = 12*oct;
2102 tk 475
    ui_store_file_required = 1;
826 tk 476
    return 1; // value changed
477
      }
478
      return 0; // no change
479
    } break;
480
 
481
    case ITEM_S_OCT_G2: {
482
      u8 oct = seq_midi_in_sect_note[1] / 12;
483
      if( SEQ_UI_Var8_Inc(&oct, 0, 11, incrementer) >= 0 ) {
484
    seq_midi_in_sect_note[1] = 12*oct;
2102 tk 485
    ui_store_file_required = 1;
826 tk 486
    return 1; // value changed
487
      }
488
      return 0; // no change
489
    } break;
490
 
491
    case ITEM_S_OCT_G3: {
492
      u8 oct = seq_midi_in_sect_note[2] / 12;
493
      if( SEQ_UI_Var8_Inc(&oct, 0, 11, incrementer) >= 0 ) {
494
    seq_midi_in_sect_note[2] = 12*oct;
2102 tk 495
    ui_store_file_required = 1;
826 tk 496
    return 1; // value changed
497
      }
498
      return 0; // no change
499
    } break;
500
 
501
    case ITEM_S_OCT_G4: {
502
      u8 oct = seq_midi_in_sect_note[3] / 12;
503
      if( SEQ_UI_Var8_Inc(&oct, 0, 11, incrementer) >= 0 ) {
504
    seq_midi_in_sect_note[3] = 12*oct;
2102 tk 505
    ui_store_file_required = 1;
826 tk 506
    return 1; // value changed
507
      }
508
      return 0; // no change
509
    } break;
510
 
848 tk 511
    case ITEM_S_FWD_PORT: {
512
      u8 port_ix = SEQ_MIDI_PORT_OutIxGet(seq_midi_in_sect_fwd_port);
513
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_OutNumGet()-1, incrementer) >= 0 ) {
514
    seq_midi_in_sect_fwd_port = SEQ_MIDI_PORT_OutPortGet(port_ix);
2102 tk 515
    ui_store_file_required = 1;
848 tk 516
    return 1; // value changed
517
      }
518
      return 0; // no change
519
    } break;
520
 
826 tk 521
    case ITEM_S_RESET_STACKS: {
522
      SEQ_MIDI_IN_ResetChangerStacks();
523
      SEQ_UI_Msg(SEQ_UI_MSG_USER_R, 2000, "Section Changer", "Stacks cleared!");
1794 tk 524
 
525
      // send to external
1806 tk 526
      SEQ_MIDI_IN_ExtCtrlSend(SEQ_MIDI_IN_EXT_CTRL_ALL_NOTES_OFF, 127, 0);
1794 tk 527
 
826 tk 528
      return 1;
529
    } break;
530
 
531
 
532
 
406 tk 533
    case ITEM_R_NODE:
513 tk 534
      if( SEQ_UI_Var8_Inc(&selected_router_node, 0, SEQ_MIDI_ROUTER_NUM_NODES-1, incrementer) >= 0 ) {
2102 tk 535
    ui_store_file_required = 1;
513 tk 536
    return 1; // value changed
537
      }
538
      return 0; // no change
406 tk 539
 
540
    case ITEM_R_SRC_PORT: {
541
      u8 port_ix = SEQ_MIDI_PORT_InIxGet(n->src_port);
542
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_InNumGet()-1, incrementer) >= 0 ) {
543
    n->src_port = SEQ_MIDI_PORT_InPortGet(port_ix);
2102 tk 544
    ui_store_file_required = 1;
406 tk 545
    return 1; // value changed
546
      }
547
      return 0; // no change
548
    } break;
549
 
550
    case ITEM_R_SRC_CHN:
513 tk 551
      if( SEQ_UI_Var8_Inc(&n->src_chn, 0, 17, incrementer) >= 0 ) {
2102 tk 552
    ui_store_file_required = 1;
513 tk 553
    return 1; // value changed
554
      }
555
      return 0; // no change
406 tk 556
 
557
    case ITEM_R_DST_PORT: {
558
      u8 port_ix = SEQ_MIDI_PORT_OutIxGet(n->dst_port);
559
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_OutNumGet()-1, incrementer) >= 0 ) {
560
    n->dst_port = SEQ_MIDI_PORT_OutPortGet(port_ix);
2102 tk 561
    ui_store_file_required = 1;
406 tk 562
    return 1; // value changed
563
      }
564
      return 0; // no change
565
    } break;
566
 
567
    case ITEM_R_DST_CHN:
1746 tk 568
      if( SEQ_UI_Var8_Inc(&n->dst_chn, 0, 19, incrementer) >= 0 ) {
2102 tk 569
    ui_store_file_required = 1;
513 tk 570
    return 1; // value changed
571
      }
572
      return 0; // no change
826 tk 573
 
574
 
575
    case ITEM_DEF_PORT: {
576
      u8 port_ix = SEQ_MIDI_PORT_OutIxGet(MIOS32_MIDI_DefaultPortGet());
577
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_OutNumGet()-1, incrementer) >= 0 ) {
578
    MIOS32_MIDI_DefaultPortSet(SEQ_MIDI_PORT_OutPortGet(port_ix));
2102 tk 579
    ui_store_file_required = 1;
826 tk 580
    return 1; // value changed
581
      }
582
      return 0; // no change
583
    } break;
584
 
1675 tk 585
    case ITEM_EXT_PORT: {
1816 tk 586
      u8 numPorts = SEQ_MIDI_PORT_InNumGet();
587
      u8 port_ix = (seq_midi_in_ext_ctrl_port == 0xff) ? numPorts : SEQ_MIDI_PORT_InIxGet(seq_midi_in_ext_ctrl_port);
588
      if( SEQ_UI_Var8_Inc(&port_ix, 0, numPorts, incrementer) >= 0 ) {
589
    seq_midi_in_ext_ctrl_port = (port_ix == numPorts) ? 0xff : SEQ_MIDI_PORT_InPortGet(port_ix);
2102 tk 590
    ui_store_file_required = 1;
1675 tk 591
    return 1; // value changed
592
      }
593
      return 0; // no change
594
    } break;
826 tk 595
 
1794 tk 596
    case ITEM_EXT_PORT_OUT: {
597
      u8 port_ix = SEQ_MIDI_PORT_OutIxGet(seq_midi_in_ext_ctrl_out_port);
598
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_OutNumGet()-1, incrementer) >= 0 ) {
599
    seq_midi_in_ext_ctrl_out_port = SEQ_MIDI_PORT_OutPortGet(port_ix);
2102 tk 600
    ui_store_file_required = 1;
1794 tk 601
    return 1; // value changed
602
      }
603
      return 0; // no change
604
    } break;
605
 
1675 tk 606
    case ITEM_EXT_CHN:
607
      if( SEQ_UI_Var8_Inc(&seq_midi_in_ext_ctrl_channel, 0, 16, incrementer) >= 0 ) {
2102 tk 608
    ui_store_file_required = 1;
1675 tk 609
    return 1; // value changed
610
      }
611
      return 0; // no change
612
 
613
    case ITEM_EXT_CTRL:
614
      if( SEQ_UI_Var8_Inc(&selected_ext_ctrl, 0, SEQ_MIDI_IN_EXT_CTRL_NUM-1, incrementer) >= 0 ) {
2102 tk 615
    ui_store_file_required = 1;
1675 tk 616
    return 1; // value changed
617
      }
618
      return 0; // no change
619
 
620
    case ITEM_EXT_VALUE:
621
      if( selected_ext_ctrl == SEQ_MIDI_IN_EXT_CTRL_NRPN_ENABLED ) {
622
    if( SEQ_UI_Var8_Inc(&seq_midi_in_ext_ctrl_asg[selected_ext_ctrl], 0, 1, incrementer) >= 0 ) {
2102 tk 623
      ui_store_file_required = 1;
1675 tk 624
      return 1; // value changed
625
    }
626
      } else if( selected_ext_ctrl == SEQ_MIDI_IN_EXT_CTRL_PC_MODE ) {
627
    if( SEQ_UI_Var8_Inc(&seq_midi_in_ext_ctrl_asg[selected_ext_ctrl], 0, SEQ_MIDI_IN_EXT_CTRL_PC_MODE_NUM-1, incrementer) >= 0 ) {
2102 tk 628
      ui_store_file_required = 1;
1675 tk 629
      return 1; // value changed
630
    }
631
      } else if( selected_ext_ctrl <= SEQ_MIDI_IN_EXT_CTRL_NUM ) {
632
    if( SEQ_UI_Var8_Inc(&seq_midi_in_ext_ctrl_asg[selected_ext_ctrl], 0, 128, incrementer) >= 0 ) {
2102 tk 633
      ui_store_file_required = 1;
1675 tk 634
      return 1; // value changed
635
    }
636
      }
637
      return 0; // no change
638
 
826 tk 639
    case ITEM_BLM_SCALAR_PORT: {
2263 tk 640
      u8 port_ix = SEQ_MIDI_PORT_InIxGet(BLM_SCALAR_MASTER_MIDI_PortGet(0));
826 tk 641
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_InNumGet()-1, incrementer) >= 0 ) {
2263 tk 642
    BLM_SCALAR_MASTER_MIDI_PortSet(0, SEQ_MIDI_PORT_InPortGet(port_ix));
826 tk 643
    MUTEX_MIDIOUT_TAKE;
2263 tk 644
    BLM_SCALAR_MASTER_TimeoutCtrSet(0, 0); // fake timeout (so that "BLM not found" message will be displayed)
645
    BLM_SCALAR_MASTER_SendRequest(0, 0x00); // request layout from BLM_SCALAR
826 tk 646
    MUTEX_MIDIOUT_GIVE;
2102 tk 647
    ui_store_file_required = 1;
826 tk 648
    return 1; // value changed
649
      }
650
      return 0; // no change
651
    } break;
406 tk 652
  }
653
 
654
  return -1; // invalid or unsupported encoder
655
}
656
 
657
 
658
/////////////////////////////////////////////////////////////////////////////
659
// Local button callback function
660
// Should return:
661
//   1 if value has been changed
662
//   0 if value hasn't been changed
663
//  -1 if invalid or unsupported button
664
/////////////////////////////////////////////////////////////////////////////
665
static s32 Button_Handler(seq_ui_button_t button, s32 depressed)
666
{
667
  if( depressed ) return 0; // ignore when button depressed
668
 
669
#if 0
670
  // leads to: comparison is always true due to limited range of data type
671
  if( button >= SEQ_UI_BUTTON_GP1 && button <= SEQ_UI_BUTTON_GP16 ) {
672
#else
673
  if( button <= SEQ_UI_BUTTON_GP16 ) {
674
#endif
416 tk 675
    // re-use encoder handler - only select UI item, don't increment, flags will be toggled
676
    return Encoder_Handler((int)button, 0);
406 tk 677
  }
678
 
679
  // remaining buttons:
680
  switch( button ) {
681
    case SEQ_UI_BUTTON_Select:
682
    case SEQ_UI_BUTTON_Right:
683
      if( ++ui_selected_item >= NUM_OF_ITEMS )
684
    ui_selected_item = 0;
826 tk 685
      SetSubpageBasedOnItem(ui_selected_item);
406 tk 686
      return 1; // value always changed
687
 
688
    case SEQ_UI_BUTTON_Left:
689
      if( ui_selected_item == 0 )
690
    ui_selected_item = NUM_OF_ITEMS-1;
1142 tk 691
      else
692
    --ui_selected_item;
826 tk 693
      SetSubpageBasedOnItem(ui_selected_item);
406 tk 694
      return 1; // value always changed
695
 
696
    case SEQ_UI_BUTTON_Up:
697
      return Encoder_Handler(SEQ_UI_ENCODER_Datawheel, 1);
698
 
699
    case SEQ_UI_BUTTON_Down:
700
      return Encoder_Handler(SEQ_UI_ENCODER_Datawheel, -1);
701
  }
702
 
703
  return -1; // invalid or unsupported button
704
}
705
 
706
 
707
/////////////////////////////////////////////////////////////////////////////
708
// Local Display Handler function
709
// IN: <high_prio>: if set, a high-priority LCD update is requested
710
/////////////////////////////////////////////////////////////////////////////
711
static s32 LCD_Handler(u8 high_prio)
712
{
713
  if( high_prio )
714
    return 0; // there are no high-priority updates
715
 
716
  // layout:
717
  // 00000000001111111111222222222233333333330000000000111111111122222222223333333333
718
  // 01234567890123456789012345678901234567890123456789012345678901234567890123456789
719
  // <--------------------------------------><-------------------------------------->
1675 tk 720
  // Transposer  Section    MIDI   Ext.       Bus Port Chn. Lower/Upper Mode   Reset 
721
  //  and Arp.   Control   Router  Ctrl Misc.  1  IN1  #16   ---   ---  T&A    Stacks
406 tk 722
 
1675 tk 723
  // Transposer  Section    MIDI   Ext.      Port Chn.  G1   G2   G3   G4  Fwd  Reset
724
  //  and Arp.   Control   Router  Ctrl Misc. All #16  C-1  C-2  C-3  C-4  USB1 Stcks
406 tk 725
 
1713 tk 726
  // Transposer  Section    MIDI   Ext.      Node IN P/Chn  OUT P/Chn   | DefaultPort
727
  //  and Arp.   Control   Router  Ctrl Misc. #1  Def. All  Def. # 1    |    USB1    
826 tk 728
 
1675 tk 729
  // Transposer  Section    MIDI   Ext.      Port Chn.      Function        CC#      
1794 tk 730
  // Transposer  Section    MIDI   Ext.       IN  OUT Chn.| Function        CC#      
731
  //  and Arp.   Control   Router  Ctrl Misc. All off --- | Morph Value       1      
826 tk 732
 
1794 tk 733
  // Transposer  Section    MIDI   Ext.      BLM_SCALAR                       MIDI   
1675 tk 734
  //  and Arp.   Control   Router  Ctrl Misc.Port: OUT2                     Monitor 
826 tk 735
 
1675 tk 736
 
406 tk 737
  seq_midi_router_node_t *n = &seq_midi_router_node[selected_router_node];
738
 
739
  ///////////////////////////////////////////////////////////////////////////
1675 tk 740
  SEQ_LCD_CursorSet(0, 0);
741
  SEQ_LCD_PrintString("Transposer  Section    MIDI   Ext.      ");
742
  SEQ_LCD_CursorSet(0, 1);
743
  SEQ_LCD_PrintString(" and Arp.   Control   Router  Ctrl Misc.");
406 tk 744
 
1675 tk 745
  if( ui_cursor_flash && selected_subpage <= 5 ) {
746
    const u8 select_pos1[5]  = {  0, 10, 20, 30, 35 };
747
    const u8 select_width[5] = { 10, 10, 10,  5,  5 };
406 tk 748
 
1675 tk 749
    int line;
750
    for(line=0; line<2; ++line) {
751
      SEQ_LCD_CursorSet(select_pos1[selected_subpage], line);
752
      SEQ_LCD_PrintSpaces(select_width[selected_subpage]);
826 tk 753
    }
406 tk 754
  }
755
 
826 tk 756
  switch( selected_subpage ) {
406 tk 757
  ///////////////////////////////////////////////////////////////////////////
826 tk 758
    case SUBPAGE_TRANSPOSE: {
759
      SEQ_LCD_CursorSet(40, 0);
1023 tk 760
      SEQ_LCD_PrintString(" Bus Port Chn. Lower/Upper Mode   Reset ");
826 tk 761
      SEQ_LCD_CursorSet(40, 1);
406 tk 762
 
826 tk 763
      ///////////////////////////////////////////////////////////////////////
1023 tk 764
      if( ui_selected_item == ITEM_IN_BUS && ui_cursor_flash ) {
765
    SEQ_LCD_PrintSpaces(5);
766
      } else {
767
    SEQ_LCD_PrintFormattedString("  %d  ", selected_bus+1);
768
      }
769
 
770
      ///////////////////////////////////////////////////////////////////////
826 tk 771
      if( ui_selected_item == ITEM_IN_PORT && ui_cursor_flash ) {
772
    SEQ_LCD_PrintSpaces(4);
773
      } else {
1023 tk 774
    if( seq_midi_in_port[selected_bus] )
775
      SEQ_LCD_PrintString(SEQ_MIDI_PORT_InNameGet(SEQ_MIDI_PORT_InIxGet(seq_midi_in_port[selected_bus])));
826 tk 776
    else
777
      SEQ_LCD_PrintString(" All");
778
      }
779
      SEQ_LCD_PrintSpaces(1);
406 tk 780
 
781
 
826 tk 782
      ///////////////////////////////////////////////////////////////////////
783
      if( ui_selected_item == ITEM_IN_CHN && ui_cursor_flash ) {
784
    SEQ_LCD_PrintSpaces(3);
785
      } else {
2150 tk 786
    if( seq_midi_in_channel[selected_bus] == 17 )
787
      SEQ_LCD_PrintString("All");
788
    else if( seq_midi_in_channel[selected_bus] )
1023 tk 789
      SEQ_LCD_PrintFormattedString("#%2d", seq_midi_in_channel[selected_bus]);
826 tk 790
    else
791
      SEQ_LCD_PrintString("---");
792
      }
1023 tk 793
      SEQ_LCD_PrintSpaces(3);
406 tk 794
 
795
 
826 tk 796
      ///////////////////////////////////////////////////////////////////////
1023 tk 797
      if( ui_selected_item == ITEM_IN_LOWER && ui_cursor_flash ) {
826 tk 798
    SEQ_LCD_PrintSpaces(3);
799
      } else {
1023 tk 800
    SEQ_LCD_PrintNote(seq_midi_in_lower[selected_bus]);
826 tk 801
      }
1023 tk 802
      SEQ_LCD_PrintSpaces(3);
406 tk 803
 
804
 
826 tk 805
      ///////////////////////////////////////////////////////////////////////
1023 tk 806
      if( ui_selected_item == ITEM_IN_UPPER && ui_cursor_flash ) {
826 tk 807
    SEQ_LCD_PrintSpaces(3);
808
      } else {
1023 tk 809
    SEQ_LCD_PrintNote(seq_midi_in_upper[selected_bus]);
826 tk 810
      }
1023 tk 811
      SEQ_LCD_PrintSpaces(2);
406 tk 812
 
1023 tk 813
 
814
      ///////////////////////////////////////////////////////////////////////
815
      if( ui_selected_item == ITEM_IN_MODE && ui_cursor_flash ) {
816
    SEQ_LCD_PrintSpaces(4);
817
      } else {
2171 tk 818
    SEQ_LCD_PrintString(seq_midi_in_options[selected_bus].MODE_PLAY ? "Jam " : "T&A ");
1023 tk 819
      }
820
      SEQ_LCD_PrintSpaces(3);
821
 
822
 
826 tk 823
      SEQ_LCD_PrintString("Stacks");
824
    } break;
406 tk 825
 
826
 
827
  ///////////////////////////////////////////////////////////////////////////
826 tk 828
    case SUBPAGE_SECTIONS: {
829
      SEQ_LCD_CursorSet(40, 0);
848 tk 830
      SEQ_LCD_PrintString("Port Chn.  G1   G2   G3   G4  Fwd  Reset");
826 tk 831
      SEQ_LCD_CursorSet(40, 1);
406 tk 832
 
826 tk 833
      ///////////////////////////////////////////////////////////////////////
834
      if( ui_selected_item == ITEM_S_PORT && ui_cursor_flash ) {
835
    SEQ_LCD_PrintSpaces(4);
836
      } else {
837
    if( seq_midi_in_sect_port )
838
      SEQ_LCD_PrintString(SEQ_MIDI_PORT_InNameGet(SEQ_MIDI_PORT_InIxGet(seq_midi_in_sect_port)));
839
    else
840
      SEQ_LCD_PrintString(" All");
841
      }
842
      SEQ_LCD_PrintSpaces(1);
406 tk 843
 
826 tk 844
      ///////////////////////////////////////////////////////////////////////
845
      if( ui_selected_item == ITEM_S_CHN && ui_cursor_flash ) {
846
    SEQ_LCD_PrintSpaces(3);
847
      } else {
848
    if( seq_midi_in_sect_channel )
849
      SEQ_LCD_PrintFormattedString("#%2d", seq_midi_in_sect_channel);
850
    else
851
      SEQ_LCD_PrintString("---");
852
      }
853
      SEQ_LCD_PrintSpaces(2);
406 tk 854
 
826 tk 855
      ///////////////////////////////////////////////////////////////////////
856
      if( ui_selected_item == ITEM_S_OCT_G1 && ui_cursor_flash ) {
857
    SEQ_LCD_PrintSpaces(3);
858
      } else {
859
    SEQ_LCD_PrintNote(seq_midi_in_sect_note[0]);
860
      }
861
      SEQ_LCD_PrintSpaces(2);
406 tk 862
 
826 tk 863
      ///////////////////////////////////////////////////////////////////////
864
      if( ui_selected_item == ITEM_S_OCT_G2 && ui_cursor_flash ) {
865
    SEQ_LCD_PrintSpaces(3);
866
      } else {
867
    SEQ_LCD_PrintNote(seq_midi_in_sect_note[1]);
868
      }
869
      SEQ_LCD_PrintSpaces(2);
870
 
871
      ///////////////////////////////////////////////////////////////////////
872
      if( ui_selected_item == ITEM_S_OCT_G3 && ui_cursor_flash ) {
873
    SEQ_LCD_PrintSpaces(3);
874
      } else {
875
    SEQ_LCD_PrintNote(seq_midi_in_sect_note[2]);
876
      }
877
      SEQ_LCD_PrintSpaces(2);
878
 
879
      ///////////////////////////////////////////////////////////////////////
880
      if( ui_selected_item == ITEM_S_OCT_G4 && ui_cursor_flash ) {
881
    SEQ_LCD_PrintSpaces(3);
882
      } else {
883
    SEQ_LCD_PrintNote(seq_midi_in_sect_note[3]);
884
      }
885
 
848 tk 886
      SEQ_LCD_PrintSpaces(2);
887
 
888
      ///////////////////////////////////////////////////////////////////////
889
      if( ui_selected_item == ITEM_S_FWD_PORT && ui_cursor_flash ) {
890
    SEQ_LCD_PrintSpaces(4);
891
      } else {
892
    if( seq_midi_in_sect_fwd_port == 0 )
893
      SEQ_LCD_PrintString("----");
894
    else
895
      SEQ_LCD_PrintString(SEQ_MIDI_PORT_OutNameGet(SEQ_MIDI_PORT_OutIxGet(seq_midi_in_sect_fwd_port)));
896
      }
897
 
898
      SEQ_LCD_PrintSpaces(1);
899
      SEQ_LCD_PrintString("Stcks");
826 tk 900
    } break;
901
 
902
 
406 tk 903
  ///////////////////////////////////////////////////////////////////////////
826 tk 904
    case SUBPAGE_ROUTER: {
905
      SEQ_LCD_CursorSet(40, 0);
1713 tk 906
      SEQ_LCD_PrintString("Node IN P/Chn  OUT P/Chn   | DefaultPort");
826 tk 907
      SEQ_LCD_CursorSet(40, 1);
406 tk 908
 
826 tk 909
      ///////////////////////////////////////////////////////////////////////
910
      SEQ_LCD_PrintSpaces(1);
911
      if( ui_selected_item == ITEM_R_NODE && ui_cursor_flash ) {
1385 tk 912
    SEQ_LCD_PrintSpaces(3);
826 tk 913
      } else {
1385 tk 914
    SEQ_LCD_PrintFormattedString("#%2d", selected_router_node+1);
826 tk 915
      }
1385 tk 916
      SEQ_LCD_PrintSpaces(1);
406 tk 917
 
826 tk 918
      ///////////////////////////////////////////////////////////////////////
919
      if( ui_selected_item == ITEM_R_SRC_PORT && ui_cursor_flash ) {
920
    SEQ_LCD_PrintSpaces(4);
921
      } else {
922
    SEQ_LCD_PrintString(SEQ_MIDI_PORT_InNameGet(SEQ_MIDI_PORT_InIxGet(n->src_port)));
923
      }
924
      SEQ_LCD_PrintSpaces(1);
759 tk 925
 
826 tk 926
      ///////////////////////////////////////////////////////////////////////
927
      if( ui_selected_item == ITEM_R_SRC_CHN && ui_cursor_flash ) {
928
    SEQ_LCD_PrintSpaces(3);
929
      } else {
930
    if( !n->src_chn ) {
931
      SEQ_LCD_PrintString("---");
932
    } else if( n->src_chn > 16 ) {
933
      SEQ_LCD_PrintString("All");
934
    } else {
935
      SEQ_LCD_PrintFormattedString("#%2d", n->src_chn);
936
    }
937
      }
938
      SEQ_LCD_PrintSpaces(2);
939
 
940
      ///////////////////////////////////////////////////////////////////////
941
      if( ui_selected_item == ITEM_R_DST_PORT && ui_cursor_flash ) {
1746 tk 942
    if( n->dst_chn >= 18 ) {
943
      SEQ_LCD_PrintSpaces(2);
944
    } else {
945
      SEQ_LCD_PrintSpaces(4);
946
    }
826 tk 947
      } else {
1713 tk 948
    if( n->dst_chn >= 18 ) {
1746 tk 949
      SEQ_LCD_PrintSpaces(2);
1713 tk 950
    } else {
951
      SEQ_LCD_PrintString(SEQ_MIDI_PORT_OutNameGet(SEQ_MIDI_PORT_OutIxGet(n->dst_port)));
952
    }
826 tk 953
      }
954
 
955
      ///////////////////////////////////////////////////////////////////////
956
      if( ui_selected_item == ITEM_R_DST_CHN && ui_cursor_flash ) {
1746 tk 957
    if( n->dst_chn >= 18 ) {
958
      SEQ_LCD_PrintSpaces(7);
959
    } else {
960
      SEQ_LCD_PrintSpaces(5);
961
    }
826 tk 962
      } else {
963
    if( !n->dst_chn ) {
1713 tk 964
      SEQ_LCD_PrintString(" --- ");
965
    } else if( n->dst_chn == 17 ) {
966
      SEQ_LCD_PrintString(" All ");
1746 tk 967
    } else if( n->dst_chn == 18 ) {
968
      SEQ_LCD_PrintString("  Track");
969
    } else if( n->dst_chn >= 19 ) {
970
      SEQ_LCD_PrintString("Sel.Trk");
826 tk 971
    } else {
1713 tk 972
      SEQ_LCD_PrintFormattedString(" #%2d ", n->dst_chn);
826 tk 973
    }
974
      }
1713 tk 975
      SEQ_LCD_PrintSpaces(3);
826 tk 976
 
977
      ///////////////////////////////////////////////////////////////////////
1713 tk 978
      SEQ_LCD_PrintChar('|');
979
      SEQ_LCD_PrintSpaces(4);
980
 
826 tk 981
      if( ui_selected_item == ITEM_DEF_PORT && ui_cursor_flash ) {
982
    SEQ_LCD_PrintSpaces(4);
983
      } else {
984
    SEQ_LCD_PrintString(SEQ_MIDI_PORT_OutNameGet(SEQ_MIDI_PORT_OutIxGet(MIOS32_MIDI_DefaultPortGet())));
985
      }
986
      SEQ_LCD_PrintSpaces(4);
987
    } break;
988
 
1675 tk 989
 
990
  ///////////////////////////////////////////////////////////////////////////
991
    case SUBPAGE_EXT_CTRL: {
992
      SEQ_LCD_CursorSet(40, 0);
1794 tk 993
      SEQ_LCD_PrintString(" IN  OUT  Chn.|Function        ");
1675 tk 994
      if( selected_ext_ctrl < SEQ_MIDI_IN_EXT_CTRL_NUM_IX_CC ) {
995
    SEQ_LCD_PrintString("CC#      ");
996
      } else {
997
    SEQ_LCD_PrintSpaces(10);
998
      }
999
      SEQ_LCD_CursorSet(40, 1);
1000
 
1001
      ///////////////////////////////////////////////////////////////////////
1002
      if( ui_selected_item == ITEM_EXT_PORT && ui_cursor_flash ) {
1003
    SEQ_LCD_PrintSpaces(4);
1004
      } else {
1816 tk 1005
    if( seq_midi_in_ext_ctrl_port == 0xff )
1006
      SEQ_LCD_PrintString(" All");
1007
    else if( !seq_midi_in_ext_ctrl_port )
1008
      SEQ_LCD_PrintString(" off");
1009
    else
1675 tk 1010
      SEQ_LCD_PrintString(SEQ_MIDI_PORT_InNameGet(SEQ_MIDI_PORT_InIxGet(seq_midi_in_ext_ctrl_port)));
1011
      }
1012
      SEQ_LCD_PrintSpaces(1);
1013
 
1014
      ///////////////////////////////////////////////////////////////////////
1794 tk 1015
      if( ui_selected_item == ITEM_EXT_PORT_OUT && ui_cursor_flash ) {
1016
    SEQ_LCD_PrintSpaces(4);
1017
      } else {
1018
    if( seq_midi_in_ext_ctrl_out_port )
1019
      SEQ_LCD_PrintString(SEQ_MIDI_PORT_OutNameGet(SEQ_MIDI_PORT_OutIxGet(seq_midi_in_ext_ctrl_out_port)));
1020
    else
1021
      SEQ_LCD_PrintString("off ");
1022
      }
1023
      SEQ_LCD_PrintSpaces(1);
1024
 
1025
      ///////////////////////////////////////////////////////////////////////
1675 tk 1026
      if( ui_selected_item == ITEM_EXT_CHN && ui_cursor_flash ) {
1027
    SEQ_LCD_PrintSpaces(3);
1028
      } else {
1029
    if( seq_midi_in_ext_ctrl_channel )
1030
      SEQ_LCD_PrintFormattedString("#%2d", seq_midi_in_ext_ctrl_channel);
1031
    else
1032
      SEQ_LCD_PrintString("---");
1033
      }
1794 tk 1034
      SEQ_LCD_PrintString(" |");
1675 tk 1035
 
1036
      ///////////////////////////////////////////////////////////////////////
1037
      if( ui_selected_item == ITEM_EXT_CTRL && ui_cursor_flash ) {
1038
    SEQ_LCD_PrintSpaces(15);
1039
      } else {
1040
    SEQ_LCD_PrintStringPadded((char *)SEQ_MIDI_IN_ExtCtrlStr(selected_ext_ctrl), 15);
1041
      }
1042
 
1043
 
1044
      ///////////////////////////////////////////////////////////////////////
1045
      if( ui_selected_item == ITEM_EXT_VALUE && ui_cursor_flash ) {
1046
    SEQ_LCD_PrintSpaces(10);
1047
      } else {
1048
    SEQ_LCD_PrintSpaces(1);
1049
    if( selected_ext_ctrl == SEQ_MIDI_IN_EXT_CTRL_NRPN_ENABLED ) {
1050
      SEQ_LCD_PrintStringPadded(seq_midi_in_ext_ctrl_asg[selected_ext_ctrl] ? "enabled" : "disabled", 9);
1051
    } else if( selected_ext_ctrl == SEQ_MIDI_IN_EXT_CTRL_PC_MODE ) {
1052
      SEQ_LCD_PrintStringPadded((char *)SEQ_MIDI_IN_ExtCtrlPcModeStr(seq_midi_in_ext_ctrl_asg[selected_ext_ctrl]), 9);
1053
    } else {
1054
      u8 cc = seq_midi_in_ext_ctrl_asg[selected_ext_ctrl];
1055
      if( cc >= 0x80 )
1056
        SEQ_LCD_PrintString("off");
1057
      else
1058
        SEQ_LCD_PrintFormattedString("%3d", cc);
1059
      SEQ_LCD_PrintSpaces(7);
1060
    }
1061
      }
1062
 
1063
    } break;
1064
 
1065
 
1066
  ///////////////////////////////////////////////////////////////////////////
826 tk 1067
    case SUBPAGE_MISC: {
1068
      SEQ_LCD_CursorSet(40, 0);
1794 tk 1069
      SEQ_LCD_PrintString("BLM_SCALAR                       MIDI   ");
826 tk 1070
      SEQ_LCD_CursorSet(40, 1);
1071
 
1072
      ///////////////////////////////////////////////////////////////////////
1073
      SEQ_LCD_PrintString("Port: ");
1074
      if( ui_selected_item == ITEM_BLM_SCALAR_PORT && ui_cursor_flash ) {
1075
    SEQ_LCD_PrintSpaces(4);
1076
      } else {
2263 tk 1077
    mios32_midi_port_t blm_port = BLM_SCALAR_MASTER_MIDI_PortGet(0);
1078
    if( !blm_port )
826 tk 1079
      SEQ_LCD_PrintString(" off");
1080
    else
2263 tk 1081
      SEQ_LCD_PrintString(SEQ_MIDI_PORT_InNameGet(SEQ_MIDI_PORT_InIxGet(blm_port)));
826 tk 1082
      }
1083
 
2263 tk 1084
      SEQ_LCD_PrintString(BLM_SCALAR_MASTER_TimeoutCtrGet(0) ? " (found)  " : "          ");
1794 tk 1085
 
1086
      // free for new parameters
1087
      SEQ_LCD_PrintSpaces(12);
1088
 
826 tk 1089
      ///////////////////////////////////////////////////////////////////////
1090
      SEQ_LCD_PrintString("Monitor ");
1091
 
1092
    } break;
1093
  }
1094
 
406 tk 1095
  return 0; // no error
1096
}
1097
 
1098
 
1099
/////////////////////////////////////////////////////////////////////////////
1100
// Local exit function
1101
/////////////////////////////////////////////////////////////////////////////
1102
static s32 EXIT_Handler(void)
1103
{
513 tk 1104
  s32 status = 0;
406 tk 1105
 
2102 tk 1106
  if( ui_store_file_required ) {
1052 tk 1107
    // write config files
513 tk 1108
    MUTEX_SDCARD_TAKE;
1123 tk 1109
    if( (status=SEQ_FILE_C_Write(seq_file_session_name)) < 0 )
513 tk 1110
      SEQ_UI_SDCardErrMsg(2000, status);
1111
    MUTEX_SDCARD_GIVE;
1052 tk 1112
 
1113
    MUTEX_SDCARD_TAKE;
1114
    if( (status=SEQ_FILE_GC_Write()) < 0 )
1115
      SEQ_UI_SDCardErrMsg(2000, status);
1116
    MUTEX_SDCARD_GIVE;
2102 tk 1117
 
1118
    ui_store_file_required = 0;
513 tk 1119
  }
406 tk 1120
 
1121
  return status;
1122
}
1123
 
1124
 
1125
/////////////////////////////////////////////////////////////////////////////
1126
// Initialisation
1127
/////////////////////////////////////////////////////////////////////////////
1128
s32 SEQ_UI_MIDI_Init(u32 mode)
1129
{
1130
  // install callback routines
1131
  SEQ_UI_InstallButtonCallback(Button_Handler);
1132
  SEQ_UI_InstallEncoderCallback(Encoder_Handler);
1133
  SEQ_UI_InstallLEDCallback(LED_Handler);
1134
  SEQ_UI_InstallLCDCallback(LCD_Handler);
1135
  SEQ_UI_InstallExitCallback(EXIT_Handler);
1136
 
1137
  return 0; // no error
1138
}