As aucat was simplified, base system lost the ability to move midi
data from one port to another; for instance to connect a midi
keyboard to a synth.

The diff below adds the midicat utility which I used last few
months to test/debug my midi setup and to connect my keyboard to a
my synth. Example:

        midicat -i rmidi/0 -o rmidi/1

I could provide a diff to add this to the ports tree, if it's a
more appropriate place for it.

Thoughts? Other ideas? OKs?

--- usr.bin/Makefile.orig       Sat Jul 18 04:01:36 2015
+++ usr.bin/Makefile    Sun Aug 30 20:12:02 2015
@@ -13,7 +13,7 @@ SUBDIR= apply arch at aucat audioctl awk banner \
        join jot kdump keynote ktrace lam last lastcomm leave less lex \
        libtool lndir \
        locale locate lock logger login logname look lorder \
-       m4 mail make mandoc mesg mg \
+       m4 mail make mandoc mesg mg midicat \
        midiplay mixerctl mkdep mklocale mktemp nc netstat \
        newsyslog \
        nfsstat nice nm nl nohup openssl pagesize passwd paste patch pctr \
--- /dev/null   Sun Aug 30 20:18:05 2015
+++ usr.bin/midicat/midicat.1   Sun Aug 30 20:15:12 2015
@@ -0,0 +1,65 @@
+.\"    $OpenBSD$
+.\"
+.\" Copyright (c) 2015 Alexandre Ratchov <a...@caoua.org>
+.\"
+.\" 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 INCLUDING ALL IMPLIED WARRANTIES OF
+.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+.\"
+.Dd $Mdocdate$
+.Dt MIDICAT 1
+.Os
+.Sh NAME
+.Nm midicat
+.Nd send to or receive from MIDI ports.
+.Sh SYNOPSIS
+.Nm midicat
+.Bk -words
+.Op Fl d
+.Op Fl i Ar port
+.Op Fl o Ar port
+.Ek
+.Sh DESCRIPTION
+The
+.Nm
+utility receives MIDI data from the given input MIDI port and/or
+sends it to the given output MIDI port.
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl d
+Dump transferred data in hex on stderr.
+.It Fl i Ar port
+Use this
+.Xr sndio 7
+MIDI port as input instead of stdin.
+.It Fl o Ar port
+Use this
+.Xr sndio 7
+MIDI port as output instead of stdout.
+.El
+.Sh EXAMPLES
+Dump data received from
+.Pa rmidi/0
+to stderr:
+.Bd -literal -offset indent
+$ midicat \-di rmidi/0 >/dev/null
+.Ed
+.Pp
+Send data from
+.Pa rmidi/0
+to
+.Pa midithru/0:
+.Bd -literal -offset indent
+$ midicat \-i rmidi/0 \-o midithru/0
+.Ed
+.Sh SEE ALSO
+.Xr midi 4 ,
+.Xr sndio 7
--- /dev/null   Sun Aug 30 20:18:05 2015
+++ usr.bin/midicat/midicat.c   Sun Aug 30 20:09:37 2015
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2015 Alexandre Ratchov <a...@caoua.org>
+ *
+ * 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 INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+#include <fcntl.h>
+#include <sndio.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+char usagestr[] = "usage: midicat [-d] [-i port] [-o port]\n";
+
+int
+main(int argc, char **argv)
+{
+#define MIDI_BUFSZ     1024
+       unsigned char buf[MIDI_BUFSZ];
+       struct mio_hdl *ih, *oh;
+       char *in, *out;
+       int dump, c, i, len, sep;
+
+       dump = 0;
+       in = NULL;
+       out = NULL;
+       ih = NULL;
+       oh = NULL;
+       
+       while ((c = getopt(argc, argv, "di:o:")) != -1) {
+               switch (c) {
+               case 'd':
+                       dump = 1;
+                       break;
+               case 'i':
+                       in = optarg;
+                       break;
+               case 'o':
+                       out = optarg;
+                       break;
+               default:
+                       goto bad_usage;
+               }
+       }
+       argc -= optind;
+       argv += optind;
+       if (argc != 0) {
+       bad_usage:
+               fputs(usagestr, stderr);
+               return 1;
+       }
+       if (in == NULL && out == NULL) {
+               fputs("either -i or -o required\n", stderr);
+               exit(1);
+       }
+       if (in) {
+               ih = mio_open(in, MIO_IN, 0);
+               if (ih == NULL) {
+                       fprintf(stderr, "%s: couldn't open MIDI in\n", in);
+                       exit(1);
+               }
+       }
+       if (out) {
+               oh = mio_open(out, MIO_OUT, 0);
+               if (oh == NULL) {
+                       fprintf(stderr, "%s: couldn't open MIDI out\n", out);
+                       exit(1);
+               }
+       }
+       for (;;) {
+               if (in) {
+                       len = mio_read(ih, buf, sizeof(buf));
+                       if (len == 0) {
+                               fprintf(stderr, "%s: disconnected\n", in);
+                               break;
+                       }
+               } else {
+                       len = read(STDIN_FILENO, buf, sizeof(buf));
+                       if (len == 0)
+                               break;
+                       if (len < 0) {
+                               perror("stdin");
+                               exit(1);
+                       }
+               }
+               if (out)
+                       mio_write(oh, buf, len);
+               else
+                       write(STDOUT_FILENO, buf, len);
+               if (dump) {
+                       for (i = 0; i < len; i++) {
+                               sep = (i % 16 == 15 || i == len - 1) ?
+                                   '\n' : ' ';
+                               fprintf(stderr, "%02x%c", buf[i], sep);
+                       }
+               }
+       }
+       if (in)
+               mio_close(ih);
+       if (out)
+               mio_close(oh);
+       return 0;
+}
--- /dev/null   Sun Aug 30 20:18:05 2015
+++ usr.bin/midicat/Makefile    Sun Aug 30 20:18:02 2015
@@ -0,0 +1,6 @@
+#      $OpenBSD$
+
+PROG=  midicat
+MAN=   midicat.1
+LDADD+=        -lsndio
+.include <bsd.prog.mk>

Reply via email to