Midi programmiren



  • Hallo

    Ich möchte gerne unter visual c# eine Midi Anwendung schreiben
    ich habe unter http://www.gotdotnet.com/community/usersamples/details.aspx?sampleguid=89cde290-5580-40bf-90d2-5754b2e8137c

    Eine Midi klasse gefunden.Aber kenne mich da mit nicht aus hat jemand erfahrung mit midi programmierung.oder kann mir jemand sagen wie ich diese klasse Anwenden kann?

    Bin prg Anfänger

    Dankeee!!!



  • Hallo!

    Also diese Klasse sieht ja eigentlich recht einfach aus und es gibt ein paar Beispiele zur Verwendung.
    Was genau ist denn dein Problem bzw. was willst Du überhaupt machen?

    Gruß,
    yanni



  • Hallo yanni

    ich möchte ein Midi keyboard ans pc anschlissen über midiin eingang. und die noten die auf dem keyboard gespielt werden abfangen und weiter verarbeiten.

    in dise klasse ist ein DrumDemo wenn ich auf dem pc tastatur eine bestimmte taste drücke dann spielt ein instrument.

    ich möchte aber diese instrumente über mein Midi-keyboad spielen

    ich weiss nicht wie ich das machen soll!!
    welche methode dafür zuständig ist.

    Gruß Can



  • Hi!

    Tja, MIDI-Input scheint in der Klasse wirklich nicht vorgesehen zu sein.
    Wie's aussieht, werden die MIDI-Funktionen aus non-managed DLLs importiert (in der NativeMethods-Klasse in MidiInterop.cs). Die entsprchende Funktion wäre wohl midiInOpen. Aber ich weiß leider nicht, wie man die verwendet und u.U. könnte es Probleme mit der Callback-Funktion geben.

    Gruß,
    yanni



  • Hallo

    Soll ich es lieber mit DirectX-DirectMusic programmieren
    was meinst du?

    Oder gibt es andere klassen für Midi?

    ich habe mal bei Amazon nach Büchern nach geschaut aber ich finde keine buch in Deutsch für DirectX .net

    Gibet es ein buch oder eine informations quelle wie ich DirectX mit visual c#
    programmieren kann?

    Gruß Can



  • also mit MidiInOpen etc.
    währe ein sehr einfacher hartcodierter Midi-Thru zum soundkarten synth max.20 zeilen C:

    #include <mmsystems>
    void CALLBACK MidiInFunc(hMidiIn, wMsg, const class_midiout * Midiout,  dwParam1, dwParam2)
     {
    //ganz eifach:
    if (wMsg==MIM_data)midiOutShortMsg(hMidiOut, dwParam1);
    // oder die klasse benutzen:
    if (wMsg==MIM_data)Midiout->ausgabe(dwParam1);
    }
    
    HANDLE midiIn;
    class_midiout  Midiout ;
    .....  // midiOut initialisieren
    ........
    midiInOpen(&midiIn, wDeviceID, (long)MidiInFunc, (long)&Midiout, CALLBACK_FUNCTION);
    ...
    midiInClose(midiIn);
    // evtl. grosskleinschreibung überprüfen : der code ist 'ne grobe übersetzung aus einem Pascal fragment
    

    benutzung des dx-synths ist damit allerdings nicht möglich

    schreib mal was genau du vorhast (z.B. ob du nur ein Programm brauchst oder dich generell mit midi auseinander setzten willst, im ersteren fall würd wahrscheinlich "midi-ox" weiterhelfen)



  • Hallo Lui

    Also ich möchte ein Midi_Begleitautomat programmiren.
    Das heist ich muß ein Midi-Keyboad über die MidiIn buchse des pc's Anschließen
    Und die gespielten noten an die soundkarte oder an eine sofware-syntheiser weiterleiten.

    ich habe versucht es in visual c++6 zu programmiren.hab da für auch klassen gekauft (MaximumMidi) Aber es ist seher schwer für mich da ich Anfänger bin.

    jetz hat mir ein freund geraten so ein programm in visual C# zu schreiben
    weil es leichter sein soll.in der tat weil es keine zeiger und so weiter hat.

    Für c# habe ich unter diese klasse gefunden aber die klasse hat keine midiin und midiout funklion.

    Midi For .Net v2,0
    http://www.gotdotnet.com/community/usersamples/details.aspx?sampleguid=89cde290-5580-40bf-90d2-5754b2e8137c

    vielleicht kann ich meine klassen in c++ v6 in c# benutzen aber ich weiss nicht wie ich es machen soll.

    jetz stehe ich daa 😞

    Gruß Can



  • ich weis nicht ganz genau wo ich anfangen soll also
    a) zeiger sind nichts dramatisches und c# versteckt die nur (sehr simpel vormuliert)

    b) im prinzip müsste du bei meinem beispiel nur noch die gewünschte transformation durchführen (ich steh dummerweise mit der c(++/# etc.) syntax auf kriegsfuss) ich versuch mal eine demo (mit korekturen zum letzten post)

    #include <mmsystem.h> 
    void CALLBACK MidiInFunc(HANDLE hMidiIn,UINT wMsg,HANDLE * Midiout,long  dwParam1, long dwParam2) 
    { 
    long chan,what,note,vel;
    if (wMsg!=MIM_DATA)return;//andere meldungen
    chan=dwParam1 & 0x0F;//kanal 0-15 die ersten 4 bits
    what=(dwParam1 >> 4) & 0x0F;// die nächsten 4 bits u.a. note an/aus 
    note=(dwParam1 >> 8) & 0xFF;//sollte klar sein ;-)
    vel=(dwParam1 >> 16) & 0xFF;//anschlagstärke
    if (what!=8 && what!=9) return;// 8 und 9 sind note aus bzw. an alles andere wird erstmal ignoriert
    
    midiOutShortMsg(*hMidiOut, dwParam1); // erstmal die gleiche note zur ausgabe senden
    note+=12//und ne oktave höher
    midiOutShortMsg(*hMidiOut, chan+what*16+note*256 +vel*256*256);
    }
    
    // in der init function:
    midiOutOpen(&midiOut, MIDI_MAPPER,0,0,0);
    midiInOpen(&midiIn, 0/* erstes gerät*/, (long)MidiInFunc, (long)&midiOut, CALLBACK_FUNCTION);
    // beim beenden schliessen nicht vergessen:
    midiOutClose(midiOut);
    midiInClose(midiIn);
    

    -evtl. winmm.lib in den linker optione eintragen

    sollte eigentlich auch mit JEDEM C DIALEKT also auch vc+ und c# klappen

    p.s falls du auf der suche nach einer netten programiersprache bist würd ich pascal nicht vergessen


Log in to reply