reflexion 0.3.6 → 0.3.7

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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/reflex/midi.cpp +82 -0
  3. data/.doc/ext/reflex/native.cpp +4 -0
  4. data/.doc/ext/reflex/note_event.cpp +121 -0
  5. data/.doc/ext/reflex/reflex.cpp +23 -2
  6. data/.doc/ext/reflex/view.cpp +11 -16
  7. data/.doc/ext/reflex/window.cpp +24 -0
  8. data/ChangeLog.md +8 -0
  9. data/Rakefile +7 -0
  10. data/VERSION +1 -1
  11. data/ext/reflex/midi.cpp +87 -0
  12. data/ext/reflex/native.cpp +4 -0
  13. data/ext/reflex/note_event.cpp +130 -0
  14. data/ext/reflex/reflex.cpp +24 -2
  15. data/ext/reflex/view.cpp +11 -16
  16. data/ext/reflex/window.cpp +27 -0
  17. data/include/reflex/event.h +39 -2
  18. data/include/reflex/gamepad.h +2 -2
  19. data/include/reflex/midi.h +53 -0
  20. data/include/reflex/reflex.h +2 -0
  21. data/include/reflex/ruby/event.h +11 -0
  22. data/include/reflex/ruby/midi.h +84 -0
  23. data/include/reflex/ruby/window.h +27 -0
  24. data/include/reflex/view.h +9 -1
  25. data/include/reflex/window.h +6 -0
  26. data/lib/reflex/note_event.rb +34 -0
  27. data/lib/reflex/view.rb +2 -1
  28. data/lib/reflex.rb +9 -8
  29. data/reflex.gemspec +3 -3
  30. data/src/application.cpp +3 -0
  31. data/src/event.cpp +95 -7
  32. data/src/event.h +5 -0
  33. data/src/gamepad.cpp +14 -14
  34. data/src/gamepad.h +9 -9
  35. data/src/ios/event.mm +10 -2
  36. data/src/ios/gamepad.mm +2 -1
  37. data/src/midi.cpp +379 -0
  38. data/src/midi.h +32 -0
  39. data/src/osx/event.h +0 -3
  40. data/src/osx/event.mm +6 -6
  41. data/src/osx/gamepad_gc.mm +1 -1
  42. data/src/osx/gamepad_hid.mm +1 -1
  43. data/src/queue.h +71 -0
  44. data/src/reflex.cpp +18 -0
  45. data/src/timer.cpp +3 -10
  46. data/src/view.cpp +39 -0
  47. data/src/view.h +2 -0
  48. data/src/win32/event.cpp +5 -5
  49. data/src/win32/event.h +0 -2
  50. data/src/win32/gamepad.cpp +1 -1
  51. data/src/window.cpp +61 -10
  52. data/src/window.h +2 -0
  53. data/test/test_capture_event.rb +20 -16
  54. data/test/test_key_event.rb +8 -1
  55. data/test/test_note_event.rb +43 -0
  56. data/test/test_view.rb +24 -12
  57. metadata +29 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6208109e523193e989fd8aab8deb156b0cedac3f2d686104e44dec97c4cc9a5e
4
- data.tar.gz: 8b9060b45cd8f0a2603411895d7739f7ba4df40e21d03ab9f78d4e3fbb09133f
3
+ metadata.gz: 3520640328cfb50b658b9010aa67ea46133947fe974e2a53652f5279a387629d
4
+ data.tar.gz: 241019eb81187280e520610adbc0626eb3336e2201ed3c6be71026e828e412c7
5
5
  SHA512:
