Top secrets sources NedoPC pentevo

Rev

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


#include <stdio.h>
#include <stdint.h>     // uint8_t

#include <windows.h>    // некоторые компилеры не инклудят все файлы?
                        // пробовать инклудить то шо нижо
//#include <stdarg.h>   // или можот это относитсо только к winbase.h
//#include <windef.h>
//#include <winbase.h>
//#include <mmsystem.h>


// Ущербное MIDI от NS
// выдрано из PCemV17Win который завалялсо на диске у NS-а
// тк интернетов нету
// а описаний как слать в мидю тожо нету

#include "midi.h"





//=============================================================================
// целеком притянутое из PCemV17Win

#define CFG_MACHINE 0   // ХЗ шо это
                        // что то из PCem




/*
#include <windows.h>
#include <mmsystem.h>
#include "ibm.h"
#include "config.h"
#include "plat-midi.h"
*/




static int midi_id;
static HMIDIOUT midi_out_device = NULL;

//=============================================================================
void midi_close();
//=============================================================================
void midi_init()
{
    MMRESULT hr;
       
//  midi_id = config_get_int( CFG_MACHINE, NULL, "midi", 0);
    midi_id = NULL;     // тк нету config_get_int
                        // можно предполоижть что это выбор миди девайса
                        // и то что null возможно выберет дефолтный

    hr = midiOutOpen(   &midi_out_device,
                        midi_id,
                        0,
                        0,
                        CALLBACK_NULL
                      );
    //-------------------------------------------------------------------------
    if (hr != MMSYSERR_NOERROR)
    {
        printf("midiOutOpen error - %08X\n", hr);
        midi_id = 0;
        hr = midiOutOpen(       &midi_out_device,
                                midi_id,
                                0,
                                0,
                                CALLBACK_NULL
                           );
        //---------------------------------------------------------------------
        if (hr != MMSYSERR_NOERROR)
        {
            printf("midiOutOpen error - %08X\n", hr);
            return;
        }
        //---------------------------------------------------------------------
    }
    //-------------------------------------------------------------------------
    midiOutReset( midi_out_device);
}
//=============================================================================
void midi_close()
{
    //-------------------------------------------------------------------------
    if (midi_out_device != NULL)
    {
        midiOutReset( midi_out_device);
        midiOutClose( midi_out_device);
        midi_out_device = NULL;
    }
    //-------------------------------------------------------------------------
}
//=============================================================================
int midi_get_num_devs()
{
    return midiOutGetNumDevs();
}
//=============================================================================
void midi_get_dev_name( int num, char *s)
{
    MIDIOUTCAPS caps;

    midiOutGetDevCaps( num, &caps, sizeof(caps));
    strcpy( s, caps.szPname);
}
//=============================================================================
static int midi_pos;
static int midi_len;
static uint32_t midi_command;
static int midi_lengths[8] = {3, 3, 3, 3, 2, 2, 3, 1};
static int midi_insysex;
static uint8_t midi_sysex_data[1024+2];
//=============================================================================
static void midi_send_sysex()
{
    MIDIHDR hdr;
       
    hdr.lpData = (LPSTR)midi_sysex_data;
    hdr.dwBufferLength = midi_pos;
    hdr.dwFlags = 0;
       
/*      
    pclog("Sending sysex : ");
    for (c = 0;    c < midi_pos;     c++)
        pclog("%02x ", midi_sysex_data[c]);
    pclog("\n");
*/

       
    midiOutPrepareHeader( midi_out_device, &hdr, sizeof( MIDIHDR));
    midiOutLongMsg( midi_out_device, &hdr, sizeof( MIDIHDR));
       
    midi_insysex = 0;
}
//=============================================================================
void midi_write( uint8_t val)
{
    //-------------------------------------------------------------------------
    if ((val & 0x80) && !(val == 0xF7 && midi_insysex))
    {
        midi_pos = 0;
        midi_len = midi_lengths[(val >> 4) & 7];
        midi_command = 0;
        //---------------------------------------------------------------------
        if (val == 0xF0)
            midi_insysex = 1;
        //---------------------------------------------------------------------
    }
    //-------------------------------------------------------------------------
    if (midi_insysex)
    {
        midi_sysex_data[ midi_pos++] = val;
        //---------------------------------------------------------------------
        if ((val == 0xF7)   ||   (midi_pos >= 1024 + 2))
            midi_send_sysex();
        //---------------------------------------------------------------------
        return;
    }
    //-------------------------------------------------------------------------                
    if (midi_len)
    {                
        midi_command |= (val << (midi_pos * 8));
               
        midi_pos++;
        //---------------------------------------------------------------------
        if (midi_pos == midi_len)
            midiOutShortMsg( midi_out_device, midi_command);
        //---------------------------------------------------------------------
    }
    //-------------------------------------------------------------------------
}
//=============================================================================




// целеком притянутое из PCemV17Win
//=============================================================================