Example #1
0
/////////////////////////////////////////////////////////////////////////////
// resets all note stacks
/////////////////////////////////////////////////////////////////////////////
s32 SEQ_MIDI_IN_ResetAllStacks(void)
{
  s32 status = 0;

  status |= SEQ_MIDI_IN_ResetTransArpStacks();
  status |= SEQ_MIDI_IN_ResetChangerStacks();

  return status;
}
/////////////////////////////////////////////////////////////////////////////
// Local encoder callback function
// Should return:
//   1 if value has been changed
//   0 if value hasn't been changed
//  -1 if invalid or unsupported encoder
/////////////////////////////////////////////////////////////////////////////
static s32 Encoder_Handler(seq_ui_encoder_t encoder, s32 incrementer)
{
  seq_midi_router_node_t *n = &seq_midi_router_node[selected_router_node];

  if( encoder <= SEQ_UI_ENCODER_GP8 ) {
    switch( encoder ) {
    case SEQ_UI_ENCODER_GP1:
    case SEQ_UI_ENCODER_GP2:
      selected_subpage = SUBPAGE_TRANSPOSE;
      ui_selected_item = ITEM_IN_BUS;
      break;

    case SEQ_UI_ENCODER_GP3:
    case SEQ_UI_ENCODER_GP4:
      selected_subpage = SUBPAGE_SECTIONS;
      ui_selected_item = ITEM_S_PORT;
      break;

    case SEQ_UI_ENCODER_GP5:
    case SEQ_UI_ENCODER_GP6:
      selected_subpage = SUBPAGE_ROUTER;
      ui_selected_item = ITEM_R_NODE;
      break;

    case SEQ_UI_ENCODER_GP7:
      selected_subpage = SUBPAGE_EXT_CTRL;
      ui_selected_item = ITEM_EXT_PORT;
      break;

    default:
      selected_subpage = SUBPAGE_MISC;
      ui_selected_item = ITEM_BLM_SCALAR_PORT;
    }

    return 1;
  }

  switch( selected_subpage ) {
    case SUBPAGE_TRANSPOSE:
      switch( encoder ) {
        case SEQ_UI_ENCODER_GP9:
	  ui_selected_item = ITEM_IN_BUS;
	  break;

        case SEQ_UI_ENCODER_GP10:
	  ui_selected_item = ITEM_IN_PORT;
	  break;

        case SEQ_UI_ENCODER_GP11:
	  ui_selected_item = ITEM_IN_CHN;
	  break;

        case SEQ_UI_ENCODER_GP12:
	  ui_selected_item = ITEM_IN_LOWER;
	  break;

        case SEQ_UI_ENCODER_GP13:
	  ui_selected_item = ITEM_IN_UPPER;
	  break;

        case SEQ_UI_ENCODER_GP14:
	  ui_selected_item = ITEM_IN_MODE;
	  break;

        case SEQ_UI_ENCODER_GP15:
	  return -1; // not mapped

        case SEQ_UI_ENCODER_GP16:
	  ui_selected_item = ITEM_RESET_STACKS;
	  break;
      }
      break;

    case SUBPAGE_SECTIONS:
      switch( encoder ) {
        case SEQ_UI_ENCODER_GP9:
	  ui_selected_item = ITEM_S_PORT;
	  break;

        case SEQ_UI_ENCODER_GP10:
	  ui_selected_item = ITEM_S_CHN;
	  break;

        case SEQ_UI_ENCODER_GP11:
	  ui_selected_item = ITEM_S_OCT_G1;
	  break;

        case SEQ_UI_ENCODER_GP12:
	  ui_selected_item = ITEM_S_OCT_G2;
	  break;

        case SEQ_UI_ENCODER_GP13:
	  ui_selected_item = ITEM_S_OCT_G3;
	  break;

        case SEQ_UI_ENCODER_GP14:
	  ui_selected_item = ITEM_S_OCT_G4;
	  break;

        case SEQ_UI_ENCODER_GP15:
	  ui_selected_item = ITEM_S_FWD_PORT;
	  break;

        case SEQ_UI_ENCODER_GP16:
	  ui_selected_item = ITEM_S_RESET_STACKS;
	  break;
      }
      break;

    case SUBPAGE_ROUTER:
      switch( encoder ) {
        case SEQ_UI_ENCODER_GP9:
	  ui_selected_item = ITEM_R_NODE;
	  break;

        case SEQ_UI_ENCODER_GP10:
	  ui_selected_item = ITEM_R_SRC_PORT;
	  break;

        case SEQ_UI_ENCODER_GP11:
	  ui_selected_item = ITEM_R_SRC_CHN;
	  break;

        case SEQ_UI_ENCODER_GP12:
	  ui_selected_item = ITEM_R_DST_PORT;
	  break;

        case SEQ_UI_ENCODER_GP13:
	  ui_selected_item = ITEM_R_DST_CHN;
	  break;

        case SEQ_UI_ENCODER_GP14:
	  return -1; // not used (yet)

        case SEQ_UI_ENCODER_GP15:
        case SEQ_UI_ENCODER_GP16:
	  ui_selected_item = ITEM_DEF_PORT;
	  break;
      }
      break;

    case SUBPAGE_EXT_CTRL:
      switch( encoder ) {
        case SEQ_UI_ENCODER_GP9:
	  ui_selected_item = ITEM_EXT_PORT;
	  break;

        case SEQ_UI_ENCODER_GP10:
	  ui_selected_item = ITEM_EXT_PORT_OUT;
	  break;

        case SEQ_UI_ENCODER_GP11:
	  ui_selected_item = ITEM_EXT_CHN;
	  break;

        case SEQ_UI_ENCODER_GP12:
        case SEQ_UI_ENCODER_GP13:
        case SEQ_UI_ENCODER_GP14:
	  ui_selected_item = ITEM_EXT_CTRL;
	  break;

        case SEQ_UI_ENCODER_GP15:
        case SEQ_UI_ENCODER_GP16:
	  ui_selected_item = ITEM_EXT_VALUE;
	  break;
      }
      break;

    case SUBPAGE_MISC:
      switch( encoder ) {
        case SEQ_UI_ENCODER_GP9:
        case SEQ_UI_ENCODER_GP10:
	  ui_selected_item = ITEM_BLM_SCALAR_PORT;
	  break;

        case SEQ_UI_ENCODER_GP11:
        case SEQ_UI_ENCODER_GP12:
        case SEQ_UI_ENCODER_GP13:
        case SEQ_UI_ENCODER_GP14:
	  return -1; // not used (yet)

        case SEQ_UI_ENCODER_GP15:
        case SEQ_UI_ENCODER_GP16:
	  // enter midi monitor page
	  SEQ_UI_PageSet(SEQ_UI_PAGE_MIDIMON);
	  return 1;
      }
      break;

    default:
      return -1; // unsupported subpage
  }

  // for GP encoders and Datawheel
  switch( ui_selected_item ) {
    case ITEM_IN_BUS: {
      if( SEQ_UI_Var8_Inc(&selected_bus, 0, SEQ_MIDI_IN_NUM_BUSSES-1, incrementer) >= 0 ) {
	return 1; // value changed
      }
      return 0; // no change
    } break;

    case ITEM_IN_PORT: {
      u8 port_ix = SEQ_MIDI_PORT_InIxGet(seq_midi_in_port[selected_bus]);
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_InNumGet()-1-4, incrementer) >= 0 ) { // don't allow selection of Bus1..Bus4
	seq_midi_in_port[selected_bus] = SEQ_MIDI_PORT_InPortGet(port_ix);
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    } break;

    case ITEM_IN_CHN:
      if( SEQ_UI_Var8_Inc(&seq_midi_in_channel[selected_bus], 0, 16, incrementer) >= 0 ) {
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change

    case ITEM_IN_LOWER:
      if( SEQ_UI_Var8_Inc(&seq_midi_in_lower[selected_bus], 0, 127, incrementer) >= 0 ) {
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change

    case ITEM_IN_UPPER:
      if( SEQ_UI_Var8_Inc(&seq_midi_in_upper[selected_bus], 0, 127, incrementer) >= 0 ) {
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change

    case ITEM_IN_MODE: {
      u8 fwd = seq_midi_in_options[selected_bus].MODE_PLAY;
      if( SEQ_UI_Var8_Inc(&fwd, 0, 1, incrementer) >= 0 ) {
	seq_midi_in_options[selected_bus].MODE_PLAY = fwd;
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    } break;

    case ITEM_RESET_STACKS: {
      SEQ_MIDI_IN_ResetTransArpStacks();
      SEQ_UI_Msg(SEQ_UI_MSG_USER_R, 2000, "Transposer/Arp.", "Stacks cleared!");

      // send to external
      SEQ_MIDI_IN_ExtCtrlSend(SEQ_MIDI_IN_EXT_CTRL_ALL_NOTES_OFF, 127, 0);

      return 1;
    } break;


    case ITEM_S_PORT: {
      u8 port_ix = SEQ_MIDI_PORT_InIxGet(seq_midi_in_sect_port);
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_InNumGet()-1, incrementer) >= 0 ) {
	seq_midi_in_sect_port = SEQ_MIDI_PORT_InPortGet(port_ix);
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    } break;

    case ITEM_S_CHN:
      if( SEQ_UI_Var8_Inc(&seq_midi_in_sect_channel, 0, 16, incrementer) >= 0 ) {
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change


    case ITEM_S_OCT_G1: {
      u8 oct = seq_midi_in_sect_note[0] / 12;
      if( SEQ_UI_Var8_Inc(&oct, 0, 11, incrementer) >= 0 ) {
	seq_midi_in_sect_note[0] = 12*oct;
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    } break;

    case ITEM_S_OCT_G2: {
      u8 oct = seq_midi_in_sect_note[1] / 12;
      if( SEQ_UI_Var8_Inc(&oct, 0, 11, incrementer) >= 0 ) {
	seq_midi_in_sect_note[1] = 12*oct;
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    } break;

    case ITEM_S_OCT_G3: {
      u8 oct = seq_midi_in_sect_note[2] / 12;
      if( SEQ_UI_Var8_Inc(&oct, 0, 11, incrementer) >= 0 ) {
	seq_midi_in_sect_note[2] = 12*oct;
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    } break;

    case ITEM_S_OCT_G4: {
      u8 oct = seq_midi_in_sect_note[3] / 12;
      if( SEQ_UI_Var8_Inc(&oct, 0, 11, incrementer) >= 0 ) {
	seq_midi_in_sect_note[3] = 12*oct;
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    } break;

    case ITEM_S_FWD_PORT: {
      u8 port_ix = SEQ_MIDI_PORT_OutIxGet(seq_midi_in_sect_fwd_port);
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_OutNumGet()-1, incrementer) >= 0 ) {
	seq_midi_in_sect_fwd_port = SEQ_MIDI_PORT_OutPortGet(port_ix);
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    } break;

    case ITEM_S_RESET_STACKS: {
      SEQ_MIDI_IN_ResetChangerStacks();
      SEQ_UI_Msg(SEQ_UI_MSG_USER_R, 2000, "Section Changer", "Stacks cleared!");

      // send to external
      SEQ_MIDI_IN_ExtCtrlSend(SEQ_MIDI_IN_EXT_CTRL_ALL_NOTES_OFF, 127, 0);

      return 1;
    } break;



    case ITEM_R_NODE:
      if( SEQ_UI_Var8_Inc(&selected_router_node, 0, SEQ_MIDI_ROUTER_NUM_NODES-1, incrementer) >= 0 ) {
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change

    case ITEM_R_SRC_PORT: {
      u8 port_ix = SEQ_MIDI_PORT_InIxGet(n->src_port);
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_InNumGet()-1, incrementer) >= 0 ) {
	n->src_port = SEQ_MIDI_PORT_InPortGet(port_ix);
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    } break;

    case ITEM_R_SRC_CHN:
      if( SEQ_UI_Var8_Inc(&n->src_chn, 0, 17, incrementer) >= 0 ) {
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change

    case ITEM_R_DST_PORT: {
      u8 port_ix = SEQ_MIDI_PORT_OutIxGet(n->dst_port);
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_OutNumGet()-1, incrementer) >= 0 ) {
	n->dst_port = SEQ_MIDI_PORT_OutPortGet(port_ix);
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    } break;

    case ITEM_R_DST_CHN:
      if( SEQ_UI_Var8_Inc(&n->dst_chn, 0, 19, incrementer) >= 0 ) {
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change


    case ITEM_DEF_PORT: {
      u8 port_ix = SEQ_MIDI_PORT_OutIxGet(MIOS32_MIDI_DefaultPortGet());
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_OutNumGet()-1, incrementer) >= 0 ) {
	MIOS32_MIDI_DefaultPortSet(SEQ_MIDI_PORT_OutPortGet(port_ix));
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    } break;

    case ITEM_EXT_PORT: {
      u8 numPorts = SEQ_MIDI_PORT_InNumGet();
      u8 port_ix = (seq_midi_in_ext_ctrl_port == 0xff) ? numPorts : SEQ_MIDI_PORT_InIxGet(seq_midi_in_ext_ctrl_port);
      if( SEQ_UI_Var8_Inc(&port_ix, 0, numPorts, incrementer) >= 0 ) {
	seq_midi_in_ext_ctrl_port = (port_ix == numPorts) ? 0xff : SEQ_MIDI_PORT_InPortGet(port_ix);
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    } break;

    case ITEM_EXT_PORT_OUT: {
      u8 port_ix = SEQ_MIDI_PORT_OutIxGet(seq_midi_in_ext_ctrl_out_port);
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_OutNumGet()-1, incrementer) >= 0 ) {
	seq_midi_in_ext_ctrl_out_port = SEQ_MIDI_PORT_OutPortGet(port_ix);
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    } break;

    case ITEM_EXT_CHN:
      if( SEQ_UI_Var8_Inc(&seq_midi_in_ext_ctrl_channel, 0, 16, incrementer) >= 0 ) {
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change

    case ITEM_EXT_CTRL:
      if( SEQ_UI_Var8_Inc(&selected_ext_ctrl, 0, SEQ_MIDI_IN_EXT_CTRL_NUM-1, incrementer) >= 0 ) {
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change

    case ITEM_EXT_VALUE:
      if( selected_ext_ctrl == SEQ_MIDI_IN_EXT_CTRL_NRPN_ENABLED ) {
	if( SEQ_UI_Var8_Inc(&seq_midi_in_ext_ctrl_asg[selected_ext_ctrl], 0, 1, incrementer) >= 0 ) {
	  store_file_required = 1;
	  return 1; // value changed
	}
      } else if( selected_ext_ctrl == SEQ_MIDI_IN_EXT_CTRL_PC_MODE ) {
	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 ) {
	  store_file_required = 1;
	  return 1; // value changed
	}
      } else if( selected_ext_ctrl <= SEQ_MIDI_IN_EXT_CTRL_NUM ) {
	if( SEQ_UI_Var8_Inc(&seq_midi_in_ext_ctrl_asg[selected_ext_ctrl], 0, 128, incrementer) >= 0 ) {
	  store_file_required = 1;
	  return 1; // value changed
	}
      }
      return 0; // no change

    case ITEM_BLM_SCALAR_PORT: {
      u8 port_ix = SEQ_MIDI_PORT_InIxGet(seq_blm_port);
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_InNumGet()-1, incrementer) >= 0 ) {
	seq_blm_port = SEQ_MIDI_PORT_InPortGet(port_ix);
	MUTEX_MIDIOUT_TAKE;
	blm_timeout_ctr = 0; // fake timeout (so that "BLM not found" message will be displayed)
	SEQ_BLM_SYSEX_SendRequest(0x00); // request layout from BLM_SCALAR
	MUTEX_MIDIOUT_GIVE;
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    } break;
  }

  return -1; // invalid or unsupported encoder
}
/////////////////////////////////////////////////////////////////////////////
// Local encoder callback function
// Should return:
//   1 if value has been changed
//   0 if value hasn't been changed
//  -1 if invalid or unsupported encoder
/////////////////////////////////////////////////////////////////////////////
static s32 Encoder_Handler(seq_ui_encoder_t encoder, s32 incrementer)
{
  // ensure that original record screen will be print immediately
  ui_hold_msg_ctr = 0;

  switch( encoder ) {
    case SEQ_UI_ENCODER_GP1:
      ui_selected_item = ITEM_GXTY;
      break;

    case SEQ_UI_ENCODER_GP2:
      ui_selected_item = ITEM_MUTE;
      break;

    case SEQ_UI_ENCODER_GP3:
      ui_selected_item = ITEM_OCT_TRANSPOSE;
      break;

    case SEQ_UI_ENCODER_GP4:
      ui_selected_item = ITEM_LIVE_VELOCITY;
      break;

    case SEQ_UI_ENCODER_GP5:
      ui_selected_item = ITEM_LIVE_FORCE_SCALE;
      break;

    case SEQ_UI_ENCODER_GP6:
      ui_selected_item = ITEM_LIVE_FX;
      break;

    case SEQ_UI_ENCODER_GP7:
    case SEQ_UI_ENCODER_GP8:
      return 0; // not mapped (yet)
      break;

    case SEQ_UI_ENCODER_GP9:
      ui_selected_item = ITEM_IN_BUS;
      break;

    case SEQ_UI_ENCODER_GP10:
      ui_selected_item = ITEM_IN_PORT;
      break;

    case SEQ_UI_ENCODER_GP11:
      ui_selected_item = ITEM_IN_CHN;
      break;

    case SEQ_UI_ENCODER_GP12:
      ui_selected_item = ITEM_IN_LOWER;
      break;

    case SEQ_UI_ENCODER_GP13:
      ui_selected_item = ITEM_IN_UPPER;
      break;

    case SEQ_UI_ENCODER_GP14:
      ui_selected_item = ITEM_IN_MODE;
      break;

    case SEQ_UI_ENCODER_GP15:
      return -1; // not mapped

    case SEQ_UI_ENCODER_GP16:
      ui_selected_item = ITEM_RESET_STACKS;
      break;
  }

  // for GP encoders and Datawheel
  switch( ui_selected_item ) {
    case ITEM_GXTY: {
      if( !seq_midi_in_options[selected_bus].MODE_PLAY )
	return -1;
      return SEQ_UI_GxTyInc(incrementer);
    }

    case ITEM_MUTE: {
      if( !seq_midi_in_options[selected_bus].MODE_PLAY )
	return -1;

      u8 visible_track = SEQ_UI_VisibleTrackGet();
      u16 mask = 1 << visible_track;

      if( incrementer < 0 )
	seq_core_trk_muted |= mask;
      else
	seq_core_trk_muted &= ~mask;
      return 1; // value changed
    } break;

    case ITEM_OCT_TRANSPOSE: {
      if( !seq_midi_in_options[selected_bus].MODE_PLAY )
	return -1;

      u8 tmp = seq_live_options.OCT_TRANSPOSE + 5;
      if( SEQ_UI_Var8_Inc(&tmp, 0, 10, incrementer) >= 0 ) {
	seq_live_options.OCT_TRANSPOSE = (s8)tmp - 5;
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    } break;

    case ITEM_LIVE_VELOCITY: {
      if( !seq_midi_in_options[selected_bus].MODE_PLAY )
	return -1;

      if( SEQ_UI_Var8_Inc(&seq_live_options.VELOCITY, 1, 127, incrementer) >= 0 ) {
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    }

    case ITEM_LIVE_FORCE_SCALE: {
      if( !seq_midi_in_options[selected_bus].MODE_PLAY )
	return -1;

      u8 tmp = seq_live_options.FORCE_SCALE;
      if( SEQ_UI_Var8_Inc(&tmp, 0, 1, incrementer) >= 0 ) {
	seq_live_options.FORCE_SCALE = tmp;
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    }

    case ITEM_LIVE_FX: {
      if( !seq_midi_in_options[selected_bus].MODE_PLAY )
	return -1;

      u8 tmp = seq_live_options.FX;
      if( SEQ_UI_Var8_Inc(&tmp, 0, 1, incrementer) >= 0 ) {
	seq_live_options.FX = tmp;
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    }

    case ITEM_IN_BUS: {
      if( SEQ_UI_Var8_Inc(&selected_bus, 0, SEQ_MIDI_IN_NUM_BUSSES-1, incrementer) >= 0 ) {
	return 1; // value changed
      }
      return 0; // no change
    } break;

    case ITEM_IN_PORT: {
      u8 port_ix = SEQ_MIDI_PORT_InIxGet(seq_midi_in_port[selected_bus]);
      if( SEQ_UI_Var8_Inc(&port_ix, 0, SEQ_MIDI_PORT_InNumGet()-1-4, incrementer) >= 0 ) { // don't allow selection of Bus1..Bus4
	seq_midi_in_port[selected_bus] = SEQ_MIDI_PORT_InPortGet(port_ix);
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    } break;

    case ITEM_IN_CHN:
      if( SEQ_UI_Var8_Inc(&seq_midi_in_channel[selected_bus], 0, 16, incrementer) >= 0 ) {
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change

    case ITEM_IN_LOWER:
      if( SEQ_UI_Var8_Inc(&seq_midi_in_lower[selected_bus], 0, 127, incrementer) >= 0 ) {
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change

    case ITEM_IN_UPPER:
      if( SEQ_UI_Var8_Inc(&seq_midi_in_upper[selected_bus], 0, 127, incrementer) >= 0 ) {
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change

    case ITEM_IN_MODE: {
      u8 fwd = seq_midi_in_options[selected_bus].MODE_PLAY;
      if( SEQ_UI_Var8_Inc(&fwd, 0, 1, incrementer) >= 0 ) {
	seq_midi_in_options[selected_bus].MODE_PLAY = fwd;
	store_file_required = 1;
	return 1; // value changed
      }
      return 0; // no change
    } break;

    case ITEM_RESET_STACKS: {
      SEQ_MIDI_IN_ResetTransArpStacks();
      SEQ_UI_Msg(SEQ_UI_MSG_USER_R, 2000, "Transposer/Arp.", "Stacks cleared!");
      return 1;
    } break;
  }

  return -1; // invalid or unsupported encoder
}