midinous 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8143543b40e4f426b79070ef11adab60278e82a243eb3b0c807c66a7604aa284
4
- data.tar.gz: 2b2cdbc15582f14f83d7ebd241fa005b9f50fe4ce280693662863b9db99332d2
3
+ metadata.gz: 421b8db3f96cfe3ca0f044a7d7ab88b2a1fc3ba65b244143809b341313ca6a44
4
+ data.tar.gz: 40741dc16eea914d989591332706923924b7d4075df85fe5709539e09851b904
5
5
  SHA512:
6
- metadata.gz: 39b8a6ae9d7a57f6c36e6091764416a9895ca8a2267d9664673af86a7f4009dbdf68cacb8ef432b2a28e838523c1d321b3efdbab0c9f722b562aff53d7a2d213
7
- data.tar.gz: 2a465810f796fca28528dd8abcd10e084b8b2f98b8c838e53d96654ed8c07a3a0cc9184a9766ee14bd74ca2c64dbec41c3d256a3fe7c0eda2b68f1def6c52354
6
+ metadata.gz: ddb259175deb80f193ff1e7cb644b116dc9065d47d409134cd2df7b70c74db1913ac385238b6df5d278c804d3e04e774267dfe6681a6c351114cb2184a1e565d
7
+ data.tar.gz: 3c5bc184140f2733320a0e98a9520820299f9c158dc86929469d34a13a284c1c4ed0c39a71517e5c1eca757f35f525139a7cb09918a781ea5c49fd1847d8ce2b
data/README.md CHANGED
@@ -6,7 +6,7 @@ Midinous combines generative features with a grid-based GUI to offer a supplemen
6
6
 