6
- metadata.gz: e90800b628b22f0b174ba433acfddc5232687408e6845880eed7e898f03e417906f381b7d58c7c01e19dbe7965738f1ee43bf9594a2329c83a97c84ad5f843ec
7
- data.tar.gz: fbc4b887c236dce6096fb8ab1ded816da3a4c08a2c5873f2826fc044d02dae123004e9c7d8da3b5999410b906cbaafbd742c07198bae71027ddd80259d25e212
6
+ metadata.gz: 5eabad841c91594992c6bd852e53a18aaa53c5d5f0f46e4df2cfcf921f31cf2a82a8509ed9431e148b4e209f25eaf30f3ccc75dd5bedaa12db03ab3cb9d98bf9
7
+ data.tar.gz: a927541d68a6df779112af64db8e5da871ce814638e40a9d9b392f2379e8610fbcae2d54857599d603f119971558d2a3ccf71ede3974bff968477d3d092b819d
@@ -0,0 +1,82 @@
1
+ #include "reflex/ruby/midi.h"
2
+
3
+
4
+ #include <ranges>
5
+ #include "reflex/ruby/device.h"
6
+ #include "defs.h"
7
+
8
+
9
+ RUCY_DEFINE_WRAPPER_VALUE_FROM_TO(REFLEX_EXPORT, Reflex::MIDI)
10
+
11
+ #define THIS to<Reflex::MIDI*>(self)
12
+
13
+ #define CHECK RUCY_CHECK_OBJECT(Reflex::MIDI, self)
14
+
15
+ #define CALL(fun) RUCY_CALL_SUPER(THIS, fun)
16
+
17
+
18
+ static
19
+ VALUE alloc(VALUE klass)
20
+ {
21
+ Reflex::reflex_error(__FILE__, __LINE__, "can not instantiate MIDI class.");
22
+ }
23
+
24
+ static
25
+ VALUE on_note(VALUE self, VALUE event)
26
+ {
27
+ CHECK;
28
+ CALL(on_note(to<Reflex::NoteEvent*>(event)));
29
+ }
30
+
31
+ static
32
+ VALUE on_note_on(VALUE self, VALUE event)
33
+ {
34
+ CHECK;
35
+ CALL(on_note_on(to<Reflex::NoteEvent*>(event)));
36
+ }
37
+
38
+ static
39
+ VALUE on_note_off(VALUE self, VALUE event)
40
+ {
41
+ CHECK;
42
+ CALL(on_note_off(to<Reflex::NoteEvent*>(event)));
43
+ }
44
+
45
+ static
46
+ VALUE s_get_all(VALUE self)
47
+ {
48
+ auto list = Reflex::MIDI::all() |
49
+ std::views::transform([](auto& ref) {return value(ref);});
50
+ return array(list.begin(), list.end());
51
+ }
52
+
53
+
54
+ static Class cMIDI;
55
+
56
+ void
57
+ Init_reflex_midi ()
58
+ {
59
+ Module mReflex = rb_define_module("Reflex");
60
+
61
+ cMIDI = mReflex.define_class("MIDI", Reflex::device_class());
62
+ rb_define_alloc_func(cMIDI, alloc);
63
+ rb_define_method(cMIDI, "on_note", RUBY_METHOD_FUNC(on_note), 1);
64
+ rb_define_method(cMIDI, "on_note_on", RUBY_METHOD_FUNC(on_note_on), 1);
65
+ rb_define_method(cMIDI, "on_note_off", RUBY_METHOD_FUNC(on_note_off), 1);
66
+
67
+ rb_define_singleton_method(cMIDI, "all", RUBY_METHOD_FUNC(s_get_all), 0);
68
+ }
69
+
70
+
71
+ namespace Reflex
72
+ {
73
+
74
+
75
+ Class
76
+ midi_class ()
77
+ {
78
+ return cMIDI;
79
+ }
80
+
81
+
82
+ }// Reflex
@@ -21,6 +21,7 @@ void Init_reflex_focus_event ();
21
21
  void Init_reflex_key_event ();
22
22
  void Init_reflex_pointer_event ();
23
23
  void Init_reflex_wheel_event ();
24
+ void Init_reflex_note_event ();
24
25
  void Init_reflex_capture_event ();
25
26
  void Init_reflex_timer_event ();
26
27
  void Init_reflex_contact_event ();
@@ -38,6 +39,7 @@ void Init_reflex_window ();
38
39
  void Init_reflex_view ();
39
40
 
40
41
  void Init_reflex_device ();
42
+ void Init_reflex_midi ();
41
43
 
42
44
  void Init_reflex_image_view ();
43
45
 
@@ -73,6 +75,7 @@ extern "C" void
73
75
  Init_reflex_key_event();
74
76
  Init_reflex_pointer_event();
75
77
  Init_reflex_wheel_event();
78
+ Init_reflex_note_event();
76
79
  Init_reflex_capture_event();
77
80
  Init_reflex_timer_event();
78
81
  Init_reflex_contact_event();
@@ -90,6 +93,7 @@ extern "C" void
90
93
  Init_reflex_view();
91
94
 
92
95
  Init_reflex_device();
96
+ Init_reflex_midi();
93
97
 
94
98
  Init_reflex_image_view();
95
99
 
@@ -0,0 +1,121 @@
1
+ #include "reflex/ruby/event.h"
2
+
3
+
4
+ #include "defs.h"
5
+
6
+
7
+ RUCY_DEFINE_VALUE_FROM_TO(REFLEX_EXPORT, Reflex::NoteEvent)
8
+
9
+ #define THIS to<Reflex::NoteEvent*>(self)
10
+
11
+ #define CHECK RUCY_CHECK_OBJ(Reflex::NoteEvent, self)
12
+
13
+
14
+ static
15
+ VALUE alloc(VALUE klass)
16
+ {
17
+ return new_type<Reflex::NoteEvent>(klass);
18
+ }
19
+
20
+ static
21
+ VALUE initialize(VALUE self, VALUE action, VALUE channel, VALUE note, VALUE velocity, VALUE time)
22
+ {
23
+ CHECK;
24
+
25
+ *THIS = Reflex::NoteEvent(
26
+ (Reflex::NoteEvent::Action) to<uint>(action),
27
+ to<int>(channel),
28
+ to<int>(note),
29
+ to<float>(velocity),
30
+ to<double>(time));
31
+
32
+ return rb_call_super(0, NULL);
33
+ }
34
+
35
+ static
36
+ VALUE initialize_copy(VALUE self, VALUE obj)
37
+ {
38
+ CHECK;
39
+ *THIS = to<Reflex::NoteEvent&>(obj).dup();
40
+ return self;
41
+ }
42
+
43
+ static
44
+ VALUE get_action(VALUE self)
45
+ {
46
+ CHECK;
47
+ return value(THIS->action());
48
+ }
49
+
50
+ static
51
+ VALUE get_channel(VALUE self)
52
+ {
53
+ CHECK;
54
+ return value(THIS->channel());
55
+ }
56
+
57
+ static
58
+ VALUE get_note(VALUE self)
59
+ {
60
+ CHECK;
61
+ return value(THIS->note());
62
+ }
63
+
64
+ static
65
+ VALUE get_frequency(VALUE self)
66
+ {
67
+ CHECK;
68
+ return value(THIS->frequency());
69
+ }
70
+
71
+ static
72
+ VALUE get_velocity(VALUE self)
73
+ {
74
+ CHECK;
75
+ return value(THIS->velocity());
76
+ }
77
+
78
+ static
79
+ VALUE is_captured(VALUE self)
80
+ {
81
+ CHECK;
82
+ return value(THIS->is_captured());
83
+ }
84
+
85
+
86
+ static Class cNoteEvent;
87
+
88
+ void
89
+ Init_reflex_note_event ()
90
+ {
91
+ Module mReflex = rb_define_module("Reflex");
92
+
93
+ cNoteEvent = mReflex.define_class("NoteEvent", Reflex::event_class());
94
+ rb_define_alloc_func(cNoteEvent, alloc);
95
+ rb_define_private_method(cNoteEvent, "initialize", RUBY_METHOD_FUNC(initialize), 5);
96
+ rb_define_private_method(cNoteEvent, "initialize_copy", RUBY_METHOD_FUNC(initialize_copy), 1);
97
+ rb_define_method(cNoteEvent, "action", RUBY_METHOD_FUNC(get_action), 0);
98
+ rb_define_method(cNoteEvent, "channel", RUBY_METHOD_FUNC(get_channel), 0);
99
+ rb_define_method(cNoteEvent, "note", RUBY_METHOD_FUNC(get_note), 0);
100
+ rb_define_method(cNoteEvent, "frequency", RUBY_METHOD_FUNC(get_frequency), 0);
101
+ rb_define_method(cNoteEvent, "velocity", RUBY_METHOD_FUNC(get_velocity), 0);
102
+ cNoteEvent.define_method("captured?", is_captured);
103
+
104
+ cNoteEvent.define_const("ACTION_NONE", Reflex::NoteEvent::ACTION_NONE);
105
+ cNoteEvent.define_const("ON", Reflex::NoteEvent::ON);
106
+ cNoteEvent.define_const("OFF", Reflex::NoteEvent::OFF);
107
+ }
108
+
109
+
110
+ namespace Reflex
111
+ {
112
+
113
+
114
+ Class
115
+ note_event_class ()
116
+ {
117
+ return cNoteEvent;
118
+ }
119
+
120
+
121
+ }// Reflex
@@ -3,21 +3,31 @@
3
3
 
