Browse Source

Removed the Midi device

aarch64
neauoire 5 years ago
parent
commit
4e8375d8df
  1. 2
      README.md
  2. 13
      build.sh
  3. 18
      projects/examples/demos/drum-rack.tal
  4. 8
      projects/examples/demos/piano.tal
  5. 54
      src/devices/mpu.c
  6. 38
      src/devices/mpu.h
  7. 26
      src/uxnemu.c

2
README.md

@ -6,7 +6,7 @@ An assembler and emulator for the [Uxn stack-machine](https://wiki.xxiivv.com/si
### Linux
To build the Uxn emulator, you must have [SDL2](https://wiki.libsdl.org/). If you wish to use the `Midi` device, you must also have [Portmidi](http://portmedia.sourceforge.net/portmidi/) installed. The build script indicates whether it has detected Portmidi or not, but will build Uxn either way.
To build the Uxn emulator, you must have [SDL2](https://wiki.libsdl.org/).
```sh
./build.sh

13
build.sh

@ -17,8 +17,6 @@ then
clang-format -i src/devices/ppu.c
clang-format -i src/devices/apu.h
clang-format -i src/devices/apu.c
clang-format -i src/devices/mpu.h
clang-format -i src/devices/mpu.c
clang-format -i src/uxnasm.c
clang-format -i src/uxnemu.c
clang-format -i src/uxncli.c
@ -28,15 +26,6 @@ mkdir -p bin
CFLAGS="-std=c89 -Wall -Wno-unknown-pragmas"
UXNEMU_LDFLAGS="-L/usr/local/lib $(sdl2-config --cflags --libs)"
if cc ${CFLAGS} -c src/devices/mpu.c -o bin/mpu.o 2>/dev/null; then
rm -f bin/mpu.o
echo "Building with portmidi.."
UXNEMU_LDFLAGS="${UXNEMU_LDFLAGS} -lportmidi"
else
echo "Building without portmidi.."
CFLAGS="${CFLAGS} -DNO_PORTMIDI"
fi
if [ "${1}" = '--debug' ];
then
echo "[debug]"
@ -48,7 +37,7 @@ else
fi
cc ${CFLAGS} src/uxnasm.c -o bin/uxnasm
cc ${CFLAGS} ${CORE} src/devices/ppu.c src/devices/apu.c src/devices/mpu.c src/uxnemu.c ${UXNEMU_LDFLAGS} -o bin/uxnemu
cc ${CFLAGS} ${CORE} src/devices/ppu.c src/devices/apu.c src/uxnemu.c ${UXNEMU_LDFLAGS} -o bin/uxnemu
cc ${CFLAGS} ${CORE} src/uxncli.c -o bin/uxncli
if [ -d "$HOME/bin" ] && [ -e ./bin/uxnemu ] && [ -e ./bin/uxnasm ]

18
projects/examples/demos/drum-rack.tal

@ -68,7 +68,6 @@
;on-control .Controller/vector DEO2
;on-mouse .Mouse/vector DEO2
;on-frame .Screen/vector DEO2
;on-midi .Midi/vector DEO2
( channel defaults )
#dd .Audio0/volume DEO
@ -189,23 +188,6 @@ BRK
BRK
@on-midi ( -> )
.Midi/note DEI #00 ! #01 JCN [ BRK ]
( drums )
.Midi/channel DEI #90 ! ,&no-drum JCN
.Midi/note DEI #10 MOD ;play-pad JSR2
BRK
&no-drum
( TODO: synths )
;pad-addr #0008 ++ LDA2 .Audio0/addr DEO2
#0008 .Audio0/length DEO2
.Midi/note DEI .Audio0/pitch DEO
BRK
@on-control ( -> )
.Controller/key DEI #00 ! #01 JCN [ BRK ]

8
projects/examples/demos/piano.tal

@ -53,7 +53,6 @@
;on-frame .Screen/vector DEO2
;on-control .Controller/vector DEO2
;on-mouse .Mouse/vector DEO2
;on-midi .Midi/vector DEO2
( find center )
.Screen/width DEI2 2// .center/x STZ2
@ -153,13 +152,6 @@ BRK
BRK
@on-midi ( -> )
.Midi/note DEI #00 ! #01 JCN [ BRK ]
.Midi/note DEI .Audio0/pitch .Midi/channel DEI #04 MOD #10 * + DEO
BRK
@on-mouse ( -> )
;draw-cursor JSR2

54
src/devices/mpu.c

@ -1,54 +0,0 @@
#include "mpu.h"
/*
Copyright (c) 2021 Devine Lu Linvega
Copyright (c) 2021 Andrew Alderwick
Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE.
*/
int
initmpu(Mpu *m, Uint8 dev_in, Uint8 dev_out)
{
#ifndef NO_PORTMIDI
int i;
Pm_Initialize();
for(i = 0; i < Pm_CountDevices(); ++i)
printf("Device #%d -> %s%s\n", i, Pm_GetDeviceInfo(i)->name, i == dev_in ? "[x]" : "[ ]");
Pm_OpenInput(&m->input, dev_in, NULL, 128, 0, NULL);
Pm_OpenOutput(&m->output, dev_out, NULL, 128, 0, NULL, 1);
m->queue = 0;
m->error = pmNoError;
#endif
(void)m;
(void)dev_in;
return 1;
}
void
getmidi(Mpu *m)
{
#ifndef NO_PORTMIDI
const int result = Pm_Read(m->input, m->events, 32);
if(result < 0) {
m->error = (PmError)result;
m->queue = 0;
return;
}
m->queue = result;
#endif
(void)m;
}
void
putmidi(Mpu *m, Uint8 chan, Uint8 note, Uint8 velo)
{
#ifndef NO_PORTMIDI
Pm_WriteShort(m->output, Pt_Time(), Pm_Message(0x90 + chan, note, velo));
#endif
}

38
src/devices/mpu.h

@ -1,38 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
/*
Copyright (c) 2021 Devine Lu Linvega
Copyright (c) 2021 Andrew Alderwick
Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE.
*/
#ifndef NO_PORTMIDI
#include <portmidi.h>
#include <porttime.h>
#else
typedef struct {
int message;
} PmEvent;
#endif
typedef unsigned char Uint8;
typedef struct {
Uint8 queue;
PmEvent events[32];
#ifndef NO_PORTMIDI
PmStream *input, *output;
PmError error;
#endif
} Mpu;
int initmpu(Mpu *m, Uint8 dev_in, Uint8 dev_out);
void getmidi(Mpu *m);
void putmidi(Mpu *m, Uint8 chan, Uint8 note, Uint8 velo);

26
src/uxnemu.c

@ -4,7 +4,6 @@
#include "uxn.h"
#include "devices/ppu.h"
#include "devices/apu.h"
#include "devices/mpu.h"
/*
Copyright (c) 2021 Devine Lu Linvega
@ -24,8 +23,7 @@ static SDL_Texture *fgTexture, *bgTexture;
static SDL_Rect gRect;
static Ppu ppu;
static Apu apu[POLYPHONY];
static Mpu mpu;
static Device *devscreen, *devmouse, *devctrl, *devmidi, *devaudio0;
static Device *devscreen, *devmouse, *devctrl, *devaudio0;
#define PAD 16
@ -126,8 +124,6 @@ init(void)
gRect.y = PAD;
gRect.w = ppu.width;
gRect.h = ppu.height;
if(!initmpu(&mpu, 1, 0))
return error("MPU", "Init failure");
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0)
return error("Init", SDL_GetError());
gWindow = SDL_CreateWindow("Uxn", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, (ppu.width + PAD * 2) * zoom, (ppu.height + PAD * 2) * zoom, SDL_WINDOW_SHOWN);
@ -323,16 +319,6 @@ datetime_talk(Device *d, Uint8 b0, Uint8 w)
(void)w;
}
void
midi_talk(Device *d, Uint8 b0, Uint8 w)
{
if(w && b0 == 0x9) {
putmidi(&mpu, d->dat[0x8], d->dat[0x9], 127);
putmidi(&mpu, d->dat[0x8], d->dat[0x9], 0);
}
(void)d;
}
void
nil_talk(Device *d, Uint8 b0, Uint8 w)
{
@ -349,7 +335,6 @@ start(Uxn *u)
evaluxn(u, 0x0100);
redraw(u);
while(1) {
int i;
SDL_Event event;
double elapsed, start = 0;
if(!bench)
@ -384,13 +369,6 @@ start(Uxn *u)
break;
}
}
getmidi(&mpu);
for(i = 0; i < mpu.queue; ++i) {
devmidi->dat[2] = mpu.events[i].message;
devmidi->dat[3] = mpu.events[i].message >> 8;
devmidi->dat[4] = mpu.events[i].message >> 16;
evaluxn(u, mempeek16(devmidi->dat, 0));
}
evaluxn(u, mempeek16(devscreen->dat, 0));
if(reqdraw)
redraw(u);
@ -424,7 +402,7 @@ main(int argc, char **argv)
portuxn(&u, 0x4, "audio1", audio_talk);
portuxn(&u, 0x5, "audio2", audio_talk);
portuxn(&u, 0x6, "audio3", audio_talk);
devmidi = portuxn(&u, 0x7, "midi", midi_talk);
portuxn(&u, 0x7, "---", nil_talk);
devctrl = portuxn(&u, 0x8, "controller", nil_talk);
devmouse = portuxn(&u, 0x9, "mouse", nil_talk);
portuxn(&u, 0xa, "file", file_talk);

Loading…
Cancel
Save