Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Noten als enum auslegen (https://www.delphipraxis.net/196026-noten-als-enum-auslegen.html)

EWeiss 16. Apr 2018 16:32

Noten als enum auslegen
 
Ich erstelle ein Enum um die Noten zu transponieren.

Delphi-Quellcode:
 TTranspose = (C = 1, C# = 2, D = 3, D# = 4, E = 5, F = 6, F# = 7, G = 8, G# = 9, A = 10, A# = 11, B = 12);


Jetzt meldet der Compiler C wäre redifiniert.
Wie wäre es richtig?

Ich brauche die Bezeichnungen als String im Enum.
Oder kann man dies später zu einem Array assigned?

gruss

Neutral General 16. Apr 2018 16:34

AW: Noten als enum auslegen
 
Du kannst "#" nicht in Bezeichnern verwenden.

EWeiss 16. Apr 2018 16:37

AW: Noten als enum auslegen
 
Zitat:

Zitat von Neutral General (Beitrag 1399402)
Du kannst "#" nicht in Bezeichnern verwenden.

Ja das habe ich mir gedacht deshalb der Fehler.
Nur wie könnte man es anders besser machen?

Ich brauche die Halbtöne.

gruss

Zacherl 16. Apr 2018 16:38

AW: Noten als enum auslegen
 
Naja, einfach anders benennen halt :-D
Delphi-Quellcode:
C_HALF/C_MAJOR
oder so.

EWeiss 16. Apr 2018 16:42

AW: Noten als enum auslegen
 
Zitat:

Zitat von Zacherl (Beitrag 1399406)
Naja, einfach anders benennen halt :-D
Delphi-Quellcode:
C_HALF/C_MAJOR
oder so.

Delphi-Quellcode:
function TransposeChord(sChord: string; Pitch: Integer): string;
var
  sResult: string;
  sTranspose: Array[1..12] of TTranspose;
  K, MaxK, Found: Integer;
begin

  sResult := sChord;
  MaxK := High(sTranspose);

  for K := 1 to MaxK do
  begin
    if sTranspose[K] = sChord then
    begin
      Found := (K + Pitch) mod MaxK;
      if Found < 1 then
        inc(Found, MaxK);

      sResult := sTranspose[Found];
      break;
    end;
    Result := sResult;
  end;
end;
Nun einfach?
Umbenennen ist nicht möglich wie gesagt ich brauche den String 'C#'

gruss

JasonDX 16. Apr 2018 16:44

AW: Noten als enum auslegen
 
Eine separate Methode zum Konvertieren zwischen Enum und String wäre dann sinnvoll.

EWeiss 16. Apr 2018 16:47

AW: Noten als enum auslegen
 
Zitat:

Zitat von JasonDX (Beitrag 1399409)
Eine separate Methode zum Konvertieren zwischen Enum und String wäre dann sinnvoll.

Dann mache ich es so..
Delphi-Quellcode:
const
cTranspose : Array[TTranspose ] of String = ('C, 'C#, 'D, 'D#');
und benenne das enum um.
Danke.

gruss

EWeiss 16. Apr 2018 17:11

AW: Noten als enum auslegen
 
Sorry bin wieder blöd heute.

Delphi-Quellcode:
type
  TTranspose = (C, C_, D, D_, E, F, F_, G, G_, A, A_, B);

const
  cTranspose : Array[TTranspose] of String = ('C', 'C#', 'D', 'D#', 'E', 'F', 'F#',
    'G', 'G#', 'A', 'A#', 'B');
Delphi-Quellcode:
function TransposeChord(sChord: string; Pitch: Integer): string;
var
  sResult: string;
  sTranspose: Array[0..11] of TTranspose; // scheint ein Problem mit dieser Definition zu sein. aber brauche ein Array wenn auch vielleicht nicht dieses
  K, MaxK, Found: Integer;
begin

  sResult := sChord;
  MaxK := High(sTranspose);

  for K := 0 to MaxK do
  begin
    if cTranspose[sTranspose[K]] = sChord then
    begin
      Found := (K + Pitch) mod MaxK;
      if Found < 1 then
        inc(Found, MaxK);

      sResult := cTranspose[sTranspose[Found]];
      break;
    end;
    Result := sResult;
  end;
end;
kann mir bitte jemand auf die Sprünge helfen ?

gruss

himitsu 16. Apr 2018 17:12

AW: Noten als enum auslegen
 
# gibt es so ähnlich auch als andere Unicodezeichen ... wenn dieses andere Zeichen vom Compiler als "gültiges" alphanumerisches Zeichen anerkannt ist, dann könnte man auch das nehmen.
Aber ohne Codevervollständigung oder Copy&Paste sind solche Namen dann schwer zu schreiben, so als würdest du ohne IME versuchen chinesische Typenbezeichner zu verwenden.

EWeiss 16. Apr 2018 17:14

AW: Noten als enum auslegen
 
Zitat:

Zitat von himitsu (Beitrag 1399415)
# gibt es so ähnlich auch als andere Unicodezeichen ... wenn dieses andere Zeichen vom Compiler als "gültiges" alphanumerisches Zeichen anerkannt ist, dann könnte man auch das nehmen.
Aber ohne Codevervollständigung oder Copy&Paste sind solche Namen dann schwer zu schreiben, so als würdest du ohne IME versuchen chinesische Typenbezeichner zu verwenden.

Bekomme hier außerhalb des gültigen Bereich.
Delphi-Quellcode:
if cTranspose[sTranspose[K]] = sChord then


Ich erzeuge hier 12 x mal TTranspose
Delphi-Quellcode:
sTranspose: Array[0..11] of TTranspose;


Obwohl ich nur den Wert innerhalb eines einmalig erstellen TTranspose benötige.
Das scheint mein Fehler zu sein. (Array ist eigentlich überflüssig) Hmmm...
Aber ohne kann ich K nicht auswerten.

Heute ist ein schlechter Tag.. Hehehehehehe

EDIT:
Ok hat sich erledigt.
Delphi-Quellcode:
function TransposeChord(sChord: string; Pitch: Integer): string;
var
  sResult: string;
  K, MaxK, Found: Integer;
begin

  sResult := sChord;
  MaxK := 12;

  for K := 0 to (MaxK - 1) do
  begin
    if cTranspose[TTranspose(K)] = sChord then
    begin
      Found := (K + Pitch) mod MaxK;
      if Found < 1 then
        inc(Found, MaxK);

      sResult := cTranspose[TTranspose(Found)];
      break;
    end;
    Result := sResult;
  end;
end;
gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:17 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz