aboutsummaryrefslogtreecommitdiff
path: root/rhodes.lua
blob: fc88e35d73bf0c10bea103564731c896ef790195 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
-- midi fm rhodes
--
-- key 2: play a C4

engine.name = "Rhodes"

local MusicUtil = require "musicutil"
local ControlSpec = require "controlspec"

function redraw()
  screen.clear()
  screen.move(64, 32)
  screen.text_center("rhodes.")
  screen.update()
end

function init ()
  local mod_wheel_controls = 2
  local base_mod_index = 0.1
  local base_trem_speed = 2.0
  local base_trem_depth = 0.1
  local operator_mix = 0.2

  local m = nil
  local midi_event = function (a)
    b = midi.to_msg(a)
    if b.type == "note_on" then
      engine.note_on(b.note, b.vel or 60)
    elseif b.type == "note_off" then
      engine.note_off(b.note)
    end
    -- mod wheel
    if b.type == "cc" and b.ch == 1 then
      if mod_wheel_controls == 1 then
	engine.set_mod_index(base_mod_index + (b.val / 127) * (1.0 - base_mod_index))
      elseif mod_wheel_controls == 2 then
	engine.set_lfo_speed(base_trem_speed + (b.val / 127) * (60.0 - base_trem_speed))
      elseif mod_wheel_controls == 3 then
	engine.set_lfo_depth(base_trem_depth + (b.val / 127) * (1.0 - base_trem_depth))
      end
    end
  end

  -- midi settings
  params:add({
    type = "option",
    id = "mod_controls",
    name = "Mod Wheel",
    default = mod_wheel_controls,
    options={"Mod Index", "Tremolo Speed", "Tremolo Depth"},
    action = function(value) do
	mod_wheel_controls = value;
	engine.set_mod_index(base_mod_index);
	engine.set_lfo_speed(base_trem_speed);
	engine.set_lfo_depth(base_trem_depth);
     end
  end})
  params:add({
    type = "control",
    id = "midi_in_vport",
    name = "Midi In",
    default=60,
    controlspec = ControlSpec.new(1, 4, 'lin', 1, 1),
    action = function(value)
      -- clear the old connection
      if m then
	m.event = nil
      end
      m = midi.connect(value)
      m.event = midi_event
  end})
  params:add_separator()

  -- modulation settings
  params:add({
    type = "control",
    id = "base_mod_index",
    name = "Mod Index",
    controlspec = ControlSpec.new(0.0, 100.0, 'lin', 0.5, base_mod_index * 100.0, "%"),
    action = function(value) do
	base_mod_index = value/100.0;
	engine.set_mod_index(value/100.0);
    end
  end})
  params:add({
    type = "control",
    id = "operator_mix",
    name = "Operator Mix",
    controlspec = ControlSpec.new(0.0, 100.0, 'lin', 0.1, operator_mix * 100.0, "%"),
    action = function(value) do
	operator_mix = value/100.0;
	engine.set_mix(value/100.0);
    end
  end})
  params:add_separator()

  -- tremolo
  params:add({
    type = "control",
    id = "base_trem_speed",
    name = "Tremolo Speed",
    controlspec = ControlSpec.new(0.001, 60.0, 'lin', 0.1, base_trem_speed, "hz"),
    action = function(value) do
	base_trem_speed = value;
	engine.set_lfo_speed(value);
    end
  end})
  params:add({
    type = "control",
    id = "base_trem_depth",
    name = "Tremolo Depth",
    controlspec = ControlSpec.new(0.00, 100.0, 'lin', 0.1, base_trem_depth * 100.0, "%"),
    action = function(value) do
	base_trem_depth = value/100.0;
	engine.set_lfo_depth(value/100.00);
    end
  end})
  params:default()
  redraw()
end

function key (n, x)
  if n == 2 and x == 1 then
    engine.note_on(60, 50)
  elseif n == 2 and x == 0 then
    engine.note_off(60)
  end
end

-- Local Variables:
-- compile-command: "make upload"
-- End: