Subversion Repositories svn.mios32

Rev

Rev 1746 | Rev 1806 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
406 tk 1
// $Id: seq_ui_midi.c 1794 2013-05-31 19:25:43Z 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>
19
#include "tasks.h"
20
 
21
#include "seq_lcd.h"
22
#include "seq_ui.h"
23
 
1123 tk 24
#include "seq_file.h"
406 tk 25
#include "seq_file_c.h"
1052 tk 26
#include "seq_file_gc.h"
406 tk 27
 
28
#include "seq_midi_in.h"
29
#include "seq_midi_router.h"
30
#include "seq_midi_port.h"
31
#include "seq_bpm.h"
1020 tk 32
#include "seq_blm.h"
406 tk 33
 
34
 
35
/////////////////////////////////////////////////////////////////////////////
36
// Local definitions
37
/////////////////////////////////////////////////////////////////////////////
38
 
826 tk 39
#define SUBPAGE_TRANSPOSE  0
40
#define SUBPAGE_SECTIONS   1
41
#define SUBPAGE_ROUTER     2
1675 tk 42
#define SUBPAGE_EXT_CTRL   3
43
#define SUBPAGE_MISC       4
406 tk 44
 
45
 
826 tk 46
 
1794 tk 47
#define NUM_OF_ITEMS       27
826 tk 48
 
49
// Transpose
1023 tk 50
#define ITEM_IN_BUS        0
51
#define ITEM_IN_PORT       1
52
#define ITEM_IN_CHN        2
53
#define ITEM_IN_LOWER      3
54
#define ITEM_IN_UPPER      4
55
#define ITEM_IN_MODE       5
56
#define ITEM_RESET_STACKS  6
826 tk 57
 
58
// Sections
1023 tk 59
#define ITEM_S_PORT        7
60
#define ITEM_S_CHN         8
61
#define ITEM_S_OCT_G1      9
62
#define ITEM_S_OCT_G2      10
63
#define ITEM_S_OCT_G3      11
64
#define ITEM_S_OCT_G4      12
65
#define ITEM_S_FWD_PORT    13
66
#define ITEM_S_RESET_STACKS 14
826 tk 67
 
68
// MIDI Router
1023 tk 69
#define ITEM_R_NODE        15
70
#define ITEM_R_SRC_PORT    16
71
#define ITEM_R_SRC_CHN     17
72
#define ITEM_R_DST_PORT    18
73
#define ITEM_R_DST_CHN     19
74
#define ITEM_DEF_PORT      20
826 tk 75
 
1675 tk 76
// Ext. Ctrl
77
#define ITEM_EXT_PORT      21
1794 tk 78
#define ITEM_EXT_PORT_OUT  22
79
#define ITEM_EXT_CHN       23
80
#define ITEM_EXT_CTRL      24
81
#define ITEM_EXT_VALUE     25
1675 tk 82
 
826 tk 83
// Misc
1794 tk 84
#define ITEM_BLM_SCALAR_PORT 26
826 tk 85
 
86
 
406 tk 87
/////////////////////////////////////////////////////////////////////////////
88
// Local variables
89
/////////////////////////////////////////////////////////////////////////////
90
 
599 tk 91
static u8 store_file_required;
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]);
401
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_InNumGet()-1-4, incrementer) >= 0 ) { // don't allow selection of Bus1..Bus4
402
    seq_midi_in_port[selected_bus] = SEQ_MIDI_PORT_InPortGet(port_ix);
513 tk 403
    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:
1023 tk 410
      if( SEQ_UI_Var8_Inc(&seq_midi_in_channel[selected_bus], 0, 16, incrementer) >= 0 ) {
513 tk 411
    store_file_required = 1;
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 ) {
418
    store_file_required = 1;
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 ) {
513 tk 425
    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;
432
      if( SEQ_UI_Var8_Inc(&fwd, 0, 1, incrementer) >= 0 ) {
433
    seq_midi_in_options[selected_bus].MODE_PLAY = fwd;
434
    store_file_required = 1;
435
    return 1; // value changed
436
      }
437
      return 0; // no change
406 tk 438
    } break;
439
 
826 tk 440
    case ITEM_RESET_STACKS: {
441
      SEQ_MIDI_IN_ResetTransArpStacks();
442
      SEQ_UI_Msg(SEQ_UI_MSG_USER_R, 2000, "Transposer/Arp.", "Stacks cleared!");
1794 tk 443
 
444
      // send to external
445
      SEQ_MIDI_IN_ExtCtrlSend(SEQ_MIDI_IN_EXT_CTRL_ALL_NOTES_OFF, 127);
446
 
826 tk 447
      return 1;
448
    } break;
449
 
450
 
451
    case ITEM_S_PORT: {
452
      u8 port_ix = SEQ_MIDI_PORT_InIxGet(seq_midi_in_sect_port);
453
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_InNumGet()-1, incrementer) >= 0 ) {
454
    seq_midi_in_sect_port = SEQ_MIDI_PORT_InPortGet(port_ix);
455
    store_file_required = 1;
456
    return 1; // value changed
457
      }
458
      return 0; // no change
459
    } break;
460
 
461
    case ITEM_S_CHN:
462
      if( SEQ_UI_Var8_Inc(&seq_midi_in_sect_channel, 0, 16, incrementer) >= 0 ) {
463
    store_file_required = 1;
464
    return 1; // value changed
465
      }
466
      return 0; // no change
467
 
468
 
469
    case ITEM_S_OCT_G1: {
470
      u8 oct = seq_midi_in_sect_note[0] / 12;
471
      if( SEQ_UI_Var8_Inc(&oct, 0, 11, incrementer) >= 0 ) {
472
    seq_midi_in_sect_note[0] = 12*oct;
473
    store_file_required = 1;
474
    return 1; // value changed
475
      }
476
      return 0; // no change
477
    } break;
478
 
479
    case ITEM_S_OCT_G2: {
480
      u8 oct = seq_midi_in_sect_note[1] / 12;
481
      if( SEQ_UI_Var8_Inc(&oct, 0, 11, incrementer) >= 0 ) {
482
    seq_midi_in_sect_note[1] = 12*oct;
483
    store_file_required = 1;
484
    return 1; // value changed
485
      }
486
      return 0; // no change
487
    } break;
488
 
489
    case ITEM_S_OCT_G3: {
490
      u8 oct = seq_midi_in_sect_note[2] / 12;
491
      if( SEQ_UI_Var8_Inc(&oct, 0, 11, incrementer) >= 0 ) {
492
    seq_midi_in_sect_note[2] = 12*oct;
493
    store_file_required = 1;
494
    return 1; // value changed
495
      }
496
      return 0; // no change
497
    } break;
498
 
499
    case ITEM_S_OCT_G4: {
500
      u8 oct = seq_midi_in_sect_note[3] / 12;
501
      if( SEQ_UI_Var8_Inc(&oct, 0, 11, incrementer) >= 0 ) {
502
    seq_midi_in_sect_note[3] = 12*oct;
503
    store_file_required = 1;
504
    return 1; // value changed
505
      }
506
      return 0; // no change
507
    } break;
508
 
848 tk 509
    case ITEM_S_FWD_PORT: {
510
      u8 port_ix = SEQ_MIDI_PORT_OutIxGet(seq_midi_in_sect_fwd_port);
511
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_OutNumGet()-1, incrementer) >= 0 ) {
512
    seq_midi_in_sect_fwd_port = SEQ_MIDI_PORT_OutPortGet(port_ix);
513
    store_file_required = 1;
514
    return 1; // value changed
515
      }
516
      return 0; // no change
517
    } break;
518
 
826 tk 519
    case ITEM_S_RESET_STACKS: {
520
      SEQ_MIDI_IN_ResetChangerStacks();
521
      SEQ_UI_Msg(SEQ_UI_MSG_USER_R, 2000, "Section Changer", "Stacks cleared!");
1794 tk 522
 
523
      // send to external
524
      SEQ_MIDI_IN_ExtCtrlSend(SEQ_MIDI_IN_EXT_CTRL_ALL_NOTES_OFF, 127);
525
 
826 tk 526
      return 1;
527
    } break;
528
 
529
 
530
 
406 tk 531
    case ITEM_R_NODE:
513 tk 532
      if( SEQ_UI_Var8_Inc(&selected_router_node, 0, SEQ_MIDI_ROUTER_NUM_NODES-1, incrementer) >= 0 ) {
533
    store_file_required = 1;
534
    return 1; // value changed
535
      }
536
      return 0; // no change
406 tk 537
 
538
    case ITEM_R_SRC_PORT: {
539
      u8 port_ix = SEQ_MIDI_PORT_InIxGet(n->src_port);
540
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_InNumGet()-1, incrementer) >= 0 ) {
541
    n->src_port = SEQ_MIDI_PORT_InPortGet(port_ix);
513 tk 542
    store_file_required = 1;
406 tk 543
    return 1; // value changed
544
      }
545
      return 0; // no change
546
    } break;
547
 
548
    case ITEM_R_SRC_CHN:
513 tk 549
      if( SEQ_UI_Var8_Inc(&n->src_chn, 0, 17, incrementer) >= 0 ) {
550
    store_file_required = 1;
551
    return 1; // value changed
552
      }
553
      return 0; // no change
406 tk 554
 
555
    case ITEM_R_DST_PORT: {
556
      u8 port_ix = SEQ_MIDI_PORT_OutIxGet(n->dst_port);
557
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_OutNumGet()-1, incrementer) >= 0 ) {
558
    n->dst_port = SEQ_MIDI_PORT_OutPortGet(port_ix);
513 tk 559
    store_file_required = 1;
406 tk 560
    return 1; // value changed
561
      }
562
      return 0; // no change
563
    } break;
564
 
565
    case ITEM_R_DST_CHN:
1746 tk 566
      if( SEQ_UI_Var8_Inc(&n->dst_chn, 0, 19, incrementer) >= 0 ) {
513 tk 567
    store_file_required = 1;
568
    return 1; // value changed
569
      }
570
      return 0; // no change
826 tk 571
 
572
 
573
    case ITEM_DEF_PORT: {
574
      u8 port_ix = SEQ_MIDI_PORT_OutIxGet(MIOS32_MIDI_DefaultPortGet());
575
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_OutNumGet()-1, incrementer) >= 0 ) {
576
    MIOS32_MIDI_DefaultPortSet(SEQ_MIDI_PORT_OutPortGet(port_ix));
577
    store_file_required = 1;
578
    return 1; // value changed
579
      }
580
      return 0; // no change
581
    } break;
582
 
1675 tk 583
    case ITEM_EXT_PORT: {
584
      u8 port_ix = SEQ_MIDI_PORT_InIxGet(seq_midi_in_ext_ctrl_port);
585
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_InNumGet()-1, incrementer) >= 0 ) {
586
    seq_midi_in_ext_ctrl_port = SEQ_MIDI_PORT_InPortGet(port_ix);
587
    store_file_required = 1;
588
    return 1; // value changed
589
      }
590
      return 0; // no change
591
    } break;
826 tk 592
 
1794 tk 593
    case ITEM_EXT_PORT_OUT: {
594
      u8 port_ix = SEQ_MIDI_PORT_OutIxGet(seq_midi_in_ext_ctrl_out_port);
595
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_OutNumGet()-1, incrementer) >= 0 ) {
596
    seq_midi_in_ext_ctrl_out_port = SEQ_MIDI_PORT_OutPortGet(port_ix);
597
    store_file_required = 1;
598
    return 1; // value changed
599
      }
600
      return 0; // no change
601
    } break;
602
 
1675 tk 603
    case ITEM_EXT_CHN:
604
      if( SEQ_UI_Var8_Inc(&seq_midi_in_ext_ctrl_channel, 0, 16, incrementer) >= 0 ) {
605
    store_file_required = 1;
606
    return 1; // value changed
607
      }
608
      return 0; // no change
609
 
610
    case ITEM_EXT_CTRL:
611
      if( SEQ_UI_Var8_Inc(&selected_ext_ctrl, 0, SEQ_MIDI_IN_EXT_CTRL_NUM-1, incrementer) >= 0 ) {
612
    store_file_required = 1;
613
    return 1; // value changed
614
      }
615
      return 0; // no change
616
 
617
    case ITEM_EXT_VALUE:
618
      if( selected_ext_ctrl == SEQ_MIDI_IN_EXT_CTRL_NRPN_ENABLED ) {
619
    if( SEQ_UI_Var8_Inc(&seq_midi_in_ext_ctrl_asg[selected_ext_ctrl], 0, 1, incrementer) >= 0 ) {
620
      store_file_required = 1;
621
      return 1; // value changed
622
    }
623
      } else if( selected_ext_ctrl == SEQ_MIDI_IN_EXT_CTRL_PC_MODE ) {
624
    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 ) {
625
      store_file_required = 1;
626
      return 1; // value changed
627
    }
628
      } else if( selected_ext_ctrl <= SEQ_MIDI_IN_EXT_CTRL_NUM ) {
629
    if( SEQ_UI_Var8_Inc(&seq_midi_in_ext_ctrl_asg[selected_ext_ctrl], 0, 128, incrementer) >= 0 ) {
630
      store_file_required = 1;
631
      return 1; // value changed
632
    }
633
      }
634
      return 0; // no change
635
 
826 tk 636
    case ITEM_BLM_SCALAR_PORT: {
1020 tk 637
      u8 port_ix = SEQ_MIDI_PORT_InIxGet(seq_blm_port);
826 tk 638
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_InNumGet()-1, incrementer) >= 0 ) {
1020 tk 639
    seq_blm_port = SEQ_MIDI_PORT_InPortGet(port_ix);
826 tk 640
    MUTEX_MIDIOUT_TAKE;
1021 tk 641
    blm_timeout_ctr = 0; // fake timeout (so that "BLM not found" message will be displayed)
1020 tk 642
    SEQ_BLM_SYSEX_SendRequest(0x00); // request layout from BLM_SCALAR
826 tk 643
    MUTEX_MIDIOUT_GIVE;
644
    store_file_required = 1;
645
    return 1; // value changed
646
      }
647
      return 0; // no change
648
    } break;
406 tk 649
  }
650
 
651
  return -1; // invalid or unsupported encoder
652
}
653
 
654
 
