jack1 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
2.3KB

  1. #include <stdio.h>
  2. #include <assert.h>
  3. #include <jack/jack.h>
  4. #include <jack/midiport.h>
  5. static jack_port_t* port;
  6. static void
  7. describe (jack_midi_event_t* event, char* buffer, size_t buflen)
  8. {
  9. assert (buflen > 0);
  10. buffer[0] = '\0';
  11. if (event->size == 0) {
  12. return;
  13. }
  14. int type = event->buffer[0] & 0xf0;
  15. int channel = event->buffer[0] & 0xf;
  16. switch (type) {
  17. case 0x90:
  18. assert (event->size == 3);
  19. snprintf (buffer, buflen, "note on (channel %d): pitch %d, velocity %d", channel, event->buffer[1], event->buffer[2]);
  20. break;
  21. case 0x80:
  22. assert (event->size == 3);
  23. snprintf (buffer, buflen, "note off (channel %d): pitch %d, velocity %d", channel, event->buffer[1], event->buffer[2]);
  24. break;
  25. case 0xb0:
  26. assert (event->size == 3);
  27. snprintf (buffer, buflen, "control change (channel %d): controller %d, value %d", channel, event->buffer[1], event->buffer[2]);
  28. break;
  29. default:
  30. break;
  31. }
  32. }
  33. int
  34. process (jack_nframes_t frames, void* arg)
  35. {
  36. void* buffer;
  37. jack_nframes_t N;
  38. jack_nframes_t i;
  39. char description[256];
  40. buffer = jack_port_get_buffer (port, frames);
  41. assert (buffer);
  42. N = jack_midi_get_event_count (buffer);
  43. for (i = 0; i < N; ++i) {
  44. jack_midi_event_t event;
  45. int r;
  46. r = jack_midi_event_get (&event, buffer, i);
  47. if (r == 0) {
  48. size_t j;
  49. printf ("%d:", event.time);
  50. for (j = 0; j < event.size; ++j) {
  51. printf (" %x", event.buffer[j]);
  52. }
  53. describe (&event, description, sizeof (description));
  54. printf (" %s", description);
  55. printf ("\n");
  56. }
  57. }
  58. return 0;
  59. }
  60. int
  61. main (int argc, char* argv[])
  62. {
  63. jack_client_t* client;
  64. char const default_name[] = "midi-monitor";
  65. char const * client_name;
  66. int r;
  67. if (argc == 2) {
  68. client_name = argv[1];
  69. } else {
  70. client_name = default_name;
  71. }
  72. client = jack_client_open (client_name, JackNullOption, NULL);
  73. if (client == NULL) {
  74. fprintf (stderr, "Could not create JACK client.\n");
  75. exit (EXIT_FAILURE);
  76. }
  77. jack_set_process_callback (client, process, 0);
  78. port = jack_port_register (client, "input", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
  79. if (port == NULL) {
  80. fprintf (stderr, "Could not register port.\n");
  81. exit (EXIT_FAILURE);
  82. }
  83. r = jack_activate (client);
  84. if (r != 0) {
  85. fprintf (stderr, "Could not activate client.\n");
  86. exit (EXIT_FAILURE);
  87. }
  88. sleep (-1);
  89. return 0;
  90. }