jack2 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.

115 lines
2.3KB

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