Tabelle Erstellen

can

Mitglied
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
 
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:
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?
 
Zuletzt bearbeitet:
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 :(
 
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 :(
 
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?
 
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
 
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.
 
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
 
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.
 
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?
 

Neue Beiträge

Zurück