Removed the Midi device
This commit is contained in:
parent
5936137166
commit
4e8375d8df
|
@ -6,7 +6,7 @@ An assembler and emulator for the [Uxn stack-machine](https://wiki.xxiivv.com/si
|
||||||
|
|
||||||
### Linux
|
### 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
|
```sh
|
||||||
./build.sh
|
./build.sh
|
||||||
|
|
13
build.sh
13
build.sh
|
@ -17,8 +17,6 @@ then
|
||||||
clang-format -i src/devices/ppu.c
|
clang-format -i src/devices/ppu.c
|
||||||
clang-format -i src/devices/apu.h
|
clang-format -i src/devices/apu.h
|
||||||
clang-format -i src/devices/apu.c
|
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/uxnasm.c
|
||||||
clang-format -i src/uxnemu.c
|
clang-format -i src/uxnemu.c
|
||||||
clang-format -i src/uxncli.c
|
clang-format -i src/uxncli.c
|
||||||
|
@ -28,15 +26,6 @@ mkdir -p bin
|
||||||
CFLAGS="-std=c89 -Wall -Wno-unknown-pragmas"
|
CFLAGS="-std=c89 -Wall -Wno-unknown-pragmas"
|
||||||
UXNEMU_LDFLAGS="-L/usr/local/lib $(sdl2-config --cflags --libs)"
|
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' ];
|
if [ "${1}" = '--debug' ];
|
||||||
then
|
then
|
||||||
echo "[debug]"
|
echo "[debug]"
|
||||||
|
@ -48,7 +37,7 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cc ${CFLAGS} src/uxnasm.c -o bin/uxnasm
|
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
|
cc ${CFLAGS} ${CORE} src/uxncli.c -o bin/uxncli
|
||||||
|
|
||||||
if [ -d "$HOME/bin" ] && [ -e ./bin/uxnemu ] && [ -e ./bin/uxnasm ]
|
if [ -d "$HOME/bin" ] && [ -e ./bin/uxnemu ] && [ -e ./bin/uxnasm ]
|
||||||
|
|
|
@ -68,7 +68,6 @@
|
||||||
;on-control .Controller/vector DEO2
|
;on-control .Controller/vector DEO2
|
||||||
;on-mouse .Mouse/vector DEO2
|
;on-mouse .Mouse/vector DEO2
|
||||||
;on-frame .Screen/vector DEO2
|
;on-frame .Screen/vector DEO2
|
||||||
;on-midi .Midi/vector DEO2
|
|
||||||
|
|
||||||
( channel defaults )
|
( channel defaults )
|
||||||
#dd .Audio0/volume DEO
|
#dd .Audio0/volume DEO
|
||||||
|
@ -189,23 +188,6 @@ BRK
|
||||||
|
|
||||||
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 ( -> )
|
@on-control ( -> )
|
||||||
|
|
||||||
.Controller/key DEI #00 ! #01 JCN [ BRK ]
|
.Controller/key DEI #00 ! #01 JCN [ BRK ]
|
||||||
|
|
|
@ -53,7 +53,6 @@
|
||||||
;on-frame .Screen/vector DEO2
|
;on-frame .Screen/vector DEO2
|
||||||
;on-control .Controller/vector DEO2
|
;on-control .Controller/vector DEO2
|
||||||
;on-mouse .Mouse/vector DEO2
|
;on-mouse .Mouse/vector DEO2
|
||||||
;on-midi .Midi/vector DEO2
|
|
||||||
|
|
||||||
( find center )
|
( find center )
|
||||||
.Screen/width DEI2 2// .center/x STZ2
|
.Screen/width DEI2 2// .center/x STZ2
|
||||||
|
@ -153,13 +152,6 @@ BRK
|
||||||
|
|
||||||
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 ( -> )
|
@on-mouse ( -> )
|
||||||
|
|
||||||
;draw-cursor JSR2
|
;draw-cursor JSR2
|
||||||
|
|
|
@ -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
|
|
||||||
}
|
|
|
@ -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
26
src/uxnemu.c
|
@ -4,7 +4,6 @@
|
||||||
#include "uxn.h"
|
#include "uxn.h"
|
||||||
#include "devices/ppu.h"
|
#include "devices/ppu.h"
|
||||||
#include "devices/apu.h"
|
#include "devices/apu.h"
|
||||||
#include "devices/mpu.h"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright (c) 2021 Devine Lu Linvega
|
Copyright (c) 2021 Devine Lu Linvega
|
||||||
|
@ -24,8 +23,7 @@ static SDL_Texture *fgTexture, *bgTexture;
|
||||||
static SDL_Rect gRect;
|
static SDL_Rect gRect;
|
||||||
static Ppu ppu;
|
static Ppu ppu;
|
||||||
static Apu apu[POLYPHONY];
|
static Apu apu[POLYPHONY];
|
||||||
static Mpu mpu;
|
static Device *devscreen, *devmouse, *devctrl, *devaudio0;
|
||||||
static Device *devscreen, *devmouse, *devctrl, *devmidi, *devaudio0;
|
|
||||||
|
|
||||||
#define PAD 16
|
#define PAD 16
|
||||||
|
|
||||||
|
@ -126,8 +124,6 @@ init(void)
|
||||||
gRect.y = PAD;
|
gRect.y = PAD;
|
||||||
gRect.w = ppu.width;
|
gRect.w = ppu.width;
|
||||||
gRect.h = ppu.height;
|
gRect.h = ppu.height;
|
||||||
if(!initmpu(&mpu, 1, 0))
|
|
||||||
return error("MPU", "Init failure");
|
|
||||||
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0)
|
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0)
|
||||||
return error("Init", SDL_GetError());
|
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);
|
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)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
|
void
|
||||||
nil_talk(Device *d, Uint8 b0, Uint8 w)
|
nil_talk(Device *d, Uint8 b0, Uint8 w)
|
||||||
{
|
{
|
||||||
|
@ -349,7 +335,6 @@ start(Uxn *u)
|
||||||
evaluxn(u, 0x0100);
|
evaluxn(u, 0x0100);
|
||||||
redraw(u);
|
redraw(u);
|
||||||
while(1) {
|
while(1) {
|
||||||
int i;
|
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
double elapsed, start = 0;
|
double elapsed, start = 0;
|
||||||
if(!bench)
|
if(!bench)
|
||||||
|
@ -384,13 +369,6 @@ start(Uxn *u)
|
||||||
break;
|
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));
|
evaluxn(u, mempeek16(devscreen->dat, 0));
|
||||||
if(reqdraw)
|
if(reqdraw)
|
||||||
redraw(u);
|
redraw(u);
|
||||||
|
@ -424,7 +402,7 @@ main(int argc, char **argv)
|
||||||
portuxn(&u, 0x4, "audio1", audio_talk);
|
portuxn(&u, 0x4, "audio1", audio_talk);
|
||||||
portuxn(&u, 0x5, "audio2", audio_talk);
|
portuxn(&u, 0x5, "audio2", audio_talk);
|
||||||
portuxn(&u, 0x6, "audio3", 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);
|
devctrl = portuxn(&u, 0x8, "controller", nil_talk);
|
||||||
devmouse = portuxn(&u, 0x9, "mouse", nil_talk);
|
devmouse = portuxn(&u, 0x9, "mouse", nil_talk);
|
||||||
portuxn(&u, 0xa, "file", file_talk);
|
portuxn(&u, 0xa, "file", file_talk);
|
||||||
|
|
Loading…
Reference in New Issue