Stoppt die Vorratsdatenspeicherung! Jetzt klicken && handeln!Willst du auch bei der Aktion teilnehmen? Hier findest du alle relevanten Infos und Materialien:
 
Simple MIDI
von Plapperkatze am 8.März 2006 um 22:57
zurück zur Kategorie "Tutorials"

Hier habe ich ein kleines Fenster erzeugt, das über das MIDI Interface Töne spielt, wenn man mit der Maus reinklickt.

Man benötigt ein Handle auf ein MIDI-Ausgabe-Gerät:
HMIDIOUT device; // ein midi device

Neu sind dann eigentlich nur die folgenden 4 Funktionen aus mmsystem.h:
midiOutOpen(&device,midiport,0,0,CALLBACK_NULL); // MIDI output initialisieren
midiOutShortMsg(device,midimessage.word); // MIDI Daten senden (nicht SYSEX)
midiOutReset(device); // Wiedergabe stoppen
midiOutClose(device); // MIDI output beenden

Hier ist der Quelltext:
#include <windows.h>
#include <stdio.h>
#include <mmsystem.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

const char szAppName[]    = "midi";
 
HMIDIOUT device; // ein midi device
int x;           // x koordinate der maus
BOOL play=FALSE; // sound on/off


int WINAPI WinMain(  HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   PSTR szCmdLine, int iCmdShow)
{
 MSG        msg;
 HWND       hWnd;
 WNDCLASS   wc;

 wc.style               = NULL; // diesmal nicht CS_HREDRAW | CS_VREDRAW;
 wc.lpfnWndProc         = WndProc;
 wc.cbClsExtra          = 0;
 wc.cbWndExtra          = 0;
 wc.hInstance           = hInstance;
 wc.hCursor             = LoadCursor(NULL, IDC_ARROW);
 wc.hIcon               = LoadIcon(NULL, IDI_APPLICATION);
 wc.hbrBackground       = (HBRUSH)GetStockObject(LTGRAY_BRUSH);//hBrush;
 wc.lpszClassName       = szAppName;
 wc.lpszMenuName        = NULL;
 
 RegisterClass(&wc);
 
 hWnd = CreateWindow(   szAppName,
                        szAppName,
                        WS_OVERLAPPEDWINDOW|WS_SYSMENU,
                        CW_USEDEFAULT,
                        CW_USEDEFAULT,
                        400,
                        240,
                        NULL,
                        NULL,
                        hInstance,
                        NULL);
                       
 ShowWindow(hWnd, iCmdShow);
 UpdateWindow(hWnd);

 while (GetMessage(&msg, NULL, 0, 0))
 {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
 }
 return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 HDC hDC;        // für BeginPaint()
 PAINTSTRUCT ps; // für BeginPaint()
 union { unsigned long word; unsigned char data[4]; } midimessage;
 char c[256]; // puffer für sprintf
 int flag,midiport=0; // flag für errorcodes, midiport festlegen

 switch (message)
 {
   case WM_CREATE:
     // Open the MIDI output port
     flag = midiOutOpen(&device,midiport,0,0,CALLBACK_NULL);
     if (flag != MMSYSERR_NOERROR)
     {
       MessageBox(hWnd,"Error opening MIDI Output.",szAppName,MB_OK);
       PostMessage(hWnd, WM_CLOSE, 0, 0);
     }
     break;
   case WM_MOUSEMOVE:
     x=(float)LOWORD(lParam)*108/400;
     if(play)
     {
       midimessage.data[0] = 0x90; // note-on message (requires to data bytes)
       midimessage.data[1] = (char)x;// note-on message: Key number (60 = middle C)
       midimessage.data[2] = 100;  // note-on message: Key velocity (100 = loud)
       midimessage.data[3] = 0;    // Unused parameter
       flag = midiOutShortMsg(device,midimessage.word);
       if (flag != MMSYSERR_NOERROR)
       {
         MessageBox(hWnd,"Warning: MIDI Output is not open.",szAppName,MB_OK);
         PostMessage(hWnd, WM_CLOSE, 0, 0);
       }
       InvalidateRect(hWnd,NULL,TRUE);
     }
     break;
   case WM_LBUTTONDOWN:
     play=TRUE;
     break;
   case WM_LBUTTONUP:
     play=FALSE;
     break;
   case WM_PAINT:
     hDC = BeginPaint(hWnd, &ps);
     SetBkColor(hDC,RGB(192,192,192));
     sprintf(c,"%d",x);
     TextOut(hDC,200,50,c,strlen(c));
     EndPaint(hWnd, &ps);
     break;
   case WM_DESTROY:
   {
     // turn any MIDI notes currently playing:
     midiOutReset(device);

     // Remove any data in MIDI device and close the MIDI Output port
     midiOutClose(device);


     PostQuitMessage(0);
     return 0;
   }
 }

 return DefWindowProc(hWnd, message, wParam, lParam);
}

Das ganze gibt es hier als .rar (27kB):
http://katze.dead-men.de/upload/31_midi.rar

gruesse, die plapperkatz

zurück zur Kategorie "Tutorials"
[0 Kommentare]

Name


Kommentar




Bitte abtippen


 
(C) 2006-20012 Plapperkatze - 215303 Besucher seit dem 23.01.2012 Login