2016-04-27 12 views
0

Ich bin eine kleine Musikanwendung writting und ich spiele jeden 88 Tasten auf diese Weise:Logical LOOP in Visual C#

if (nutka == "A0" && msg.Velocity < 28) 
{ 
    PlayEngine.Instance.PlaySound("-12dB_01"); 
} 
else if (nutka == "A0" && msg.Velocity < 55 && msg.Velocity > 27) 
{ 
    PlayEngine.Instance.PlaySound("-9dB_01"); 
} 
else if (nutka == "A0" && msg.Velocity < 82 && msg.Velocity > 54) 
{ 
    PlayEngine.Instance.PlaySound("-6dB_01"); 
} 
else if (nutka == "A0" && msg.Velocity < 106 && msg.Velocity > 81) 
{ 
    PlayEngine.Instance.PlaySound("-3dB_01"); 
} 
else if (nutka == "A0" && msg.Velocity < 128 && msg.Velocity > 105) 
{ 
    PlayEngine.Instance.PlaySound("0dB_01"); 
} 

Wie Sie sehen können, ich habe 5 Geschwindigkeitsbereiche für einen Schlüssel für Signale von meiner externen MIDI Regler. Und ich habe ähnliche 88 wenn Statements, die einzige Thins ist ändern: Name von "Nutka" und die letzte Ziffer im Namen der Wiedergabe von Datei

(zum Beispiel können wir hier eine Note "A0" durch die Verwendung von spielen 5 Dateien hängen von der Geschwindigkeit ab: -12dB_01, -9dB_01, -6dB_01, -3dB_01 und 0dB_01, und das sieht wirklich schlecht im Code für 88 Noten aus ...

Keine Ahnung, wie man kürzere Version oder vielleicht kurze Schleife machen kann .. jede Hilfe ist apprreciated.

+0

Eine Liste und einige Lamdas werden dein Freund hier sein! – Sean

+0

Und was, wenn 'Nutka == "A1" 'oder' Nutka == "B4" '? Können Sie * die letzte Zeichenfolge berechnen? –

Antwort

2

Vielleicht können Sie concatinate die Zeichenkette:

var keys = new Dictionary<string, string>(); 

// fill dictionary with relations: A0 -> 01 
keys.Add("A0", "01"); 

var key = keys[nutka]; 

int velocity; 
if (msg.Velocity < 28) 
    velocity = -12 
else if (msg.Velocity < 55) 
    velocity = -9 
else if (msg.Velocity < 82) 
    velocity = -6 
else if (msg.Velocity < 106) 
    velocity = -3 
else 
    velocity = 0; 

string tune = String.Format("{0}dB_{1}", velocity, key); 
PlayEngine.Instance.PlaySound(tune); 

Das Ausfüllen des Wörterbuchs kann einmalig erfolgen.

+0

scher: danke, ich werde es testen! :) – Martin

+0

Danke! Es funktioniert perfekt! Du bist ein Held! :))) – Martin

2

Sie Sinnvoll wäre dies eine Liste der Elemente durch, die Ihre Funktionalität beschreiben.

Zum Beispiel gegeben einfacher

Klasse
public class SoundInfo 
{ 
    public string Nutka{get;set;} 
    public int MinVelocity {get;set;} 
    public int MaxVelocity {get;set;} 
    public string SoundFile{get;set;} 
} 

Sie speichern sie in einem List<SoundInfo>

public List<SoundInfo> sounds 
    = new List<SoundInfo>() 
{ 
    new SoundInfo { Nutka = "A0", MinVelocity = 0, MaxVelocity = 28, SoundFile="-12dB_01" }, 
    new SoundInfo { Nutka = "A0", MinVelocity = 28, MaxVelocity = 55 SoundFile="-6dB_01" }, 
    new SoundInfo { Nutka = "A0", MinVelocity = 55, MaxVelocity = 82, SoundFile="-3dB_01" }, 

}; 

könnten Sie dann einfach den richtigen Datensatz nachschlagen basierend auf den Werten von nutka und msg.Velocity:

var item = sounds.SingleOrDefault(s => s.Nutka == nutka 
       && msg.Velocity < s.MaxVelocity && msg.Velocity >= s.MinVelocity); 
if(item == null) 
    throw new Exception ("No sound found!!"); 
PlayEngine.Instance.PlaySound(item.SoundFile); 
+0

Danke Jamiec, es sieht nach dem besten Weg aus, damit es funktioniert und "kürzer" aussieht :) Muhammad Zeeshan - so muss ich noch einmal 87 Statements für jede Note A0, A1, B0, B1 machen .... ... – Martin