4
4
  #include "reflex/ruby/view.h"
5
5
  #include "reflex/ruby/timer.h"
6
+ #include "reflex/ruby/midi.h"
6
7
  #include "../../src/window.h"
7
8
  #include "../../src/timer.h"
9
+ #include "../../src/midi.h"
8
10
  #include "defs.h"
9
11
 
10
12
 
11
13
  static Reflex::View*
12
14
  create_root_view ()
13
15
  {
14
- return new Reflex::RubyView<Reflex::View>;
16
+ return new Reflex::RubyView<Reflex::View>();
15
17
  }
16
18
 
17
19
  static Reflex::Timer*
18
20
  create_timer ()
19
21
  {
20
- return new Reflex::RubyTimer<Reflex::Timer>;
22
+ return new Reflex::RubyTimer<Reflex::Timer>();
23
+ }
24
+
25
+ static Reflex::MIDI*
26
+ create_midi ()
27
+ {
28
+ Reflex::MIDI* midi = new Reflex::RubyMIDI<Reflex::MIDI>();
29
+ value(midi);// apply MIDI class to ClassWrapper's value
30
+ return midi;
21
31
  }
22
32
 
23
33
 
@@ -27,6 +37,7 @@ VALUE init(VALUE self)
27
37
  Reflex::init();
28
38
  Reflex::Window_set_create_root_view_fun(create_root_view);
29
39
  Reflex::Timer_set_create_fun(create_timer);
40
+ Reflex::MIDI_set_create_fun(create_midi);
30
41
 
31
42
  return self;
32
43
  }
@@ -36,11 +47,20 @@ VALUE fin(VALUE self)
36
47
  {
37
48
  Reflex::Window_set_create_root_view_fun(NULL);
38
49
  Reflex::Timer_set_create_fun(NULL);
50
+ Reflex::MIDI_set_create_fun(NULL);
39
51
  Reflex::fin();
40
52
 
41
53
  return self;
42
54
  }
43
55
 
56
+ static
57
+ VALUE process_events(VALUE self)
58
+ {
59
+ Reflex::process_events();
60
+
61
+ return self;
62
+ }
63
+
44
64
 
45
65
  static Module mReflex;
46
66
 
@@ -50,6 +70,7 @@ Init_reflex ()
50
70
  mReflex = rb_define_module("Reflex");
51
71
  mReflex.define_singleton_method("init!", init);
52
72
  mReflex.define_singleton_method("fin!", fin);
73
+ mReflex.define_singleton_method("process_events!", process_events);
53
74
 
54
75
  using namespace Reflex;
55
76
 
@@ -2,6 +2,7 @@
2
2
 
3
3
 
4
4
  #include <vector>
5
+ #include <ranges>
5
6
  #include <rays/ruby/point.h>
6
7
  #include <rays/ruby/bounds.h>
7
8
  #include <rays/ruby/polygon.h>
@@ -25,16 +26,6 @@ RUCY_DEFINE_WRAPPER_VALUE_FROM_TO(REFLEX_EXPORT, Reflex::View)
25
26
  #define CALL(fun) RUCY_CALL_SUPER(THIS, fun)
26
27
 
27
28
 
28
- template <typename T>
29
- static inline Value
30
- array (T begin, T end)
31
- {
32
- std::vector<Value> v;
33
- for (T it = begin; it != end; ++it) v.push_back(value(*it));
34
- return array(&v[0], v.size());
35
- }
36
-
37
-
38
29
  static
39
30
  VALUE alloc(VALUE klass)
40
31
  {
@@ -194,8 +185,9 @@ VALUE find_children(VALUE self)
194
185
 
195
186
  bool recursive = (argc >= 2) ? to<bool>(argv[1]) : true;
196
187
 
197
- Reflex::View::ChildList children =
198
- THIS->find_children(to<Reflex::Selector>(argv[0]), recursive);
188
+ auto children =
189
+ THIS->find_children(to<Reflex::Selector>(argv[0]), recursive) |
190
+ std::views::transform([](auto& ref) {return value(ref);});
199
191
  return array(children.begin(), children.end());
200
192
  }
201
193
 
@@ -249,8 +241,9 @@ VALUE find_styles(VALUE self)
249
241
 
250
242
  bool recursive = (argc >= 2) ? to<bool>(argv[1]) : false;
251
243
 
252
- Reflex::View::StyleList styles =
253
- THIS->find_styles(to<Reflex::Selector>(argv[0]), recursive);
244
+ auto styles =
245
+ THIS->find_styles(to<Reflex::Selector>(argv[0]), recursive) |
246
+ std::views::transform([](auto& ref) {return value(ref);});
254
247
  return array(styles.begin(), styles.end());
255
248
  }
256
249
 
@@ -327,8 +320,9 @@ VALUE find_shapes(VALUE self)
327
320
  CHECK;
328
321
  check_arg_count(__FILE__, __LINE__, "View#find_shapes", argc, 1);
329
322
 
330
- Reflex::View::ShapeList shapes =
331
- THIS->find_shapes(to<Reflex::Selector>(argv[0]));
323
+ auto shapes =
324
+ THIS->find_shapes(to<Reflex::Selector>(argv[0])) |
325
+ std::views::transform([](auto& ref) {return value(ref);});
332
326
  return array(shapes.begin(), shapes.end());
333
327
  }
334
328
 
@@ -1231,6 +1225,7 @@ Init_reflex_view ()
1231
1225
  cView.define_const("CAPTURE_NONE", Reflex::View::CAPTURE_NONE);
1232
1226
  cView.define_const("CAPTURE_KEY", Reflex::View::CAPTURE_KEY);
1233
1227
  cView.define_const("CAPTURE_POINTER", Reflex::View::CAPTURE_POINTER);
1228
+ cView.define_const("CAPTURE_NOTE", Reflex::View::CAPTURE_NOTE);
1234
1229
  cView.define_const("CAPTURE_ALL", Reflex::View::CAPTURE_ALL);
1235
1230
 
1236
1231
  define_selector_methods<Reflex::View>(cView);
@@ -369,6 +369,27 @@ VALUE on_wheel(VALUE self, VALUE event)
369
369
  CALL(on_wheel(to<Reflex::WheelEvent*>(event)));
370
370
  }
371
371
 
372
+ static
373
+ VALUE on_note(VALUE self, VALUE event)
374
+ {
375
+ CHECK;
376
+ CALL(on_note(to<Reflex::NoteEvent*>(event)));
377
+ }
378
+
379
+ static
380
+ VALUE on_note_on(VALUE self, VALUE event)
381
+ {
382
+ CHECK;
383
+ CALL(on_note_on(to<Reflex::NoteEvent*>(event)));
384
+ }
385
+
386
+ static
387
+ VALUE on_note_off(VALUE self, VALUE event)
388
+ {
389
+ CHECK;
390
+ CALL(on_note_off(to<Reflex::NoteEvent*>(event)));
391
+ }
392
+
372
393
 
373
394
  static Class cWindow;
374
395
 
@@ -422,6 +443,9 @@ Init_reflex_window ()
422
443
  rb_define_method(cWindow, "on_pointer_move", RUBY_METHOD_FUNC(on_pointer_move), 1);
423
444
  rb_define_method(cWindow, "on_pointer_cancel", RUBY_METHOD_FUNC(on_pointer_cancel), 1);
424
445
  rb_define_method(cWindow, "on_wheel", RUBY_METHOD_FUNC(on_wheel), 1);
446
+ rb_define_method(cWindow, "on_note", RUBY_METHOD_FUNC(on_note), 1);
447
+ rb_define_method(cWindow, "on_note_on", RUBY_METHOD_FUNC(on_note_on), 1);
448
+ rb_define_method(cWindow, "on_note_off", RUBY_METHOD_FUNC(on_note_off), 1);
425
449
 
426
450
  cWindow.define_const("ORIENTATION_PORTRAIT", Reflex::Window::FLAG_PORTRAIT);
427
451
  cWindow.define_const("ORIENTATION_LANDSCAPE", Reflex::Window::FLAG_LANDSCAPE);
data/ChangeLog.md CHANGED
@@ -1,6 +1,14 @@
1
1
  # reflex ChangeLog
2
2
 
3
3
 
4
+ ## [v0.3.7] - 2025-05-11
5
+
6
+ - Add MIDI class
7
+ - Add NoteEvent class and on_note and on_note_on/off event handlers
8
+ - Add reflex/test/test_note_event.rb
9
+ - KeyEvent can take 'time' parameter
10
+
11
+
4
12
  ## [v0.3.6] - 2025-04-08
5
13
 
6
14
  - Add Gamepad class
data/Rakefile CHANGED
@@ -21,6 +21,13 @@ use_external_library 'https://github.com/erincatto/box2d',
21
21
  incdirs: %w[include src],
22
22
  srcdirs: 'src'
23
23
 
24
+ use_external_library 'https://github.com/thestk/rtmidi',
25
+ tag: '6.0.0',
26
+ incdirs: 'rtmidi',
27
+ srcdirs: 'rtmidi',
28
+ defs: '__MACOSX_CORE__',
29
+ &proc {sh %( mkdir rtmidi && cp RtMidi.* rtmidi )}
30
+
24
31
  default_tasks :ext
25
32
  use_bundler
26
33
  build_native_library
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.6
1
+ 0.3.7
@@ -0,0 +1,87 @@
1
+ #include "reflex/ruby/midi.h"
2
+
3
+
4
+ #include <ranges>
5
+ #include "reflex/ruby/device.h"
6
+ #include "defs.h"
7
+
8
+
9
+ RUCY_DEFINE_WRAPPER_VALUE_FROM_TO(REFLEX_EXPORT, Reflex::MIDI)
10
+
11
+ #define THIS to<Reflex::MIDI*>(self)
12
+
13
+ #define CHECK RUCY_CHECK_OBJECT(Reflex::MIDI, self)
14
+
15
+ #define CALL(fun) RUCY_CALL_SUPER(THIS, fun)
16
+
17
+
18
+ static
19
+ RUCY_DEF_ALLOC(alloc, klass)
20
+ {
21
+ Reflex::reflex_error(__FILE__, __LINE__, "can not instantiate MIDI class.");
22
+ }
23
+ RUCY_END
24
+
25
+ static
26
+ RUCY_DEF1(on_note, event)
27
+ {
28
+ CHECK;
29
+ CALL(on_note(to<Reflex::NoteEvent*>(event)));
30
+ }
31
+ RUCY_END
32
+
33
+ static
34
+ RUCY_DEF1(on_note_on, event)
35
+ {
36
+ CHECK;
37
+ CALL(on_note_on(to<Reflex::NoteEvent*>(event)));
38
+ }
39
+ RUCY_END
40
+
41
+ static
42
+ RUCY_DEF1(on_note_off, event)
43
+ {
44
+ CHECK;
45
+ CALL(on_note_off(to<Reflex::NoteEvent*>(event)));
46
+ }
47
+ RUCY_END
48
+
49
+ static
50
+ RUCY_DEF0(s_get_all)
51
+ {
52
+ auto list = Reflex::MIDI::all() |
53
+ std::views::transform([](auto& ref) {return value(ref);});
54
+ return array(list.begin(), list.end());
55
+ }
56
+ RUCY_END
57
+
58
+
59
+ static Class cMIDI;
60
+
61
+ void
62
+ Init_reflex_midi ()
63
+ {
64
+ Module mReflex = define_module("Reflex");
65
+
66
+ cMIDI = mReflex.define_class("MIDI", Reflex::device_class());
67
+ cMIDI.define_alloc_func(alloc);
68
+ cMIDI.define_method("on_note", on_note);
69
+ cMIDI.define_method("on_note_on", on_note_on);
70
+ cMIDI.define_method("on_note_off", on_note_off);
71
+
72
+ cMIDI.define_singleton_method("all", s_get_all);
73
+ }
74
+
75
+
76
+ namespace Reflex
77
+ {
78
+
79
+
80
+ Class
81
+ midi_class ()
82
+ {
83
+ return cMIDI;
84
+ }
85
+
86
+
87
+ }// Reflex
@@ -21,6 +21,7 @@ void Init_reflex_focus_event ();
21
21
  void Init_reflex_key_event ();
22
22
  void Init_reflex_pointer_event ();
23
23
  void Init_reflex_wheel_event ();
24
+ void Init_reflex_note_event ();
24
25
  void Init_reflex_capture_event ();
25
26
  void Init_reflex_timer_event ();
26
27
  void Init_reflex_contact_event ();
@@ -38,6 +39,7 @@ void Init_reflex_window ();
38
39
  void Init_reflex_view ();
39
40
 
40
41
  void Init_reflex_device ();
42
+ void Init_reflex_midi ();
41
43
 
42
44
  void Init_reflex_image_view ();
43
45
 
@@ -73,6 +75,7 @@ extern "C" void
73
75
  Init_reflex_key_event();
74
76
  Init_reflex_pointer_event();
75
77
  Init_reflex_wheel_event();
78
+ Init_reflex_note_event();
76
79
  Init_reflex_capture_event();
77
80
  Init_reflex_timer_event();
78
81
  Init_reflex_contact_event();
@@ -90,6 +93,7 @@ extern "C" void
90
93
  Init_reflex_view();
91
94
 
92
95
  Init_reflex_device();
96
+ Init_reflex_midi();
93
97
 
94
98
  Init_reflex_image_view();
95
99
 
@@ -0,0 +1,130 @@
1
+ #include "reflex/ruby/event.h"
2
+
3
+
4
+ #include "defs.h"
5
+
6
+
7
+ RUCY_DEFINE_VALUE_FROM_TO(REFLEX_EXPORT, Reflex::NoteEvent)
8
+
9
+ #define THIS to<Reflex::NoteEvent*>(self)
10
+
11
+ #define CHECK RUCY_CHECK_OBJ(Reflex::NoteEvent, self)
12
+
13
+
14
+ static
15
+ RUCY_DEF_ALLOC(alloc, klass)
16
+ {
17
+ return new_type<Reflex::NoteEvent>(klass);
18
+ }
19
+ RUCY_END
20
+
21
+ static
22
+ RUCY_DEF5(initialize, action, channel, note, velocity, time)
23
+ {
24
+ CHECK;
25
+
26
+ *THIS = Reflex::NoteEvent(
27
+ (Reflex::NoteEvent::Action) to<uint>(action),
28
+ to<int>(channel),
29
+ to<int>(note),
30
+ to<float>(velocity),
31
+ to<double>(time));
32
+
33
+ return rb_call_super(0, NULL);
34
+ }
35
+ RUCY_END
36
+
37
+ static
38
+ RUCY_DEF1(initialize_copy, obj)
39
+ {
40
+ CHECK;
41
+ *THIS = to<Reflex::NoteEvent&>(obj).dup();
42
+ return self;
43
+ }
44
+ RUCY_END
45
+
46
+ static
47
+ RUCY_DEF0(get_action)
48
+ {
49
+ CHECK;
50
+ return value(THIS->action());
51
+ }
52
+ RUCY_END
53
+
54
+ static
55
+ RUCY_DEF0(get_channel)
56
+ {
57
+ CHECK;
58
+ return value(THIS->channel());
59
+ }
60
+ RUCY_END
61
+
62
+ static
63
+ RUCY_DEF0(get_note)
64
+ {
65
+ CHECK;
66
+ return value(THIS->note());
67
+ }
68
+ RUCY_END
69
+
70
+ static
71
+ RUCY_DEF0(get_frequency)
72
+ {
73
+ CHECK;
74
+ return value(THIS->frequency());
75
+ }
76
+ RUCY_END
77
+
78
+ static
79
+ RUCY_DEF0(get_velocity)
80
+ {
81
+ CHECK;
82
+ return value(THIS->velocity());
83
+ }
84
+ RUCY_END
85
+
86
+ static
87
+ RUCY_DEF0(is_captured)
88
+ {
89
+ CHECK;
90
+ return value(THIS->is_captured());
91
+ }
92
+ RUCY_END
93
+
94
+
95
+ static Class cNoteEvent;
96
+
97
+ void
98
+ Init_reflex_note_event ()
99
+ {
100
+ Module mReflex = define_module("Reflex");
101
+
102
+ cNoteEvent = mReflex.define_class("NoteEvent", Reflex::event_class());
103
+ cNoteEvent.define_alloc_func(alloc);
104
+ cNoteEvent.define_private_method("initialize", initialize);
105
+ cNoteEvent.define_private_method("initialize_copy", initialize_copy);
106
+ cNoteEvent.define_method("action", get_action);
107
+ cNoteEvent.define_method("channel", get_channel);
108
+ cNoteEvent.define_method("note", get_note);
109
+ cNoteEvent.define_method("frequency", get_frequency);
110
+ cNoteEvent.define_method("velocity", get_velocity);
111
+ cNoteEvent.define_method("captured?", is_captured);
112
+
113
+ cNoteEvent.define_const("ACTION_NONE", Reflex::NoteEvent::ACTION_NONE);
114
+ cNoteEvent.define_const("ON", Reflex::NoteEvent::ON);
115
+ cNoteEvent.define_const("OFF", Reflex::NoteEvent::OFF);
116
+ }
117
+
118
+
119
+ namespace Reflex
120
+ {
121
+
122
+
123
+ Class
124
+ note_event_class ()
125
+ {
126
+ return cNoteEvent;
127
+ }
128
+
129
+
130
+ }// Reflex