Subversion Repositories svn.mios32

Rev

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

Rev Author Line No. Line
473 tk 1
// $Id: seq_ui_trkmorph.c 1794 2013-05-31 19:25:43Z tk $
2
/*
3
 * Track Morphing 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 <string.h>
20
#include "seq_lcd.h"
21
#include "seq_ui.h"
22
#include "seq_cc.h"
23
#include "seq_morph.h"
690 tk 24
#include "seq_midi_port.h"
473 tk 25
#include "seq_midi_in.h"
26
 
27
 
28
/////////////////////////////////////////////////////////////////////////////
29
// Local definitions
30
/////////////////////////////////////////////////////////////////////////////
31
 
32
#define NUM_OF_ITEMS           4
33
#define ITEM_GXTY              0
34
#define ITEM_MORPH_MODE        1
607 tk 35
#define ITEM_MORPH_DST         2
473 tk 36
#define ITEM_MORPH_VALUE       3
37
 
38
 
39
/////////////////////////////////////////////////////////////////////////////
40
// Local LED handler function
41
/////////////////////////////////////////////////////////////////////////////
42
static s32 LED_Handler(u16 *gp_leds)
43
{
44
  *gp_leds = ((2 << (SEQ_MORPH_ValueGet() / 16))-1) << 8;
45
 
46
  if( ui_cursor_flash ) { // if flashing flag active: no LED flag set
47
    if( ui_selected_item == ITEM_MORPH_VALUE ) // flashes only if selected, otherwise permanently active
48
      *gp_leds = 0;
49
    return 0;
50
  }
51
 
52
  switch( ui_selected_item ) {
53
    case ITEM_GXTY: *gp_leds |= 0x0001; break;
54
    case ITEM_MORPH_MODE: *gp_leds |= 0x0002; break;
607 tk 55
    case ITEM_MORPH_DST: *gp_leds |= 0x000c; break;
473 tk 56
    case ITEM_MORPH_VALUE: *gp_leds |= 0x0080; break;
57
  }
58
 
59
  return 0; // no error
60
}
61
 
62
 
63
/////////////////////////////////////////////////////////////////////////////
64
// Local encoder callback function
65
// Should return:
66
//   1 if value has been changed
67
//   0 if value hasn't been changed
68
//  -1 if invalid or unsupported encoder
69
/////////////////////////////////////////////////////////////////////////////
70
static s32 Encoder_Handler(seq_ui_encoder_t encoder, s32 incrementer)
71
{
72
  switch( encoder ) {
73
    case SEQ_UI_ENCODER_GP1:
74
      ui_selected_item = ITEM_GXTY;
75
      break;
76
 
77
    case SEQ_UI_ENCODER_GP2:
78
      ui_selected_item = ITEM_MORPH_MODE;
79
      break;
80
 
81
    case SEQ_UI_ENCODER_GP3:
607 tk 82
    case SEQ_UI_ENCODER_GP4:
83
      ui_selected_item = ITEM_MORPH_DST;
473 tk 84
      break;
85
 
86
    case SEQ_UI_ENCODER_GP5:
87
    case SEQ_UI_ENCODER_GP6:
88
    case SEQ_UI_ENCODER_GP7:
89
      return -1; // not used (yet)
90
 
91
    case SEQ_UI_ENCODER_GP8:
92
    case SEQ_UI_ENCODER_GP9:
93
    case SEQ_UI_ENCODER_GP10:
94
    case SEQ_UI_ENCODER_GP11:
95
    case SEQ_UI_ENCODER_GP12:
96
    case SEQ_UI_ENCODER_GP13:
97
    case SEQ_UI_ENCODER_GP14:
98
    case SEQ_UI_ENCODER_GP15:
99
    case SEQ_UI_ENCODER_GP16:
100
      ui_selected_item = ITEM_MORPH_VALUE;
101
      break;
102
  }
103
 
104
  // for GP encoders and Datawheel
105
  switch( ui_selected_item ) {
106
    case ITEM_GXTY:          return SEQ_UI_GxTyInc(incrementer);
107
    case ITEM_MORPH_MODE:    return SEQ_UI_CC_Inc(SEQ_CC_MORPH_MODE, 0, 1, incrementer);
607 tk 108
    case ITEM_MORPH_DST:     return SEQ_UI_CC_Inc(SEQ_CC_MORPH_DST, 0, 255, incrementer);
473 tk 109
    case ITEM_MORPH_VALUE:   {
110
      u8 value = SEQ_MORPH_ValueGet();
111
      if( SEQ_UI_Var8_Inc(&value, 0, 127, incrementer) > 0 ) {
112
    SEQ_MORPH_ValueSet(value);
1794 tk 113
 
114
    // send to external
115
    SEQ_MIDI_IN_ExtCtrlSend(SEQ_MIDI_IN_EXT_CTRL_MORPH, value);
116
 
473 tk 117
    return 1;
118
      }
119
      return 0;
120
    } break;
121
  }
122
 
123
  return -1; // invalid or unsupported encoder
124
}
125
 
126
 
127
/////////////////////////////////////////////////////////////////////////////
128
// Local button callback function
129
// Should return:
130
//   1 if value has been changed
131
//   0 if value hasn't been changed
132
//  -1 if invalid or unsupported button
133
/////////////////////////////////////////////////////////////////////////////
134
static s32 Button_Handler(seq_ui_button_t button, s32 depressed)
135
{
136
  if( depressed ) return 0; // ignore when button depressed
137
 
138
  switch( button ) {
139
    case SEQ_UI_BUTTON_GP1:
140
      ui_selected_item = ITEM_GXTY;
141
      return 1;
142
 
143
    case SEQ_UI_BUTTON_GP2:
144
      ui_selected_item = ITEM_MORPH_MODE;
145
      break;
146
 
147
    case SEQ_UI_BUTTON_GP3:
607 tk 148
    case SEQ_UI_BUTTON_GP4:
149
      ui_selected_item = ITEM_MORPH_DST;
473 tk 150
      break;
151
 
152
    case SEQ_UI_BUTTON_GP5:
153
    case SEQ_UI_BUTTON_GP6:
154
    case SEQ_UI_BUTTON_GP7:
155
      return -1; // not used (yet)
156
 
157
    case SEQ_UI_BUTTON_GP8:
158
      ui_selected_item = ITEM_MORPH_VALUE;
159
      break;
160
 
161
    case SEQ_UI_BUTTON_GP9:
162
    case SEQ_UI_BUTTON_GP10:
163
    case SEQ_UI_BUTTON_GP11:
164
    case SEQ_UI_BUTTON_GP12:
165
    case SEQ_UI_BUTTON_GP13:
166
    case SEQ_UI_BUTTON_GP14:
167
    case SEQ_UI_BUTTON_GP15:
168
    case SEQ_UI_BUTTON_GP16:
169
      // direct morph value selection
170
      SEQ_MORPH_ValueSet(((u8)button-SEQ_UI_BUTTON_GP9) * 16);
171
      return 1; // value always changed
172
 
173
    case SEQ_UI_BUTTON_Select:
174
    case SEQ_UI_BUTTON_Right:
175
      if( ++ui_selected_item >= NUM_OF_ITEMS )
176
    ui_selected_item = 0;
177
 
178
      return 1; // value always changed
179
 
180
    case SEQ_UI_BUTTON_Left:
181
      if( ui_selected_item == 0 )
182
    ui_selected_item = NUM_OF_ITEMS-1;
1142 tk 183
      else
184
    --ui_selected_item;
473 tk 185
      return 1; // value always changed
186
 
187
    case SEQ_UI_BUTTON_Up:
188
      return Encoder_Handler(SEQ_UI_ENCODER_Datawheel, 1);
189
 
190
    case SEQ_UI_BUTTON_Down:
191
      return Encoder_Handler(SEQ_UI_ENCODER_Datawheel, -1);
192
  }
193
 
194
  return -1; // invalid or unsupported button
195
}
196
 
197
 
198
/////////////////////////////////////////////////////////////////////////////
199
// Local Display Handler function
200
// IN: <high_prio>: if set, a high-priority LCD update is requested
201
/////////////////////////////////////////////////////////////////////////////
202
static s32 LCD_Handler(u8 high_prio)
203
{
204
  if( high_prio )
205
    return 0; // there are no high-priority updates
206
 
207
  // layout:
208
  // 00000000001111111111222222222233333333330000000000111111111122222222223333333333
209
  // 01234567890123456789012345678901234567890123456789012345678901234567890123456789
210
  // <--------------------------------------><-------------------------------------->
1675 tk 211
  // Trk. Mode  Dst.Range               ValueMorphing controlled by All /Chn 1 CC#  1
607 tk 212
  // G1T1  on    17..32                  100    <######################          >
473 tk 213
 
214
 
215
  u8 visible_track = SEQ_UI_VisibleTrackGet();
216
 
217
  ///////////////////////////////////////////////////////////////////////////
218
  SEQ_LCD_CursorSet(0, 0);
219
 
1675 tk 220
  SEQ_LCD_PrintString("Trk. Mode  Dst.Range               Value");
473 tk 221
 
1675 tk 222
  if( !seq_midi_in_ext_ctrl_channel || seq_midi_in_ext_ctrl_asg[SEQ_MIDI_IN_EXT_CTRL_MORPH] >= 0x80 ) {
223
    SEQ_LCD_PrintString("Please enable Ext. Ctrl in the MIDI page");
224
  } else {
225
    SEQ_LCD_PrintFormattedString("Morphing controlled by %s/Chn%2d CC#%3d",
226
                 seq_midi_in_ext_ctrl_port ? SEQ_MIDI_PORT_InNameGet(SEQ_MIDI_PORT_InIxGet(seq_midi_in_ext_ctrl_port)) : " All",
227
                 seq_midi_in_ext_ctrl_channel,
228
                 seq_midi_in_ext_ctrl_asg[SEQ_MIDI_IN_EXT_CTRL_MORPH]);
229
  }
230
 
473 tk 231
  ///////////////////////////////////////////////////////////////////////////
232
  SEQ_LCD_CursorSet(0, 1);
233
 
234
  if( ui_selected_item == ITEM_GXTY && ui_cursor_flash ) {
235
    SEQ_LCD_PrintSpaces(4);
236
  } else {
237
    SEQ_LCD_PrintGxTy(ui_selected_group, ui_selected_tracks);
238
  }
239
  SEQ_LCD_PrintSpaces(2);
240
 
241
  ///////////////////////////////////////////////////////////////////////////
242
  if( ui_selected_item == ITEM_MORPH_MODE && ui_cursor_flash ) {
243
    SEQ_LCD_PrintSpaces(3);
244
  } else {
245
    SEQ_LCD_PrintString(SEQ_CC_Get(visible_track, SEQ_CC_MORPH_MODE) ? "on " : "off");
246
  }
607 tk 247
  SEQ_LCD_PrintSpaces(2);
473 tk 248
 
249
  ///////////////////////////////////////////////////////////////////////////
607 tk 250
  if( ui_selected_item == ITEM_MORPH_DST && ui_cursor_flash ) {
251
    SEQ_LCD_PrintSpaces(8);
473 tk 252
  } else {
607 tk 253
    int dst_begin = SEQ_CC_Get(visible_track, SEQ_CC_MORPH_DST) + 1;
254
    int dst_end = dst_begin + SEQ_CC_Get(visible_track, SEQ_CC_LENGTH);
255
    if( dst_end > 256 )
256
      dst_end = 256;
257
 
258
    SEQ_LCD_PrintFormattedString("%3d..%d  ", dst_begin, dst_end);
473 tk 259
  }
607 tk 260
  SEQ_LCD_CursorSet(19, 1); // set back cursor
718 tk 261
  SEQ_LCD_PrintSpaces(17);
473 tk 262
 
263
  ///////////////////////////////////////////////////////////////////////////
264
  if( ui_selected_item == ITEM_MORPH_VALUE && ui_cursor_flash ) {
265
    SEQ_LCD_PrintSpaces(4);
266
  } else {
267
    SEQ_LCD_PrintFormattedString("%3d ", SEQ_MORPH_ValueGet());
268
  }
269
 
270
  ///////////////////////////////////////////////////////////////////////////
271
  SEQ_LCD_PrintString("   <");
272
  SEQ_LCD_PrintLongHBar(SEQ_MORPH_ValueGet());
273
  SEQ_LCD_PrintString(">   ");
274
 
275
  return 0; // no error
276
}
277
 
278
 
279
/////////////////////////////////////////////////////////////////////////////
280
// Initialisation
281
/////////////////////////////////////////////////////////////////////////////
282
s32 SEQ_UI_TRKMORPH_Init(u32 mode)
283
{
284
  // install callback routines
285
  SEQ_UI_InstallButtonCallback(Button_Handler);
286
  SEQ_UI_InstallEncoderCallback(Encoder_Handler);
287
  SEQ_UI_InstallLEDCallback(LED_Handler);
288
  SEQ_UI_InstallLCDCallback(LCD_Handler);
289
 
290
  // we want to show a horizontal morph meter
291
  SEQ_LCD_InitSpecialChars(SEQ_LCD_CHARSET_HBars);
292
 
293
  return 0; // no error
294
}