655
/////////////////////////////////////////////////////////////////////////////
656
// Local button callback function
657
// Should return:
658
//   1 if value has been changed
659
//   0 if value hasn't been changed
660
//  -1 if invalid or unsupported button
661
/////////////////////////////////////////////////////////////////////////////
662
static s32 Button_Handler(seq_ui_button_t button, s32 depressed)
663
{
664
  if( depressed ) return 0; // ignore when button depressed
665
 
666
#if 0
667
  // leads to: comparison is always true due to limited range of data type
668
  if( button >= SEQ_UI_BUTTON_GP1 && button <= SEQ_UI_BUTTON_GP16 ) {
669
#else
670
  if( button <= SEQ_UI_BUTTON_GP16 ) {
671
#endif
416 tk 672
    // re-use encoder handler - only select UI item, don't increment, flags will be toggled
673
    return Encoder_Handler((int)button, 0);
406 tk 674
  }
675
 
676
  // remaining buttons:
677
  switch( button ) {
678
    case SEQ_UI_BUTTON_Select:
679
    case SEQ_UI_BUTTON_Right:
680
      if( ++ui_selected_item >= NUM_OF_ITEMS )
681
    ui_selected_item = 0;
826 tk 682
      SetSubpageBasedOnItem(ui_selected_item);
406 tk 683
      return 1; // value always changed
684
 
685
    case SEQ_UI_BUTTON_Left:
686
      if( ui_selected_item == 0 )
687
    ui_selected_item = NUM_OF_ITEMS-1;
1142 tk 688
      else
689
    --ui_selected_item;
826 tk 690
      SetSubpageBasedOnItem(ui_selected_item);
406 tk 691
      return 1; // value always changed
692
 
693
    case SEQ_UI_BUTTON_Up:
694
      return Encoder_Handler(SEQ_UI_ENCODER_Datawheel, 1);
695
 
696
    case SEQ_UI_BUTTON_Down:
697
      return Encoder_Handler(SEQ_UI_ENCODER_Datawheel, -1);
698
  }
699
 
700
  return -1; // invalid or unsupported button
701
}
702
 
703
 
704
/////////////////////////////////////////////////////////////////////////////
705
// Local Display Handler function
706
// IN: <high_prio>: if set, a high-priority LCD update is requested
707
/////////////////////////////////////////////////////////////////////////////
708
static s32 LCD_Handler(u8 high_prio)
709
{
710
  if( high_prio )
711
    return 0; // there are no high-priority updates
712
 
713
  // layout:
714
  // 00000000001111111111222222222233333333330000000000111111111122222222223333333333
715
  // 01234567890123456789012345678901234567890123456789012345678901234567890123456789
716
  // <--------------------------------------><-------------------------------------->
1675 tk 717
  // Transposer  Section    MIDI   Ext.       Bus Port Chn. Lower/Upper Mode   Reset 
718
  //  and Arp.   Control   Router  Ctrl Misc.  1  IN1  #16   ---   ---  T&A    Stacks
406 tk 719
 
1675 tk 720
  // Transposer  Section    MIDI   Ext.      Port Chn.  G1   G2   G3   G4  Fwd  Reset
721
  //  and Arp.   Control   Router  Ctrl Misc. All #16  C-1  C-2  C-3  C-4  USB1 Stcks
406 tk 722
 
1713 tk 723
  // Transposer  Section    MIDI   Ext.      Node IN P/Chn  OUT P/Chn   | DefaultPort
724
  //  and Arp.   Control   Router  Ctrl Misc. #1  Def. All  Def. # 1    |    USB1    
826 tk 725
 
1675 tk 726
  // Transposer  Section    MIDI   Ext.      Port Chn.      Function        CC#      
1794 tk 727
  // Transposer  Section    MIDI   Ext.       IN  OUT Chn.| Function        CC#      
728
  //  and Arp.   Control   Router  Ctrl Misc. All off --- | Morph Value       1      
826 tk 729
 
1794 tk 730
  // Transposer  Section    MIDI   Ext.      BLM_SCALAR                       MIDI   
1675 tk 731
  //  and Arp.   Control   Router  Ctrl Misc.Port: OUT2                     Monitor 
826 tk 732
 
1675 tk 733
 
406 tk 734
  seq_midi_router_node_t *n = &seq_midi_router_node[selected_router_node];
735
 
736
  ///////////////////////////////////////////////////////////////////////////
1675 tk 737
  SEQ_LCD_CursorSet(0, 0);
738
  SEQ_LCD_PrintString("Transposer  Section    MIDI   Ext.      ");
739
  SEQ_LCD_CursorSet(0, 1);
740
  SEQ_LCD_PrintString(" and Arp.   Control   Router  Ctrl Misc.");
406 tk 741
 
1675 tk 742
  if( ui_cursor_flash && selected_subpage <= 5 ) {
743
    const u8 select_pos1[5]  = {  0, 10, 20, 30, 35 };
744
    const u8 select_width[5] = { 10, 10, 10,  5,  5 };
406 tk 745
 
1675 tk 746
    int line;
747
    for(line=0; line<2; ++line) {
748
      SEQ_LCD_CursorSet(select_pos1[selected_subpage], line);
749
      SEQ_LCD_PrintSpaces(select_width[selected_subpage]);
826 tk 750
    }
406 tk 751
  }
752
 
826 tk 753
  switch( selected_subpage ) {
406 tk 754
  ///////////////////////////////////////////////////////////////////////////
826 tk 755
    case SUBPAGE_TRANSPOSE: {
756
      SEQ_LCD_CursorSet(40, 0);
1023 tk 757
      SEQ_LCD_PrintString(" Bus Port Chn. Lower/Upper Mode   Reset ");
826 tk 758
      SEQ_LCD_CursorSet(40, 1);
406 tk 759
 
826 tk 760
      ///////////////////////////////////////////////////////////////////////
1023 tk 761
      if( ui_selected_item == ITEM_IN_BUS && ui_cursor_flash ) {
762
    SEQ_LCD_PrintSpaces(5);
763
      } else {
764
    SEQ_LCD_PrintFormattedString("  %d  ", selected_bus+1);
765
      }
766
 
767
      ///////////////////////////////////////////////////////////////////////
826 tk 768
      if( ui_selected_item == ITEM_IN_PORT && ui_cursor_flash ) {
769
    SEQ_LCD_PrintSpaces(4);
770
      } else {
1023 tk 771
    if( seq_midi_in_port[selected_bus] )
772
      SEQ_LCD_PrintString(SEQ_MIDI_PORT_InNameGet(SEQ_MIDI_PORT_InIxGet(seq_midi_in_port[selected_bus])));
826 tk 773
    else
774
      SEQ_LCD_PrintString(" All");
775
      }
776
      SEQ_LCD_PrintSpaces(1);
406 tk 777
 
778
 
826 tk 779
      ///////////////////////////////////////////////////////////////////////
780
      if( ui_selected_item == ITEM_IN_CHN && ui_cursor_flash ) {
781
    SEQ_LCD_PrintSpaces(3);
782
      } else {
1023 tk 783
    if( seq_midi_in_channel[selected_bus] )
784
      SEQ_LCD_PrintFormattedString("#%2d", seq_midi_in_channel[selected_bus]);
826 tk 785
    else
786
      SEQ_LCD_PrintString("---");
787
      }
1023 tk 788
      SEQ_LCD_PrintSpaces(3);
406 tk 789
 
790
 
826 tk 791
      ///////////////////////////////////////////////////////////////////////
1023 tk 792
      if( ui_selected_item == ITEM_IN_LOWER && ui_cursor_flash ) {
826 tk 793
    SEQ_LCD_PrintSpaces(3);
794
      } else {
1023 tk 795
    SEQ_LCD_PrintNote(seq_midi_in_lower[selected_bus]);
826 tk 796
      }
1023 tk 797
      SEQ_LCD_PrintSpaces(3);
406 tk 798
 
799
 
826 tk 800
      ///////////////////////////////////////////////////////////////////////
1023 tk 801
      if( ui_selected_item == ITEM_IN_UPPER && ui_cursor_flash ) {
826 tk 802
    SEQ_LCD_PrintSpaces(3);
803
      } else {
1023 tk 804
    SEQ_LCD_PrintNote(seq_midi_in_upper[selected_bus]);
826 tk 805
      }
1023 tk 806
      SEQ_LCD_PrintSpaces(2);
406 tk 807
 
1023 tk 808
 
809
      ///////////////////////////////////////////////////////////////////////
810
      if( ui_selected_item == ITEM_IN_MODE && ui_cursor_flash ) {
811
    SEQ_LCD_PrintSpaces(4);
812
      } else {
813
    SEQ_LCD_PrintString(seq_midi_in_options[selected_bus].MODE_PLAY ? "Play" : "T&A ");
814
      }
815
      SEQ_LCD_PrintSpaces(3);
816
 
817
 
826 tk 818
      SEQ_LCD_PrintString("Stacks");
819
    } break;
406 tk 820
 
821
 
822
  ///////////////////////////////////////////////////////////////////////////
826 tk 823
    case SUBPAGE_SECTIONS: {
824
      SEQ_LCD_CursorSet(40, 0);
848 tk 825
      SEQ_LCD_PrintString("Port Chn.  G1   G2   G3   G4  Fwd  Reset");
826 tk 826
      SEQ_LCD_CursorSet(40, 1);
406 tk 827
 
826 tk 828
      ///////////////////////////////////////////////////////////////////////
829
      if( ui_selected_item == ITEM_S_PORT && ui_cursor_flash ) {
830
    SEQ_LCD_PrintSpaces(4);
831
      } else {
832
    if( seq_midi_in_sect_port )
833
      SEQ_LCD_PrintString(SEQ_MIDI_PORT_InNameGet(SEQ_MIDI_PORT_InIxGet(seq_midi_in_sect_port)));
834
    else
835
      SEQ_LCD_PrintString(" All");
836
      }
837
      SEQ_LCD_PrintSpaces(1);
406 tk 838
 
826 tk 839
      ///////////////////////////////////////////////////////////////////////
840
      if( ui_selected_item == ITEM_S_CHN && ui_cursor_flash ) {
841
    SEQ_LCD_PrintSpaces(3);
842
      } else {
843
    if( seq_midi_in_sect_channel )
844
      SEQ_LCD_PrintFormattedString("#%2d", seq_midi_in_sect_channel);
845
    else
846
      SEQ_LCD_PrintString("---");
847
      }
848
      SEQ_LCD_PrintSpaces(2);
406 tk 849
 
826 tk 850
      ///////////////////////////////////////////////////////////////////////
851
      if( ui_selected_item == ITEM_S_OCT_G1 && ui_cursor_flash ) {
852
    SEQ_LCD_PrintSpaces(3);
853
      } else {
854
    SEQ_LCD_PrintNote(seq_midi_in_sect_note[0]);
855
      }
856
      SEQ_LCD_PrintSpaces(2);
406 tk 857
 
826 tk 858
      ///////////////////////////////////////////////////////////////////////
859
      if( ui_selected_item == ITEM_S_OCT_G2 && ui_cursor_flash ) {
860
    SEQ_LCD_PrintSpaces(3);
861
      } else {
862
    SEQ_LCD_PrintNote(seq_midi_in_sect_note[1]);
863
      }
864
      SEQ_LCD_PrintSpaces(2);
865
 
866
      ///////////////////////////////////////////////////////////////////////
867
      if( ui_selected_item == ITEM_S_OCT_G3 && ui_cursor_flash ) {
868
    SEQ_LCD_PrintSpaces(3);
869
      } else {
870
    SEQ_LCD_PrintNote(seq_midi_in_sect_note[2]);
871
      }
872
      SEQ_LCD_PrintSpaces(2);
873
 
874
      ///////////////////////////////////////////////////////////////////////
875
      if( ui_selected_item == ITEM_S_OCT_G4 && ui_cursor_flash ) {
876
    SEQ_LCD_PrintSpaces(3);
877
      } else {
878
    SEQ_LCD_PrintNote(seq_midi_in_sect_note[3]);
879
      }
880
 
848 tk 881
      SEQ_LCD_PrintSpaces(2);
882
 
883
      ///////////////////////////////////////////////////////////////////////
884
      if( ui_selected_item == ITEM_S_FWD_PORT && ui_cursor_flash ) {
885
    SEQ_LCD_PrintSpaces(4);
886
      } else {
887
    if( seq_midi_in_sect_fwd_port == 0 )
888
      SEQ_LCD_PrintString("----");
889
    else
890
      SEQ_LCD_PrintString(SEQ_MIDI_PORT_OutNameGet(SEQ_MIDI_PORT_OutIxGet(seq_midi_in_sect_fwd_port)));
891
      }
892
 
893
      SEQ_LCD_PrintSpaces(1);
894
      SEQ_LCD_PrintString("Stcks");
826 tk 895
    } break;
896
 
897
 
406 tk 898
  ///////////////////////////////////////////////////////////////////////////
826 tk 899
    case SUBPAGE_ROUTER: {
900
      SEQ_LCD_CursorSet(40, 0);
1713 tk 901
      SEQ_LCD_PrintString("Node IN P/Chn  OUT P/Chn   | DefaultPort");
826 tk 902
      SEQ_LCD_CursorSet(40, 1);
406 tk 903
 
826 tk 904
      ///////////////////////////////////////////////////////////////////////
905
      SEQ_LCD_PrintSpaces(1);
906
      if( ui_selected_item == ITEM_R_NODE && ui_cursor_flash ) {
1385 tk 907
    SEQ_LCD_PrintSpaces(3);
826 tk 908
      } else {
1385 tk 909
    SEQ_LCD_PrintFormattedString("#%2d", selected_router_node+1);
826 tk 910
      }
1385 tk 911
      SEQ_LCD_PrintSpaces(1);
406 tk 912
 
826 tk 913
      ///////////////////////////////////////////////////////////////////////
914
      if( ui_selected_item == ITEM_R_SRC_PORT && ui_cursor_flash ) {
915
    SEQ_LCD_PrintSpaces(4);
916
      } else {
917
    SEQ_LCD_PrintString(SEQ_MIDI_PORT_InNameGet(SEQ_MIDI_PORT_InIxGet(n->src_port)));
918
      }
919
      SEQ_LCD_PrintSpaces(1);
759 tk 920
 
826 tk 921
      ///////////////////////////////////////////////////////////////////////
922
      if( ui_selected_item == ITEM_R_SRC_CHN && ui_cursor_flash ) {
923
    SEQ_LCD_PrintSpaces(3);
924
      } else {
925
    if( !n->src_chn ) {
926
      SEQ_LCD_PrintString("---");
927
    } else if( n->src_chn > 16 ) {
928
      SEQ_LCD_PrintString("All");
929
    } else {
930
      SEQ_LCD_PrintFormattedString("#%2d", n->src_chn);
931
    }
932
      }
933
      SEQ_LCD_PrintSpaces(2);
934
 
935
      ///////////////////////////////////////////////////////////////////////
936
      if( ui_selected_item == ITEM_R_DST_PORT && ui_cursor_flash ) {
1746 tk 937
    if( n->dst_chn >= 18 ) {
938
      SEQ_LCD_PrintSpaces(2);
939
    } else {
940
      SEQ_LCD_PrintSpaces(4);
941
    }
826 tk 942
      } else {
1713 tk 943
    if( n->dst_chn >= 18 ) {
1746 tk 944
      SEQ_LCD_PrintSpaces(2);
1713 tk 945
    } else {
946
      SEQ_LCD_PrintString(SEQ_MIDI_PORT_OutNameGet(SEQ_MIDI_PORT_OutIxGet(n->dst_port)));
947
    }
826 tk 948
      }
949
 
950
      ///////////////////////////////////////////////////////////////////////
951
      if( ui_selected_item == ITEM_R_DST_CHN && ui_cursor_flash ) {
1746 tk 952
    if( n->dst_chn >= 18 ) {
953
      SEQ_LCD_PrintSpaces(7);
954
    } else {
955
      SEQ_LCD_PrintSpaces(5);
956
    }
826 tk 957
      } else {
958
    if( !n->dst_chn ) {
1713 tk 959
      SEQ_LCD_PrintString(" --- ");
960
    } else if( n->dst_chn == 17 ) {
961
      SEQ_LCD_PrintString(" All ");
1746 tk 962
    } else if( n->dst_chn == 18 ) {
963
      SEQ_LCD_PrintString("  Track");
964
    } else if( n->dst_chn >= 19 ) {
965
      SEQ_LCD_PrintString("Sel.Trk");
826 tk 966
    } else {
1713 tk 967
      SEQ_LCD_PrintFormattedString(" #%2d ", n->dst_chn);
826 tk 968
    }
969
      }
1713 tk 970
      SEQ_LCD_PrintSpaces(3);
826 tk 971
 
972
      ///////////////////////////////////////////////////////////////////////
1713 tk 973
      SEQ_LCD_PrintChar('|');
974
      SEQ_LCD_PrintSpaces(4);
975
 
826 tk 976
      if( ui_selected_item == ITEM_DEF_PORT && ui_cursor_flash ) {
977
    SEQ_LCD_PrintSpaces(4);
978
      } else {
979
    SEQ_LCD_PrintString(SEQ_MIDI_PORT_OutNameGet(SEQ_MIDI_PORT_OutIxGet(MIOS32_MIDI_DefaultPortGet())));
980
      }
981
      SEQ_LCD_PrintSpaces(4);
982
    } break;
983
 
1675 tk 984
 
985
  ///////////////////////////////////////////////////////////////////////////
986
    case SUBPAGE_EXT_CTRL: {
987
      SEQ_LCD_CursorSet(40, 0);
1794 tk 988
      SEQ_LCD_PrintString(" IN  OUT  Chn.|Function        ");
1675 tk 989
      if( selected_ext_ctrl < SEQ_MIDI_IN_EXT_CTRL_NUM_IX_CC ) {
990
    SEQ_LCD_PrintString("CC#      ");
991
      } else {
992
    SEQ_LCD_PrintSpaces(10);
993
      }
994
      SEQ_LCD_CursorSet(40, 1);
995
 
996
      ///////////////////////////////////////////////////////////////////////
997
      if( ui_selected_item == ITEM_EXT_PORT && ui_cursor_flash ) {
998
    SEQ_LCD_PrintSpaces(4);
999
      } else {
1000
    if( seq_midi_in_ext_ctrl_port )
1001
      SEQ_LCD_PrintString(SEQ_MIDI_PORT_InNameGet(SEQ_MIDI_PORT_InIxGet(seq_midi_in_ext_ctrl_port)));
1002
    else
1003
      SEQ_LCD_PrintString(" All");
1004
      }
1005
      SEQ_LCD_PrintSpaces(1);
1006
 
1007
      ///////////////////////////////////////////////////////////////////////
1794 tk 1008
      if( ui_selected_item == ITEM_EXT_PORT_OUT && ui_cursor_flash ) {
1009
    SEQ_LCD_PrintSpaces(4);
1010
      } else {
1011
    if( seq_midi_in_ext_ctrl_out_port )
1012
      SEQ_LCD_PrintString(SEQ_MIDI_PORT_OutNameGet(SEQ_MIDI_PORT_OutIxGet(seq_midi_in_ext_ctrl_out_port)));
1013
    else
1014
      SEQ_LCD_PrintString("off ");
1015
      }
1016
      SEQ_LCD_PrintSpaces(1);
1017
 
1018
      ///////////////////////////////////////////////////////////////////////
1675 tk 1019
      if( ui_selected_item == ITEM_EXT_CHN && ui_cursor_flash ) {
1020
    SEQ_LCD_PrintSpaces(3);
1021
      } else {
1022
    if( seq_midi_in_ext_ctrl_channel )
1023
      SEQ_LCD_PrintFormattedString("#%2d", seq_midi_in_ext_ctrl_channel);
1024
    else
1025
      SEQ_LCD_PrintString("---");
1026
      }
1794 tk 1027
      SEQ_LCD_PrintString(" |");
1675 tk 1028
 
1029
      ///////////////////////////////////////////////////////////////////////
1030
      if( ui_selected_item == ITEM_EXT_CTRL && ui_cursor_flash ) {
1031
    SEQ_LCD_PrintSpaces(15);
1032
      } else {
1033
    SEQ_LCD_PrintStringPadded((char *)SEQ_MIDI_IN_ExtCtrlStr(selected_ext_ctrl), 15);
1034
      }
1035
 
1036
 
1037
      ///////////////////////////////////////////////////////////////////////
1038
      if( ui_selected_item == ITEM_EXT_VALUE && ui_cursor_flash ) {
1039
    SEQ_LCD_PrintSpaces(10);
1040
      } else {
1041
    SEQ_LCD_PrintSpaces(1);
1042
    if( selected_ext_ctrl == SEQ_MIDI_IN_EXT_CTRL_NRPN_ENABLED ) {
1043
      SEQ_LCD_PrintStringPadded(seq_midi_in_ext_ctrl_asg[selected_ext_ctrl] ? "enabled" : "disabled", 9);
1044
    } else if( selected_ext_ctrl == SEQ_MIDI_IN_EXT_CTRL_PC_MODE ) {
1045
      SEQ_LCD_PrintStringPadded((char *)SEQ_MIDI_IN_ExtCtrlPcModeStr(seq_midi_in_ext_ctrl_asg[selected_ext_ctrl]), 9);
1046
    } else {
1047
      u8 cc = seq_midi_in_ext_ctrl_asg[selected_ext_ctrl];
1048
      if( cc >= 0x80 )
1049
        SEQ_LCD_PrintString("off");
1050
      else
1051
        SEQ_LCD_PrintFormattedString("%3d", cc);
1052
      SEQ_LCD_PrintSpaces(7);
1053
    }
1054
      }
1055
 
1056
    } break;
1057
 
1058
 
1059
  ///////////////////////////////////////////////////////////////////////////
826 tk 1060
    case SUBPAGE_MISC: {
1061
      SEQ_LCD_CursorSet(40, 0);
1794 tk 1062
      SEQ_LCD_PrintString("BLM_SCALAR                       MIDI   ");
826 tk 1063
      SEQ_LCD_CursorSet(40, 1);
1064
 
1065
      ///////////////////////////////////////////////////////////////////////
1066
      SEQ_LCD_PrintString("Port: ");
1067
      if( ui_selected_item == ITEM_BLM_SCALAR_PORT && ui_cursor_flash ) {
1068
    SEQ_LCD_PrintSpaces(4);
1069
      } else {
1020 tk 1070
    if( !seq_blm_port )
826 tk 1071
      SEQ_LCD_PrintString(" off");
1072
    else
1061 tk 1073
      SEQ_LCD_PrintString(SEQ_MIDI_PORT_InNameGet(SEQ_MIDI_PORT_InIxGet(seq_blm_port)));
826 tk 1074
      }
1075
 
1794 tk 1076
      SEQ_LCD_PrintString(blm_timeout_ctr ? " (found)  " : "          ");
1077
 
1078
      // free for new parameters
1079
      SEQ_LCD_PrintSpaces(12);
1080
 
826 tk 1081
      ///////////////////////////////////////////////////////////////////////
1082
      SEQ_LCD_PrintString("Monitor ");
1083
 
1084
    } break;
1085
  }
1086
 
406 tk 1087
  return 0; // no error
1088
}
1089
 
1090
 
1091
/////////////////////////////////////////////////////////////////////////////
1092
// Local exit function
1093
/////////////////////////////////////////////////////////////////////////////
1094
static s32 EXIT_Handler(void)
1095
{
513 tk 1096
  s32 status = 0;
406 tk 1097
 
513 tk 1098
  if( store_file_required ) {
1052 tk 1099
    // write config files
513 tk 1100
    MUTEX_SDCARD_TAKE;
1123 tk 1101
    if( (status=SEQ_FILE_C_Write(seq_file_session_name)) < 0 )
513 tk 1102
      SEQ_UI_SDCardErrMsg(2000, status);
1103
    MUTEX_SDCARD_GIVE;
1052 tk 1104
 
1105
    MUTEX_SDCARD_TAKE;
1106
    if( (status=SEQ_FILE_GC_Write()) < 0 )
1107
      SEQ_UI_SDCardErrMsg(2000, status);
1108
    MUTEX_SDCARD_GIVE;
513 tk 1109
  }
406 tk 1110
 
1111
  return status;
1112
}
1113
 
1114
 
1115
/////////////////////////////////////////////////////////////////////////////
1116
// Initialisation
1117
/////////////////////////////////////////////////////////////////////////////
1118
s32 SEQ_UI_MIDI_Init(u32 mode)
1119
{
1120
  // install callback routines
1121
  SEQ_UI_InstallButtonCallback(Button_Handler);
1122
  SEQ_UI_InstallEncoderCallback(Encoder_Handler);
1123
  SEQ_UI_InstallLEDCallback(LED_Handler);
1124
  SEQ_UI_InstallLCDCallback(LCD_Handler);
1125
  SEQ_UI_InstallExitCallback(EXIT_Handler);
1126
 
513 tk 1127
  store_file_required = 0;
1128
 
406 tk 1129
  return 0; // no error
1130
}