Frage von aringa12345, 84

Wie setze ich ein Console.Beep();-Soundboard in C# um (Konsolenanwendung)?

Hi Leute,

ich wollte ein C# Soundboard erstellen. Wie setze ich das um, wenn eine bestimmte Taste gedrückt wird (z.B. "L"), dass Console.Beep(); (--> z.B. Console.Beep(154, 25);) abgespielt wird? Ich hatte die Idee es mit "if" umzusetzen, evtl auch mit "String Eingabe = ConvertToInt32..."

Also so:

string stringEingabe = ConvertToInt32(Console.ReadLine());
if String eingabe = L
{
    Console.Beep(15, 458);
}

else
{
    //evtl. eine Schleife die zum Anfang springt?
}

uns so weiter, das halt für jeden Buchstaben/jede Zahl (bei Zahlen halt "int" statt "String")

Es soll dann für verschiedene Buchstaben verschiedene Console.Beep verwendet werden z.B. A = Console.Beep(784, 150); B = Console.Beep(452, 52); ........

Hat jmd eine Idee wie ich es umsetzen könnte(Console, nicht Windows Forms), bin noch neu in C#

Ist der Ansatz von mir richtig?

Und bitte entschuldigt wenn ich schwerwiegende Fehler gemacht habe, bin wie gesagt noch am Anfang. :))

Danke im vorraus :))

@Support: Das ist KEIN Arbeitsauftrag dass mir jmd etwas programmieren soll, ich will mir nur Rat holen wie ich es umsetzen könnte, bitte also nicht löschen. ;)

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von SteBruBra, 26

So in etwa geht es mit einer Swicht / Case (wie gesagt, nicht getestet)

string stringEingabe = Console.ReadLine();

switch(stringEingabe) {

case "L":

Console.Beep(15, 458);

break;

case "A":

Console.Beep(784, 150);

break;

case "B":

Console.Beep(452, 52);

break;

default:

Console.WriteLine("Andere Taste versuchen");

break;

}

Kommentar von KnorxyThieus ,

Also ich finde den Ansatz über das Dictionary ästhetischer :)

Antwort
von CrystalixXx, 30

Der Ansatz von SteBruBra mit dem switch-case ist zu bevorzugen.

Eine andere Idee wäre ein mathematischer Ansatz. Das geht allerdings nur, wenn die Frequenz des Tons und die Dauer einer bestimmten Funktion folgen soll. Um einen mathematisch Input für deine Funktion entsprechend des Buchstabens zu erzeugen könntest du den Ascii-Wert des Buchstabens nutzen.

PS: Wie kannst du Console.Beep mit einer Frequenz von 15 aufrufen? Das Minimum liegt bei 37. *g*

Antwort
von KnorxyThieus, 13

Hallo,

Es geht sogar noch schöner:

// Dies kommt in die Klasse als statisches Member:
static Dictionary<string, Tuple<int, int>> sounds
   = new Dictionary<string, Tuple<int, int>>
{
   { "A", Tuple.Create(784, 150) },
   { "B", Tuple.Create(452, 52) },
   { "L", Tuple.Create(150 /*Weil 15 hier kein gültiger Wert ist*/, 458) }
};


// Hier der Main-Code:
string input = Console.ReadLine();

try
{ var soundKey = sounds.First( _soundKey => input.Equals(_soundKey.Key, StringComparison.CurrentCultureIgnoreCase));
var sound = soundKey.Value;
Console.Beep(sound.Item1, sound.Item2);
}
catch (ArgumentNullException)
{
Console.WriteLine("Unbekannter Ton!");
}

Zur Erklärung: Im Dictionary oben - das ist eine Art zweispaltige Tabelle, in der jeder Eintrag aus der ersten Spalte, der Schlüssel oder Key, einmalig sein muss - sind jeweils ein String und die zugehörigen Infos zum Ton angegeben. Diese Infos habe ich in einem Tupel abgelegt, das ist so ein Datenset, das immer in diesem Fall genau zwei Integer aufnimmt, die hier für Länge und die Frequenz des Beeps stehen.

Im Main-Code wird die erste übereinstimmende Zeile (Wertepaar) in diesem Dictionary gesucht und der Variable soundKey zugewiesen, was ich mit der Linq.First-Methode realisiert habe: Diese prüft für jedes Wertepaar, ob dessen Schlüssel (der String) mit der Eingabe input übereinstimmt - und dies unter Vernachlässigung der Groß- und Kleinschreibung. Das Tupel für den Sound wird dann der Variable sound zugewiesen.
Anmerkung: Wenn du die Schreibweise beachten willst, kannst du sound auch einfach über den Accessor zuweisen: sounds[input].
Danach werden einfach nur noch die Daten aus dem Sound-Tupel ausgelesen und an Console.Beep übergeben.
Sollte ein entsprechender Key nicht gefunden worden sein, so stellt dies im Folgenden die catch-Anweisung fest und gibt eine Fehlermeldung aus.

Das ist auf jeden Fall ein besserer Stil als ein reiner switch-Block, bei dem man schnell den Überblick verliert und die Vorteile der Codewiederverwendbarkeit mitnichten ausschöpft, falls du das Programm irgendwann noch erweitern möchtest.

Ich hoffe, ich konnte dir helfen - wenn Unklarheiten bestehen, frag gern noch mal nach :)

Mit freundlichen Grüßen,
KnorxThieus (♂)

Antwort
von SteBruBra, 23

Ich versuche es mal schnell, ohne es zu kontrollieren:

string stringEingabe = Console.ReadLine();

if (stringEingabe == "L") Console.Beep(15, 458);
else {
}

Kommentar von KnorxyThieus ,

Wenn else wirklich nichts passieren kann, dann kannst du dort auch ein Semikolon setzen ...?

Antwort
von triopasi, 31
string stringEingabe = ConvertToInt32(Console.ReadLine());
if String eingabe = L

Was zur Hölle machst du da? Console.ReadLine() gibt eineinString zurück, den du dann in ein int konvertiertst um ihn in nem String zu speichern????

Un dann überprüfst du, ob der String eingabe (den du da anlegst) den Wert L (nicht den String "L"!!!!) erhält (erhält NICHT enthält)???? 

Les bitte nochmal nach, wie IFs funktionieren und was Datentypen sind!

Keine passende Antwort gefunden?

Fragen Sie die Community