7
7
  * [GTK3](http://www.gtk.org/) 3.3.6 or later
8
8
  * Midinous is designed to run on 64-bit architectures
9
- * You must have 64-bit Ruby version 2.5.5 installed with the devkit and MSYS2
9
+ * You must have 64-bit Ruby version 2.5.0 - 2.5.5 installed with the devkit and MSYS2
10
10
  * It is recommended you use a virtual MIDI cable program for use with Midinous on Windows
11
11
 
12
12
  ## Install
data/lib/midinous/init.rb CHANGED
@@ -34,6 +34,10 @@ class Init_Prog
34
34
  apply_style(UI::prop_list_view,@provider)
35
35
  apply_style(UI::file_chooser,@provider)
36
36
  apply_style(UI::confirmer,@provider)
37
+ apply_style(UI::about_window,@provider)
38
+ apply_style(UI::notes_window,@provider)
39
+ apply_style(UI::scales_window,@provider)
40
+ apply_style(UI::hotkeys_window,@provider)
37
41
  end
38
42
 
39
43
  def grid_center #center the grid
@@ -78,6 +82,22 @@ module Event_Router
78
82
  UI::confirmer.visible = false
79
83
  true
80
84
  end
85
+ UI::about_window.signal_connect("delete-event") do
86
+ UI::about_window.visible = false
87
+ true
88
+ end
89
+ UI::notes_window.signal_connect("delete-event") do
90
+ UI::notes_window.visible = false
91
+ true
92
+ end
93
+ UI::scales_window.signal_connect("delete-event") do
94
+ UI::scales_window.visible = false
95
+ true
96
+ end
97
+ UI::hotkeys_window.signal_connect("delete-event") do
98
+ UI::hotkeys_window.visible = false
99
+ true
100
+ end
81
101
 
82
102
  #For key bindings
83
103
  UI::midinous.signal_connect("key-press-event") { |obj, event| route_key(event) }
@@ -113,18 +133,29 @@ module Event_Router
113
133
  #For menu items
114
134
  UI::in_device_items.each_with_index {|i, idx| i.signal_connect("button-press-event") {UI.set_device(idx,"i")}}
115
135
  UI::out_device_items.each_with_index {|o, idx| o.signal_connect("button-press-event") {UI.set_device(idx,"o")}}
136
+ UI::in_channel_items.each do |i|
137
+ i.signal_connect("button-press-event") do
138
+ Pm.in_chan = i.label.to_i
139
+ UI.regen_status
140
+ end
141
+ end
142
+
143
+ UI::help_about.signal_connect("button-press-event") {UI::about_window.visible = true}
144
+ UI::help_notes.signal_connect("button-press-event") {UI::notes_window.visible = true}
145
+ UI::help_scales.signal_connect("button-press-event") {UI::scales_window.visible = true}
146
+ UI::help_hotkeys.signal_connect("button-press-event") {UI::hotkeys_window.visible = true}
116
147
 
117
148
  #For file operations
118
- UI::file_new.signal_connect("button-press-event") {UI.confirm("new")} #Confirm first with a dialog if there are unsaved changes.
119
- UI::file_open.signal_connect("button-press-event") {UI.file_oper("open")} #Change the label to "Open"
120
- UI::file_save.signal_connect("button-press-event") {UI.file_oper("save")} #Change the label to "Save", or save automatically if the working file exists.
121
- UI::file_save_as.signal_connect("button-press-event") {UI.file_oper("saveas")} #Change the label to "Save As"
122
- UI::file_quit.signal_connect("button-press-event") {UI.confirm("quit")} #Confirm first with a dialog if there are unsaved changes.
149
+ UI::file_new.signal_connect("button-press-event") {UI.confirm("new")}
150
+ UI::file_open.signal_connect("button-press-event") {UI.file_oper("open")}
151
+ UI::file_save.signal_connect("button-press-event") {UI.file_oper("save")}
152
+ UI::file_save_as.signal_connect("button-press-event") {UI.file_oper("saveas")}
153
+ UI::file_quit.signal_connect("button-press-event") {UI.confirm("quit")}
123
154
 
124
155
  UI::confirmer_confirm.signal_connect("button-press-event"){UI.confirm_act("yes")}
125
156
  UI::confirmer_cancel.signal_connect("button-press-event") {UI.confirm_act("no")}
126
157
 
127
- UI::file_operation.signal_connect("button-press-event") {UI.file_oper_act("yes")} #If open, confirm first with a dialog if there are unsaved changes. If save/save as, overwrite confirmation should automatically appear. Otherwise, use confirmer.
158
+ UI::file_operation.signal_connect("button-press-event") {UI.file_oper_act("yes")}
128
159
  UI::file_cancel.signal_connect("button-press-event") {UI.file_oper_act("no")}
129
160
  UI::file_chooser.signal_connect("selection-changed") {UI.file_input_check("chooser")}
130
161
  UI::file_name.signal_connect("changed") {UI.file_input_check("name")}
@@ -68,8 +68,13 @@ class Point_Logic
68
68
  CC.nouspoints.find_all(&:selected).each {|n| n.path_mode = mode}
69
69
  UI::canvas.queue_draw
70
70
  end
71
- def set_note(note)
71
+ def set_note_via_devc(note)
72
72
  CC.nouspoints.find_all(&:selected).each {|n| n.note = note}
73
+ Pm.note_send(Pm.in_chan,note,100)
74
+ GLib::Timeout.add(1000) do
75
+ Pm.note_rlse(1,note)
76
+ false
77
+ end
73
78
  populate_prop(CC.nouspoints)
74
79
  end
75
80
  def inc_note(inc)
@@ -41,11 +41,12 @@ class GuiListener < MIDIEye::Listener
41
41
  end
42
42
 
43
43
  class Proc_Midi
44
- attr_accessor :out_list, :in_list
44
+ attr_accessor :out_list, :in_list, :in_chan
45
45
  attr_reader :out_id, :in_id, :in, :midi_in
46
46
  def initialize(oid,iid)
47
47
  @out_list = []
48
48
  @in_list = []
49
+ @in_chan = 1
49
50
 
50
51
  @out_id = oid
51
52
  @out_list = UniMIDI::Output.all
@@ -55,12 +56,19 @@ class Proc_Midi
55
56
  @in_list = UniMIDI::Input.all
56
57
  unless @in_list.empty?
57
58
  @in = UniMIDI::Input.use(@in_id)
58
- @midi_in = GuiListener.new(@in)
59
- @midi_in.listen_for(:class => [MIDIMessage::NoteOn,MIDIMessage::NoteOff]) {|e| Pl.set_note(e[:message].note.clamp(0,127))}
60
- @midi_in.gui_listen
59
+ set_listener
61
60
  end
62
61
  end
63
62
 
63
+ #Restart the listener
64
+ def set_listener
65
+ @midi_in = GuiListener.new(@in)
66
+ @midi_in.listen_for(:class => [MIDIMessage::NoteOn]) do |e|
67
+ Pl.set_note_via_devc(e[:message].note.clamp(0,127)) if e[:message].velocity <= 127
68
+ end
69
+ @midi_in.gui_listen
70
+ end
71
+
64
72
  #Select the output device
65
73
  def sel_out(id)
66
74
  @out = UniMIDI::Output.use(id)
@@ -71,6 +79,8 @@ class Proc_Midi
71
79
  def sel_in(id)
72
80
  @in = UniMIDI::Input.use(id)
73
81
  @in_id = id
82
+ @midi_in.close
83
+ set_listener
74
84
  end
75
85
 
76
86
  #Sends a note to an instrument
@@ -3,6 +3,233 @@
3
3
  <interface>
4
4
  <requires lib="gtk+" version="3.20"/>
5
5
  <!-- interface-css-provider-path midinous_themes.style -->
6
+ <object class="GtkTextBuffer" id="about_text_1">
7
+ <property name="text">Midinous combines generative features with a grid-based GUI to offer a supplemental unique compositional experience
8
+
9
+ Copyright (C) 2019 James "Nornec" Ratliff
10
+
11
+ Midinous is free software: you can redistribute it and/or modify
12
+ it under the terms of the GNU General Public License as published by
13
+ the Free Software Foundation, either version 3 of the License, or
14
+ (at your option) any later version.
15
+
16
+ https://github.com/Nornec/Midinous
17
+ https://nornec.bandcamp/com
18
+ https://youtube.com/nornec
19
+ https://rubygems.org/gems/midinous</property>
20
+ </object>
21
+ <object class="GtkWindow" id="about_window">
22
+ <property name="can_focus">False</property>
23
+ <property name="title">About Midinous</property>
24
+ <property name="icon_name">accessories-calculator-symbolic</property>
25
+ <property name="resizable">False</property>
26
+ <child>
27
+ <placeholder/>
28
+ </child>
29
+ <child>
30
+ <object class="GtkFixed">
31
+ <property name="visible">True</property>
32
+ <property name="can_focus">False</property>
33
+ <child>
34
+ <object class="GtkTextView">
35
+ <property name="width_request">100</property>
36
+ <property name="height_request">80</property>
37
+ <property name="left_margin">10</property>
38
+ <property name="right_margin">10</property>
39
+ <property name="top_margin">10</property>
40
+ <property name="bottom_margin">10</property>
41
+ <property name="visible">True</property>
42
+ <property name="can_focus">True</property>
43
+ <property name="editable">False</property>
44
+ <property name="cursor_visible">False</property>
45
+ <property name="buffer">about_text_1</property>
46
+ <property name="accepts_tab">False</property>
47
+ <property name="monospace">True</property>
48
+ </object>
49
+ </child>
50
+ </object>
51
+ </child>
52
+ </object>
53
+ <object class="GtkTextBuffer" id="help_text_1">
54
+ <property name="text">Note Octave
55
+ -2 -1 0 1 2 3 4 5 6 7 8
56
+ C 0 12 24 36 48 60 72 84 96 108 120
57
+ C# 1 13 25 37 49 61 73 85 97 109 121
58
+ D 2 14 26 38 50 62 74 86 98 110 122
59
+ D# 3 15 27 39 51 63 75 87 99 111 123
60
+ E 4 16 28 40 52 64 76 88 100 112 124
61
+ F 5 17 29 41 53 65 77 89 101 113 125
62
+ F# 6 18 30 42 54 66 78 90 102 114 126
63
+ G 7 19 31 43 55 67 79 91 103 115 127
64
+ G# 8 20 32 44 56 68 80 92 104 116 -
65
+ A 9 21 33 45 57 69 81 93 105 117 -
66
+ A# 10 22 34 46 58 70 82 94 106 118 -
67
+ B 11 23 35 47 59 71 83 95 107 119 -</property>
68
+ </object>
69
+ <object class="GtkWindow" id="notes_window">
70
+ <property name="can_focus">False</property>
71
+ <property name="title">Notes by Integer</property>
72
+ <property name="icon_name">accessories-calculator-symbolic</property>
73
+ <property name="resizable">False</property>
74
+ <child>
75
+ <placeholder/>
76
+ </child>
77
+ <child>
78
+ <object class="GtkFixed">
79
+ <property name="visible">True</property>
80
+ <property name="can_focus">False</property>
81
+ <child>
82
+ <object class="GtkTextView">
83
+ <property name="width_request">219</property>
84
+ <property name="height_request">215</property>
85
+ <property name="left_margin">10</property>
86
+ <property name="right_margin">10</property>
87
+ <property name="top_margin">10</property>
88
+ <property name="bottom_margin">10</property>
89
+ <property name="visible">True</property>
90
+ <property name="can_focus">True</property>
91
+ <property name="editable">False</property>
92
+ <property name="cursor_visible">False</property>
93
+ <property name="buffer">help_text_1</property>
94
+ <property name="accepts_tab">False</property>
95
+ <property name="monospace">True</property>
96
+ </object>
97
+ </child>
98
+ </object>
99
+ </child>
100
+ </object>
101
+ <object class="GtkTextBuffer" id="help_text_2">
102
+ <property name="text">W = whole tone, H = Half tone
103
+ Scales and their relative intervals
104
+ Aeolian R-W-H-W-W-H-W-W
105
+ Altered R-H-W-H-W-W-W-W
106
+ Augmented R-3H-H-3H-H-3H-H
107
+ Blues R-3H-W-H-H-3H-W
108
+ Chromatic R-H-H-H-H-H-H-H-H-H-H-H-H
109
+ Dorian R-W-H-W-W-W-H-W
110
+ Flamenco R-H-3H-H-W-H-3H-H
111
+ Half Diminished R-W-H-W-H-W-W-W
112
+ Harmonic major R-W-W-H-W-H-3H-H
113
+ Harmonic minor R-W-H-W-W-H-3H-H
114
+ Hirajoshi R-2W-W-H-2W-H
115
+ Hungarian R-W-H-3H-H-H-3H-H
116
+ Insen R-H-2W-W-2W-W
117
+ Ionian R-W-W-H-W-W-W-H
118
+ Iwato R-H-2W-H-2W-W
119
+ Locrian R-H-W-W-H-W-W-W
120
+ Locrian Major R-W-W-H-H-W-W-W
121
+ Lydian R-W-W-W-H-W-W-H
122
+ Lydian Augmented R-W-W-W-W-H-W-H
123
+ Pentatonic Major R-W-W-3H-W-3H
124
+ Pentatonic Minor R-3H-W-W-3H-W
125
+ Melodic minor R-W-H-W-W-W-W-H
126
+ Mixolydian R-W-W-H-W-W-H-W
127
+ Octatonic Whole R-W-H-W-H-W-H-W-H
128
+ Octatonic Half R-H-W-H-W-H-W-H-W
129
+ Persian R-H-3H-H-H-W-3H-H
130
+ Phrygian R-H-W-W-W-H-W-W
131
+ Prometheus R-W-W-W-3H-H-W
132
+ Tritone R-H-3H-W-H-3H-W
133
+ Two-semitone Tritone R-H-H-4H-H-H
134
+ Ukrainian Dorian R-W-H-3H-H-W-H-W
135
+ Whole Tone R-W-W-W-W-W-W</property>
136
+ </object>
137
+ <object class="GtkWindow" id="scales_window">
138
+ <property name="can_focus">False</property>
139
+ <property name="title" translatable="yes">Scales and Intervals</property>
140
+ <property name="icon_name">accessories-calculator-symbolic</property>
141
+ <property name="resizable">False</property>
142
+ <child>
143
+ <placeholder/>
144
+ </child>
145
+ <child>
146
+ <object class="GtkFixed">
147
+ <property name="visible">True</property>
148
+ <property name="can_focus">False</property>
149
+ <child>
150
+ <object class="GtkTextView">
151
+ <property name="width_request">267</property>
152
+ <property name="height_request">510</property>
153
+ <property name="left_margin">10</property>
154
+ <property name="right_margin">10</property>
155
+ <property name="top_margin">10</property>
156
+ <property name="bottom_margin">10</property>
157
+ <property name="visible">True</property>
158
+ <property name="can_focus">True</property>
159
+ <property name="editable">False</property>
160
+ <property name="cursor_visible">False</property>
161
+ <property name="buffer">help_text_2</property>
162
+ <property name="accepts_tab">False</property>
163
+ <property name="monospace">True</property>
164
+ </object>
165
+ </child>
166
+ </object>
167
+ </child>
168
+ </object>
169
+ <object class="GtkTextBuffer" id="help_text_3">
170
+ <property name="text" translatable="yes">[ -- decrement grid size/change time signature divisor -1
171
+ ] -- increment grid size/ change time signature divisor +1
172
+ { -- decrement time signature denominator (slows down play) - min 2
173
+ } -- increment time signature denominator (speeds up play) - max 16
174
+ delete -- deletes selected point(s)
175
+ home -- deletes paths entering selected point(s)
176
+ end -- deletes paths leaving selected point(s)
177
+ Page Up -- change path direction
178
+ Page Down -- change path direction
179
+ A -- Make starting point (need at least 1 to begin play)
180
+ T -- Built path - build a path between one or more points
181
+ Q -- Select Tool - Box select or single select points
182
+ W -- Point Place Tool - Places a point
183
+ E -- Move Tool - moves selected points based on a stencil
184
+ R -- Path Tool - Select source point, select target points, push build path or hit 'T'
185
+ &lt; and &gt; -- Cycle Play Mode - between robin, portal (random, split, if more than one path is leaving a point)
186
+ , and . -- Cycle starting path if more than one path is leaving a point
187
+ + and - -- add or subtract 1 from the currently selected points' note
188
+ Num 6 -- play
189
+ Num 5 -- stop
190
+ space -- toggle play/stop
191
+ Ctrl+A -- select all
192
+ Ctrl+C -- copy selected points
193
+ Ctrl+X -- cut selected points
194
+ Ctrl+V -- paste copied/cut points
195
+ Ctrl+O -- Open
196
+ Ctrl+S -- Save
197
+ Shift+Ctrl+S -- Save As
198
+ Ctrl+N -- New
199
+ Ctrl+Q -- Quit</property>
200
+ </object>
201
+ <object class="GtkWindow" id="hotkeys_window">
202
+ <property name="can_focus">False</property>
203
+ <property name="title" translatable="yes">Hotkeys</property>
204
+ <property name="icon_name">accessories-calculator-symbolic</property>
205
+ <property name="resizable">False</property>
206
+ <child>
207
+ <placeholder/>
208
+ </child>
209
+ <child>
210
+ <object class="GtkFixed">
211
+ <property name="visible">True</property>
212
+ <property name="can_focus">False</property>
213
+ <child>
214
+ <object class="GtkTextView">
215
+ <property name="width_request">100</property>
216
+ <property name="height_request">80</property>
217
+ <property name="left_margin">10</property>
218
+ <property name="right_margin">10</property>
219
+ <property name="top_margin">10</property>
220
+ <property name="bottom_margin">10</property>
221
+ <property name="visible">True</property>
222
+ <property name="can_focus">True</property>
223
+ <property name="editable">False</property>
224
+ <property name="cursor_visible">False</property>
225
+ <property name="buffer">help_text_3</property>
226
+ <property name="accepts_tab">False</property>
227
+ <property name="monospace">True</property>
228
+ </object>
229
+ </child>
230
+ </object>
231
+ </child>
232
+ </object>
6
233
  <object class="GtkDialog" id="confirmer">
7
234
  <property name="title" translatable="yes">Confirmation</property>
8
235
  <property name="icon_name">accessories-calculator-symbolic</property>
@@ -363,6 +590,29 @@
363
590
  </object>
364
591
  </child>
365
592
  </object>
593
+ </child>
594
+ <child>
595
+ <object class="GtkMenuItem">
596
+ <property name="visible">True</property>
597
+ <property name="can_focus">False</property>
598
+ <property name="label" translatable="yes">Input _Channel</property>
599
+ <property name="use_underline">True</property>
600
+ <child type="submenu">
601
+ <object class="GtkMenu" id="input_channel_menu">
602
+ <property name="visible">True</property>
603
+ <property name="can_focus">False</property>
604
+ <!-- child>
605
+ <object class="GtkImageMenuItem" id="file_quit">
606
+ <property name="label">gtk-quit</property>
607
+ <property name="visible">True</property>
608
+ <property name="can_focus">False</property>
609
+ <property name="use_underline">True</property>
610
+ <property name="use_stock">True</property>
611
+ </object>
612
+ </child> -->
613
+ </object>
614
+ </child>
615
+ </object>
366
616
  </child>
367
617
  <child>
368
618
  <object class="GtkMenuItem">
@@ -394,12 +644,39 @@
394
644
  <property name="label" translatable="yes">_Help</property>
395
645
  <property name="use_underline">True</property>
396
646
  <child type="submenu">
397
- <object class="GtkMenu">
647
+ <object class="GtkMenu" id="help_menu">
398
648
  <property name="visible">True</property>
399
649
  <property name="can_focus">False</property>
400
650
  <child>
401
651
  <object class="GtkImageMenuItem" id="help_about">
402
- <property name="label">gtk-about</property>
652
+ <property name="label">_About</property>
653
+ <property name="visible">True</property>
654
+ <property name="can_focus">False</property>
655
+ <property name="use_underline">True</property>
656
+ <property name="use_stock">True</property>
657
+ </object>
658
+ </child>
659
+ <child>
660
+ <object class="GtkImageMenuItem" id="help_notes">
661
+ <property name="label">_Notes by Integer</property>
662
+ <property name="visible">True</property>
663
+ <property name="can_focus">False</property>
664
+ <property name="use_underline">True</property>
665
+ <property name="use_stock">True</property>
666
+ </object>
667
+ </child>
668
+ <child>
669
+ <object class="GtkImageMenuItem" id="help_scales">
670
+ <property name="label">_Scales and Intervals</property>
671
+ <property name="visible">True</property>
672
+ <property name="can_focus">False</property>
673
+ <property name="use_underline">True</property>
674
+ <property name="use_stock">True</property>
675
+ </object>
676
+ </child>
677
+ <child>
678
+ <object class="GtkImageMenuItem" id="help_hotkeys">
679
+ <property name="label">_Hotkeys</property>
403
680
  <property name="visible">True</property>
404
681
  <property name="can_focus">False</property>
405
682
  <property name="use_underline">True</property>
@@ -63,12 +63,14 @@ end
63
63
  class UI_Elements
64
64
  include Logic_Controls
65
65
  # Construct a Gtk::Builder instance and load our UI description
66
- attr_reader :menu_commands,:canvas_commands,:in_device_items,:out_device_items
66
+ attr_reader :menu_commands,:canvas_commands,:in_device_items,
67
+ :out_device_items,:in_channel_items
67
68
  def initialize
68
69
  @current_file = nil
69
70
  @operation_file = nil
70
71
  @current_window = nil
71
72
  @scale_iters = []
73
+ @in_channel_items = []
72
74
  @in_device_items = []
73
75
  @out_device_items = []
74
76
  end
@@ -88,6 +90,18 @@ class UI_Elements
88
90
  def confirmer
89
91
  @builder.get_object("confirmer")
90
92
  end
93
+ def about_window
94
+ @builder.get_object("about_window")
95
+ end
96
+ def notes_window
97
+ @builder.get_object("notes_window")
98
+ end
99
+ def scales_window
100
+ @builder.get_object("scales_window")
101
+ end
102
+ def hotkeys_window
103
+ @builder.get_object("hotkeys_window")
104
+ end
91
105
 
92
106
  #Menus
93
107
  def input_menu
@@ -96,6 +110,12 @@ class UI_Elements
96
110
  def output_menu
97
111
  @builder.get_object("output_menu")
98
112
  end
113
+ def input_channel_menu
114
+ @builder.get_object("input_channel_menu")
115
+ end
116
+ def help_menu
117
+ @builder.get_object("help_menu")
118
+ end
99
119
 
100
120
  #Menu Items
101
121
  def file_new
@@ -115,6 +135,15 @@ class UI_Elements
115
135
  end
116
136
  def help_about
117
137
  @builder.get_object("help_about")
138
+ end
139
+ def help_notes
140
+ @builder.get_object("help_notes")
141
+ end
142
+ def help_scales
143
+ @builder.get_object("help_scales")
144
+ end
145
+ def help_hotkeys
146
+ @builder.get_object("help_hotkeys")
118
147
  end
119
148
 
120
149
  #Drawing Areas
@@ -271,6 +300,10 @@ class UI_Elements
271
300
  @builder.get_object("scale_display")
272
301
  end
273
302
 
303
+ 16.times.with_index {|i| @in_channel_items << Gtk::ImageMenuItem.new(label: (i+1).to_s)}
304
+ @in_channel_items.each {|i| input_channel_menu.append(i)}
305
+ input_channel_menu.show_all
306
+
274
307
  Pm.in_list.each {|i| @in_device_items << Gtk::ImageMenuItem.new(label: i.name)}
275
308
  @in_device_items.each {|i| input_menu.append(i)}
276
309
  input_menu.show_all
@@ -291,7 +324,8 @@ class UI_Elements
291
324
 
292
325
  def regen_status
293
326
  unless Pm.in_list.empty?
294
- status_area.text = "Using: Output[#{Pm.out_list[Pm.out_id].name}] Input[#{Pm.in_list[Pm.in_id].name}]"
327
+ status_area.text = "Using: Output[#{Pm.out_list[Pm.out_id].name}] "\
328
+ "Input[#{Pm.in_list[Pm.in_id].name} Channel: #{Pm.in_chan}]"
295
329
  else
296
330
  status_area.text = "Using: Output[#{Pm.out_list[Pm.out_id].name}]"
297
331
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: midinous
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - James "Nornec" Ratliff
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-10 00:00:00.000000000 Z
11
+ date: 2019-11-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gtk3
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  description: Midinous combines generative features with a grid-based GUI to offer
56
- a supplemental unique compositional experience
56
+ a supplemental and unique compositional experience
57
57
  email: jaynornec@gmail.com
58
58
  executables: []
59
59
  extensions: []
@@ -85,15 +85,16 @@ require_paths:
85
85
  - lib
86
86
  required_ruby_version: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - ">="
88
+ - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: '0'
90
+ version: 2.5.0
91
91
  required_rubygems_version: !ruby/object:Gem::Requirement
92
92
  requirements:
93
93
  - - ">="
94
94
  - !ruby/object:Gem::Version
95
95
  version: '0'
96
- requirements: []
96
+ requirements:
97
+ - Virtual MIDI Cable (Windows)
97
98
  rubyforge_project:
98
99
  rubygems_version: 2.7.6.2
99
100
  signing_key: