| ... | ... |
@@ -13,30 +13,28 @@ WITH REGARD TO THIS SOFTWARE. |
| 13 | 13 |
*/ |
| 14 | 14 |
|
| 15 | 15 |
int |
| 16 |
-initmpu(Mpu *m, Uint8 device) |
|
| 16 |
+initmpu(Mpu *m, Uint8 dev_in, Uint8 dev_out) |
|
| 17 | 17 |
{
|
| 18 | 18 |
#ifndef NO_PORTMIDI |
| 19 | 19 |
int i; |
| 20 | 20 |
Pm_Initialize(); |
| 21 | 21 |
for(i = 0; i < Pm_CountDevices(); ++i) |
| 22 |
- printf("Device #%d -> %s%s\n",
|
|
| 23 |
- i, |
|
| 24 |
- Pm_GetDeviceInfo(i)->name, |
|
| 25 |
- i == device ? "[x]" : "[ ]"); |
|
| 26 |
- Pm_OpenInput(&m->midi, device, NULL, 128, 0, NULL); |
|
| 22 |
+ printf("Device #%d -> %s%s\n", i, Pm_GetDeviceInfo(i)->name, i == dev_in ? "[x]" : "[ ]");
|
|
| 23 |
+ Pm_OpenInput(&m->input, dev_in, NULL, 128, 0, NULL); |
|
| 24 |
+ Pm_OpenOutput(&m->output, dev_out, NULL, 128, 0, NULL, 1); |
|
| 27 | 25 |
m->queue = 0; |
| 28 | 26 |
m->error = pmNoError; |
| 29 | 27 |
#endif |
| 30 | 28 |
(void)m; |
| 31 |
- (void)device; |
|
| 29 |
+ (void)dev_in; |
|
| 32 | 30 |
return 1; |
| 33 | 31 |
} |
| 34 | 32 |
|
| 35 | 33 |
void |
| 36 |
-listenmpu(Mpu *m) |
|
| 34 |
+getmidi(Mpu *m) |
|
| 37 | 35 |
{
|
| 38 | 36 |
#ifndef NO_PORTMIDI |
| 39 |
- const int result = Pm_Read(m->midi, m->events, 32); |
|
| 37 |
+ const int result = Pm_Read(m->input, m->events, 32); |
|
| 40 | 38 |
if(result < 0) {
|
| 41 | 39 |
m->error = (PmError)result; |
| 42 | 40 |
m->queue = 0; |
| ... | ... |
@@ -46,3 +44,11 @@ listenmpu(Mpu *m) |
| 46 | 44 |
#endif |
| 47 | 45 |
(void)m; |
| 48 | 46 |
} |
| 47 |
+ |
|
| 48 |
+void |
|
| 49 |
+putmidi(Mpu *m, Uint8 chan, Uint8 note, Uint8 velo) |
|
| 50 |
+{
|
|
| 51 |
+#ifndef NO_PORTMIDI |
|
| 52 |
+ Pm_WriteShort(m->output, Pt_Time(), Pm_Message(0x90 + chan, note, velo)); |
|
| 53 |
+#endif |
|
| 54 |
+} |
|
| 49 | 55 |
\ No newline at end of file |
| ... | ... |
@@ -15,6 +15,7 @@ WITH REGARD TO THIS SOFTWARE. |
| 15 | 15 |
|
| 16 | 16 |
#ifndef NO_PORTMIDI |
| 17 | 17 |
#include <portmidi.h> |
| 18 |
+#include <porttime.h> |
|
| 18 | 19 |
#else |
| 19 | 20 |
typedef struct {
|
| 20 | 21 |
int message; |
| ... | ... |
@@ -27,10 +28,11 @@ typedef struct {
|
| 27 | 28 |
Uint8 queue; |
| 28 | 29 |
PmEvent events[32]; |
| 29 | 30 |
#ifndef NO_PORTMIDI |
| 30 |
- PmStream *midi; |
|
| 31 |
+ PmStream *input, *output; |
|
| 31 | 32 |
PmError error; |
| 32 | 33 |
#endif |
| 33 | 34 |
} Mpu; |
| 34 | 35 |
|
| 35 |
-int initmpu(Mpu *m, Uint8 device); |
|
| 36 |
-void listenmpu(Mpu *m); |
|
| 36 |
+int initmpu(Mpu *m, Uint8 dev_in, Uint8 dev_out); |
|
| 37 |
+void getmidi(Mpu *m); |
|
| 38 |
+void putmidi(Mpu *m, Uint8 chan, Uint8 note, Uint8 velo); |
|
| 37 | 39 |
\ No newline at end of file |
| ... | ... |
@@ -126,7 +126,7 @@ init(void) |
| 126 | 126 |
gRect.y = PAD; |
| 127 | 127 |
gRect.w = ppu.width; |
| 128 | 128 |
gRect.h = ppu.height; |
| 129 |
- if(!initmpu(&mpu, 1)) |
|
| 129 |
+ if(!initmpu(&mpu, 1, 0)) |
|
| 130 | 130 |
return error("MPU", "Init failure");
|
| 131 | 131 |
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) |
| 132 | 132 |
return error("Init", SDL_GetError());
|
| ... | ... |
@@ -326,9 +326,11 @@ datetime_talk(Device *d, Uint8 b0, Uint8 w) |
| 326 | 326 |
void |
| 327 | 327 |
midi_talk(Device *d, Uint8 b0, Uint8 w) |
| 328 | 328 |
{
|
| 329 |
+ if(w && b0 == 0x9) {
|
|
| 330 |
+ putmidi(&mpu, d->dat[0x8], d->dat[0x9], 127); |
|
| 331 |
+ putmidi(&mpu, d->dat[0x8], d->dat[0x9], 0); |
|
| 332 |
+ } |
|
| 329 | 333 |
(void)d; |
| 330 |
- (void)b0; |
|
| 331 |
- (void)w; |
|
| 332 | 334 |
} |
| 333 | 335 |
|
| 334 | 336 |
void |
| ... | ... |
@@ -382,7 +384,7 @@ start(Uxn *u) |
| 382 | 384 |
break; |
| 383 | 385 |
} |
| 384 | 386 |
} |
| 385 |
- listenmpu(&mpu); |
|
| 387 |
+ getmidi(&mpu); |
|
| 386 | 388 |
for(i = 0; i < mpu.queue; ++i) {
|
| 387 | 389 |
devmidi->dat[2] = mpu.events[i].message; |
| 388 | 390 |
devmidi->dat[3] = mpu.events[i].message >> 8; |