tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
1066
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    can can ist offline Mitglied Bronze
    Registriert seit
    Nov 2003
    Ort
    Frankfurt/M
    Beiträge
    37
    Hallo Leute

    Bin Anfänger
    ich möchte eine Akkorderkennung programmiren.
    nach diese Tabelle:



    //////////////////////////////////////////////////////////////////////////////
    Sus2 Moll DUR Sus4 7
    Grundton Sekunde Terz Quarte Quinte Sexte Septe
    1 B2 2 B3 3 4 B5 5 B6

    6 7 Ç7


    C Cis D Dis E F Fis G Gis A B H
    Cis D Dis E F Fis G Gis A B H C
    D Dis E F Fis G Gis A B H C Cis
    Dis E F Fis G Gis A B H C Cis D
    E F Fis G Gis A B H C Cis D Dis
    F Fis G Gis A B H C Cis D Dis E
    Fis G Gis A B H C Cis D Dis E F
    G Gis A B H C Cis D Dis E F Fis
    Gis A B H C Cis D Dis E F Fis G
    A B H C Cis D Dis E F Fis G Gis
    B H C Cis D Dis E F Fis G Gis A
    H C Cis D Dis E F Fis G Gis A B


    Bei spiel zu Grundton

    "Grundton"--"B2"---"sus2"--"Moll"-"Dur"-"sus4"--"B5"-"Quinte"-" B6"-"sexte"--"septe" "7"
    ------C----------Cis-------D-------Dis-----E------F--------Fis-----G--------Gis-----A----------B-------H


    Grundton = Grundton + Quinte

    ////////////////////////////////////////////////////////////////////////////

    Wenn ich ein C-Dur Akkord greife(C,E,G) dann muss C-Dur angezeigt werden.

    ich habe alle noten auf null gesetzt

    int NoteAnAus[12]={0,0,0,0,0,0,0,0,0,0,0,0} ;
    wenn die Tasten am Keyboard für NoteAnAus[?] gedrückt wird dann ist
    NoteAnAus[?]= 1;// Gedrückt
    NoteAnAus[?]= 0;// Losgelassen

    Um erst den Grundton zu ermitten habe ich es so gemacht:
    //////////////////////////////////////////////////////////////
    if(NoteAnAus[0]==1 && NoteAnAus[7]==1) { m_sAkk=("C");}
    else if(NoteAnAus[1]==1 && NoteAnAus[8]==1){m_sAkk=("C#");}
    else if(NoteAnAus[2]==1 && NoteAnAus[9]==1){m_sAkk=("D");}
    else if(NoteAnAus[3]==1 && NoteAnAus[10]==1){m_sAkk=("D#");}
    else if(NoteAnAus[4]==1 && NoteAnAus[11]==1){m_sAkk=("E");}
    else if(NoteAnAus[5]==1 && NoteAnAus[0]==1){m_sAkk=("F");}
    else if(NoteAnAus[6]==1 && NoteAnAus[1]==1){m_sAkk=("F#");}
    else if(NoteAnAus[7]==1 && NoteAnAus[2]==1){m_sAkk=("G");}
    else if(NoteAnAus[8]==1 && NoteAnAus[3]==1){m_sAkk=("G#");}
    else if(NoteAnAus[9]==1 && NoteAnAus[4]==1){m_sAkk=("A");}
    else if(NoteAnAus[10]==1 && NoteAnAus[5]==1){m_sAkk=("A#");}
    else if(NoteAnAus[11]==1 && NoteAnAus[6]==1){m_sAkk=("H#");}

    /////////////////////////////////////////////////////////////////

    kann man es einfacher machen ?

    wenn ich den Grundton habe und jetz eine der Krakter note dazu gedrückt wird. Muss die Anzeige (Grundton + Karakterton) anzeigen

    Grundton = Grundton + Quinte
    Karakterton = Alles was zwichen (Grundton + Quinte) ist.


    Angenommen wenn C , G und E gedückt wird E=Dur
    oder Dis = moll
    oder D = sus2
    oder Cis = B2

    Also wie oben in der Tabelle.

    Wie kann ich so was am besten und einfachsten machen?

    Für Hilfe jetz schon mal Danke

    Grüße Can
     

  2. #2
    Avatar von Mr.Undertaker
    Mr.Undertaker Mr.Undertaker ist offline Mitglied Gold
    Registriert seit
    Dec 2001
    Ort
    Radolfzell am Bodensee
    Beiträge
    181
    Hallo!
    Ich weiß ja nicht ob dir das so besser gefällt, aber es ist zumindest ein bissel "kleiner". Im Prinzip macht es aber dasselbe, nur dass ich einen enum mit der Tonleiter gemacht habe.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    enum chromTon { C=0,Cis,D,Dis,E,F,Fis,G,Gis,A,B,H};
     
    int main()
    {
        bool NoteAnAus[12]={true,false,false,false,false,false,false,true,false,false,false,false} ;
        chromTon ctGrundton;
     
        for(int i=0;i<4;i++)
            if (NoteAnAus[i] && NoteAnAus[i+7]) ctGrundton = (chromTon)i;
        
        for(int i=0;i<6;i++)
            if (NoteAnAus[i+5] && NoteAnAus[i]) ctGrundton = (chromTon)i;
     
     
        std::cout<<"Grundton: "<<ctGrundton;
    }

    Am besten wäre es, wenn du für die Tonleiter eine eigene Klasse schreiben würdest, damit man einfacher mit den Tönen "rechnen" kann. Aber du sagtest ja du bist ein Anfänger und kennst OOP wahrscheinlich noch nicht, oder?
    Geändert von Mr.Undertaker (02.02.04 um 01:14 Uhr)
     
    Signatur hat Urlaub.

  3. #3
    can can ist offline Mitglied Bronze
    Registriert seit
    Nov 2003
    Ort
    Frankfurt/M
    Beiträge
    37
    Hallo Mr.Undertaker

    Danke für deine Antwort !

    Ich schreibe mein programm mit c++V6 eine Dialoganwendung
    Funktionen Methoden kann ich schreiben. Aber eine klasse habe ich noch nicht geschrieben.

    ich muss mir erst mal ausdenken wie ich ein Dur und Moll unterscheiden kann

    Angenommen ich drücke 3 Tasten für C-Dur

    C-Dur = C,E,G ich bekomme 3 zahlen werte

    C=0
    E=4
    G=7

    Wenn ich die zahlen nach größe ordner und vom kleinsten zahl
    zu nächsten zahl ist der Abstand 5 und zum nächsten eine 4
    5/4 = Dur Akkord

    Das geht gut bis F-Dur = F,A,C

    C=0
    F=5
    A=9

    Jetz ist der ab stand 6/5

    Es muss doch eine Formel oder methode geben so das ich Dur und Moll
    Erkennen kann.

    Ich rechne seit Tagen hin und her und komme zu keinem ergebnis
     

  4. #4
    can can ist offline Mitglied Bronze
    Registriert seit
    Nov 2003
    Ort
    Frankfurt/M
    Beiträge
    37
    Hallo Mr.Undertaker

    Danke für deine Antwort !

    Ich schreibe mein programm mit c++V6 eine Dialoganwendung
    Funktionen Methoden kann ich schreiben. Aber eine klasse habe ich noch nicht geschrieben.

    ich muss mir erst mal ausdenken wie ich ein Dur und Moll unterscheiden kann

    Angenommen ich drücke 3 Tasten für C-Dur

    C-Dur = C,E,G ich bekomme 3 zahlen werte

    C=0
    E=4
    G=7

    Wenn ich die zahlen nach größe ordner und vom kleinsten zahl
    zu nächsten zahl ist der Abstand 5 und zum nächsten eine 4
    5/4 = Dur Akkord

    Das geht gut bis F-Dur = F,A,C

    C=0
    F=5
    A=9

    Jetz ist der ab stand 6/5

    Es muss doch eine Formel oder methode geben so das ich Dur und Moll
    Erkennen kann.

    Ich rechne seit Tagen hin und her und komme zu keinem ergebnis
     

  5. #5
    Avatar von Mr.Undertaker
    Mr.Undertaker Mr.Undertaker ist offline Mitglied Gold
    Registriert seit
    Dec 2001
    Ort
    Radolfzell am Bodensee
    Beiträge
    181
    Durakkord ist doch immer Grundton + 3. Ton + 5. Ton + (8. Ton) oder?
    Also wenn du den Grundton hast, ist es kein problem ob Moll oder Dur!
    Seh ich doch richtig oder?
     
    Signatur hat Urlaub.

  6. #6
    can can ist offline Mitglied Bronze
    Registriert seit
    Nov 2003
    Ort
    Frankfurt/M
    Beiträge
    37
    Hallo Mr.Undertaker

    zitat: Durakkord ist doch immer Grundton

    Nein Grundton kann irgend eine Note sein der abstand zwichen den Tönen
    sagt ob es ein Dur Moll Oder Sep Akkord ist .


    Ich habe mein problem gelöst Dankee
     

  7. #7
    Sybaris Sybaris ist offline Mitglied
    Registriert seit
    Feb 2004
    Ort
    Freilassing (Bayern)
    Beiträge
    16
    Hi,

    als Hobby-Musiker verblüfft mich das nun doch etwas...

    Der Abstand zwischen Noten in einem Akkord ist IMMER GLEICH, egal was für ein Grundton genommen wird...

    Wenn ich folgende Reihe voraussetze:

    0 C
    1 C# (Cis nicht C-Sharp )
    2 D
    3 D#
    4 E
    5 F
    6 F#
    7 G
    8 G#
    9 A
    10 A#/Bb
    11 B

    Dann kann ich über diesen Weg JEDEN Akkord über seine relativen Bezüge definieren:

    Dur ist z.B. 0-4-7, also bei C dann C-E-G.
    Bei F wäre es F-A-C (C mit "Wrap-Around" also Modulo).

    Moll wäre 0-3-7; G-Moll also: G-Bb-D.

    Ich habe vor einigen Jahren eine Akkord-Erkennung schon mal geschrieben und es genau über diesen Weg gelöst. Wenn Du willst kann ich Dir einen Teil der Doku zukommen lassen, in dem so an die 40 Akkorde über dieses Muster beschrieben sind.

    G.
     

  8. #8
    can can ist offline Mitglied Bronze
    Registriert seit
    Nov 2003
    Ort
    Frankfurt/M
    Beiträge
    37
    Hallo Sybaris

    ich würde mich seher freuen wenn du mir dein code Mailen würdest.
    ich versuche das problen schon lange zu lösen ich bin musiker kein programmirer.

    Ich lerne C++ und versuche eine Begleitautomat zu programmiren!

    can28@freenet.de

    Grüße Can
     

  9. #9
    Sybaris Sybaris ist offline Mitglied
    Registriert seit
    Feb 2004
    Ort
    Freilassing (Bayern)
    Beiträge
    16
    Hi Can!

    Was ich programmiert hatte, war auch als "Begleitautomatik" gedacht...

    Du bist Musiker? Welches Instrument spielst Du denn? Ich bin nämlich Gitarrist und Sänger - wenn Du Lust hast, kannst Du ja mal auf meine Homepage schauen:
    Sybaris

    Den Sourcecode maile ich Dir morgen - den muss ich erst ausgraben...

    G.
     

  10. #10
    can can ist offline Mitglied Bronze
    Registriert seit
    Nov 2003
    Ort
    Frankfurt/M
    Beiträge
    37
    ich spiele keyboard und baue mir selber eine

    ich bin gespannt auf dein code ! was pasiert wenn du eine umgekerte Akkord greifst?

    nicht C,E,G sondern G,C,E kann dein code auch die umkehrungen erkennen?
     

Ähnliche Themen

  1. Antworten: 11
    Letzter Beitrag: 26.06.08, 19:49
  2. Tabelle erstellen.
    Von BillaBong im Forum HTML & XHTML
    Antworten: 5
    Letzter Beitrag: 05.04.06, 19:18
  3. Tabelle erstellen ned
    Von ICPUI im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 18.08.05, 16:35
  4. Tabelle mit PHP erstellen
    Von lp-chester im Forum PHP
    Antworten: 5
    Letzter Beitrag: 11.04.05, 16:29
  5. tabelle in db erstellen
    Von toboli im Forum PHP
    Antworten: 1
    Letzter Beitrag: 06.10.03, 19:38