midinous 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: