Avatar billede kurtspurt Nybegynder
16. april 2004 - 00:55 Der er 11 kommentarer og
1 løsning

Midi i c

hej
Jeg har et consolprogram.

nu kunne jeg godt tænke mit at spille en lille midifil mens den kører - ikke noget fancy

jeg har søgt lidt rundt om kring - men ik ringtig fundet noget jeg kunne bruge (læs: forstå)



nogen der kunne hjælpe mig på vej?

har kigget lidt på #include <windows.h>
#include <stdio.h>

http://www.eksperten.dk/spm/388046

og på
http://www.codeproject.com/audio/mididemocp.asp

--> Another Midi Player using the MMSystem Interface
In the MSDN you find a sample code which also plays Midi files without DirectX. (search for "MidiPlyr") It uses the midiOutxxx() and midiStreamxxx() Interface of WinMM.Dll (This interface is also used by WinAmp). The bugs in Windows 2000 and XP described above do not affect MidiPlyr. It works perfectly on all platforms. But this sample code is EXTREMELY complex. (and written in pure C)

men jeg kan ikk se hvordan jeg dog skla indplementerer det (super simpel kode?)
Avatar billede soreno Praktikant
16. april 2004 - 08:23 #1
Eksempel der virker:

#include <windows.h>
#include <mmsystem.h>
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
    cout << "playing midi file..." << endl;

    // The following will open the sequencer with the test1.mid file. test1 is the device_id.
    mciSendString("open test1.mid type sequencer alias test1", NULL, 0, NULL);

    // Play test1
    mciSendString("play test1", NULL, 0, NULL);
   
    getch();

    // Close test1.mid file and sequencer device
    mciSendString("close test1", NULL, 0, NULL);

    return 0;
}

For at kompilere og linke skal du huske at linke med libwinmm.a, hvis du bruger MinGW (eller Dev-Cpp).
Eksempel:
g++ -c "main.cpp" -s
g++ -o "main.exe" "main.o" -lwinmm
Avatar billede soreno Praktikant
16. april 2004 - 08:26 #2
Det var C du efterlyste..
Beklager, men min koder er c++.

Jeg til at ud af døren, så mon ikke der er en anden der kan konveretere det til C hvis du får problemer.. :-)
Avatar billede soreno Praktikant
16. april 2004 - 18:43 #3
Her kan du finde kommandoer du kan sende til mci:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_mci_command_strings.asp

Og en C version:
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#include <conio.h>

int main()
{
    // The following will open the sequencer with the test1.mid file. test1 is the device_id.
    mciSendString("open test1.mid type sequencer alias test1", NULL, 0, NULL);
   
    // Play test1
    mciSendString("play test1", NULL, 0, NULL);

    getch();

    // Close test1.mid file and sequencer device
    mciSendString("close test1", NULL, 0, NULL);

    return 0;
}

gcc -c "main.c" -s
gcc -o "main.exe" "main.o" -s -lwinmm
Avatar billede minau Nybegynder
17. april 2004 - 17:37 #4
Hæ hæ - dejligt - jeg vidste at det ikke skulle være så svært

men - hmmm. Jeg bruger Microsoft visual Cpp - hvordan skla jeg linke med libwinmm.a?
Avatar billede soreno Praktikant
17. april 2004 - 19:48 #5
Et eller andet sted i project settings skal du tilføje noget der ligner winmm.lib.
Kig i dit \lib directory og vælg det lib der passer bedste med "Windows Multi Media".
Avatar billede kurtspurt Nybegynder
19. april 2004 - 23:27 #6
Yep - hæhæ - fik Libery ind.

Men der sker absolut ikk noget!

koden jeg skrive er

#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#include <conio.h>

int main()
{
    // The following will open the sequencer with the test1.mid file. test1 is the device_id.
    mciSendString("test1.mid type sequencer alias test1", NULL, 0, NULL);
    printf("skrive noget");
    // Play test1
    mciSendString("test1.mid", NULL, 0, NULL);

    getch();

    // Close test1.mid file and sequencer device
    mciSendString("close test1.mid", NULL, 0, NULL);

    return 0;
}

og der ligger en midifil der hedder test1.mid i mappen - hvad gør jeg galt?
Avatar billede soreno Praktikant
20. april 2004 - 06:17 #7
Hvis du bruger MSVC++ så er det noget med at den laver et directory til din executable.
F.eks. \release\test.exe eller \debug\test.exe

Prøv at kopiere test1.mid ind i det relevante directory og kør exe filen derfra.
Avatar billede kurtspurt Nybegynder
20. april 2004 - 12:12 #8
Det eneste der sker er at den skriver "skriv noget" - for jeg troede at den med  mciSendString("test1.mid type sequencer alias test1", NULL, 0, NULL);
ville skrive noget - så det var bare for at blive sikker på at den overhoved udfører noget.

suk :-(

du har vel ikk et link til hvor du har fundet det?
Avatar billede kurtspurt Nybegynder
20. april 2004 - 12:27 #9
(forige kommentar startermed: Har prøvet alle directoryes den kan - selv eksagt sti.
)
Avatar billede soreno Praktikant
20. april 2004 - 17:04 #10
mciSendString("test1.mid", NULL, 0, NULL);

Skal rettes til:
mciSendString("test1", NULL, 0, NULL);

fordi der i den første mciSendString skrives "alias test1".
Avatar billede kurtspurt Nybegynder
23. april 2004 - 14:38 #11
Øv - det virker overhoved ikk - lukker hvis der ikk komer nye foreslag
Avatar billede kurtspurt Nybegynder
26. april 2004 - 12:31 #12
kan ik få det til at virke overhoved. Lukker.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester