Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. #include <stdio.h>
  3. #include <stdint.h>     // uint8_t
  4.  
  5. #include <windows.h>    // некоторые компилеры не инклудят все файлы?
  6.                         // пробовать инклудить то шо нижо
  7. //#include <stdarg.h>   // или можот это относитсо только к winbase.h
  8. //#include <windef.h>
  9. //#include <winbase.h>
  10. //#include <mmsystem.h>
  11.  
  12.  
  13. // Ущербное MIDI от NS
  14. // выдрано из PCemV17Win который завалялсо на диске у NS-а
  15. // тк интернетов нету
  16. // а описаний как слать в мидю тожо нету
  17.  
  18. #include "midi.h"
  19.  
  20.  
  21.  
  22.  
  23.  
  24. //=============================================================================
  25. // целеком притянутое из PCemV17Win
  26.  
  27. #define CFG_MACHINE 0   // ХЗ шо это
  28.                         // что то из PCem
  29.  
  30.  
  31.  
  32.  
  33. /*
  34. #include <windows.h>
  35. #include <mmsystem.h>
  36. #include "ibm.h"
  37. #include "config.h"
  38. #include "plat-midi.h"
  39. */
  40.  
  41.  
  42.  
  43. static int midi_id;
  44. static HMIDIOUT midi_out_device = NULL;
  45.  
  46. //=============================================================================
  47. void midi_close();
  48. //=============================================================================
  49. void midi_init()
  50. {
  51.     MMRESULT hr;
  52.        
  53. //  midi_id = config_get_int( CFG_MACHINE, NULL, "midi", 0);
  54.     midi_id = NULL;     // тк нету config_get_int
  55.                         // можно предполоижть что это выбор миди девайса
  56.                         // и то что null возможно выберет дефолтный
  57.  
  58.     hr = midiOutOpen(   &midi_out_device,
  59.                         midi_id,
  60.                         0,
  61.                         0,
  62.                         CALLBACK_NULL
  63.                       );
  64.     //-------------------------------------------------------------------------
  65.     if (hr != MMSYSERR_NOERROR)
  66.     {
  67.         printf("midiOutOpen error - %08X\n", hr);
  68.         midi_id = 0;
  69.         hr = midiOutOpen(       &midi_out_device,
  70.                                 midi_id,
  71.                                 0,
  72.                                 0,
  73.                                 CALLBACK_NULL
  74.                            );
  75.         //---------------------------------------------------------------------
  76.         if (hr != MMSYSERR_NOERROR)
  77.         {
  78.             printf("midiOutOpen error - %08X\n", hr);
  79.             return;
  80.         }
  81.         //---------------------------------------------------------------------
  82.     }
  83.     //-------------------------------------------------------------------------
  84.     midiOutReset( midi_out_device);
  85. }
  86. //=============================================================================
  87. void midi_close()
  88. {
  89.     //-------------------------------------------------------------------------
  90.     if (midi_out_device != NULL)
  91.     {
  92.         midiOutReset( midi_out_device);
  93.         midiOutClose( midi_out_device);
  94.         midi_out_device = NULL;
  95.     }
  96.     //-------------------------------------------------------------------------
  97. }
  98. //=============================================================================
  99. int midi_get_num_devs()
  100. {
  101.     return midiOutGetNumDevs();
  102. }
  103. //=============================================================================
  104. void midi_get_dev_name( int num, char *s)
  105. {
  106.     MIDIOUTCAPS caps;
  107.  
  108.     midiOutGetDevCaps( num, &caps, sizeof(caps));
  109.     strcpy( s, caps.szPname);
  110. }
  111. //=============================================================================
  112. static int midi_pos;
  113. static int midi_len;
  114. static uint32_t midi_command;
  115. static int midi_lengths[8] = {3, 3, 3, 3, 2, 2, 3, 1};
  116. static int midi_insysex;
  117. static uint8_t midi_sysex_data[1024+2];
  118. //=============================================================================
  119. static void midi_send_sysex()
  120. {
  121.     MIDIHDR hdr;
  122.        
  123.     hdr.lpData = (LPSTR)midi_sysex_data;
  124.     hdr.dwBufferLength = midi_pos;
  125.     hdr.dwFlags = 0;
  126.        
  127. /*      
  128.     pclog("Sending sysex : ");
  129.     for (c = 0;    c < midi_pos;     c++)
  130.         pclog("%02x ", midi_sysex_data[c]);
  131.     pclog("\n");
  132. */
  133.        
  134.     midiOutPrepareHeader( midi_out_device, &hdr, sizeof( MIDIHDR));
  135.     midiOutLongMsg( midi_out_device, &hdr, sizeof( MIDIHDR));
  136.        
  137.     midi_insysex = 0;
  138. }
  139. //=============================================================================
  140. void midi_write( uint8_t val)
  141. {
  142.     //-------------------------------------------------------------------------
  143.     if ((val & 0x80) && !(val == 0xF7 && midi_insysex))
  144.     {
  145.         midi_pos = 0;
  146.         midi_len = midi_lengths[(val >> 4) & 7];
  147.         midi_command = 0;
  148.         //---------------------------------------------------------------------
  149.         if (val == 0xF0)
  150.             midi_insysex = 1;
  151.         //---------------------------------------------------------------------
  152.     }
  153.     //-------------------------------------------------------------------------
  154.     if (midi_insysex)
  155.     {
  156.         midi_sysex_data[ midi_pos++] = val;
  157.         //---------------------------------------------------------------------
  158.         if ((val == 0xF7)   ||   (midi_pos >= 1024 + 2))
  159.             midi_send_sysex();
  160.         //---------------------------------------------------------------------
  161.         return;
  162.     }
  163.     //-------------------------------------------------------------------------                
  164.     if (midi_len)
  165.     {                
  166.         midi_command |= (val << (midi_pos * 8));
  167.                
  168.         midi_pos++;
  169.         //---------------------------------------------------------------------
  170.         if (midi_pos == midi_len)
  171.             midiOutShortMsg( midi_out_device, midi_command);
  172.         //---------------------------------------------------------------------
  173.     }
  174.     //-------------------------------------------------------------------------
  175. }
  176. //=============================================================================
  177.  
  178.  
  179.  
  180.  
  181. // целеком притянутое из PCemV17Win
  182. //=============================================================================
  183.