Laden...

Console.Beep zur Ausgabe von Morsecode

Letzter Beitrag vor 5 Monaten 4 Posts 512 Views
Console.Beep zur Ausgabe von Morsecode

Hallo Alle.

ich wollte ein kleines Programm schreiben, bei dem man einen Text eingeben kann und der Text dann als Morsecode ausgegeben wird.

Zur Tonausgabe wollte ich den Befehl

Console.Beep (Frequenz, Dauer)

verwenden.

(Hinweis: der Programmcode soll nur mein Problem verdeutlichen und entspricht nicht dem eigentlichen Programm)

Ein Dit (kurz) soll dabei 100 ms dauern und ein Dah (lang) die 3-fache Dauer des Dit haben.

Die Pause zwischen zwei Beeps soll einem Dit entsprechen.

Dabei ist mir jetzt aufgefallen, dass bei Console.Beep (600, 100) die Beeplänge 50 ms beträgt.Die Pause zwischen zwei Dits beträgt ebenfalls 50 ms.

Nach Definition müsste die Beeplänge aber 100 ms betragen. Das wäre jetzt durch verdoppeln des Wertes lösbar.

Aber bei einem Console.Beep (600, 300) beträgt Länge des Beeps 150 ms und die Pause zwischen zwei Zeichen ebenfalls 150 ms.

Die Pause zwischen zwei Beeps muss aber konstant bleiben.

So wie ich das sehe setzt sich der zweite Wert Dauer bei Console.Beep(Frequenz, Dauer) aus der Länge des Beeps und der anschließenden Pause zusammen.

Sinnigerweise gilt dies für alle Werte bis 999. Ab 1000 gibt es zwischen zwei Beeps keine nennenswerte Pause und die Tondauer entspricht dem eingegebenen Wert.

Ich hoffe ich habe das Problem verständlich erklären können. Anbei noch ein Bild eines SOS-Signals welches meine Fehlerbeschreibung erläutert.

Gibt es dafür eine Lösung?

Schon mal Danke für Eure Bemühungen.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace Beep_Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void CmdEnde_Click(object sender, EventArgs e)
        {
            Close();
        }
        private void CmdStart_Click(object sender, EventArgs e)
        {
            Console.Beep(600, 100); // Länge 50 ms
            Console.Beep(600, 100);
            Console.Beep(600, 100);
            Console.Beep(600, 300); // Länge 150 ms
            Console.Beep(600, 300); 
            Console.Beep(600, 300);
            Console.Beep(600, 100); // Länge 50 ms         
            Console.Beep(600, 100);
            Console.Beep(600, 100);
        }
    }
}

Die Antwort findest du auf stackoverflow.com.

TL;DR

Is so, liegt aber an Windows selber, dann dotnet leitet das nur an die Window Api weiter und das kommt dabei heraus.

BTW

Es wäre schön, wenn du Code in die entsprechenden Code-Tags packst, dann würde dein Code z.B. so aussehen (hübsch, gell?)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace Beep_Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void CmdEnde_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void CmdStart_Click(object sender, EventArgs e)
        {
            Console.Beep(600, 100); // Länge 50 ms
            Console.Beep(600, 100);
            Console.Beep(600, 100);
            Console.Beep(600, 300); // Länge 150 ms
            Console.Beep(600, 300);
            Console.Beep(600, 300);
            Console.Beep(600, 100); // Länge 50 ms
            Console.Beep(600, 100);
            Console.Beep(600, 100);
        }
    }
}

Hat die Blume einen Knick, war der Schmetterling zu dick.

Hallo BlonderHans,

vielen Dank für Deine Antwort. Dann muss ich wohl einen anderen Weg wählen.

Das mit dem Code-Tag hatte ich übersehen (war mein erster Beitrag hier - sorry dafür).

Mit freundlichen Grüßen

Du kannst es mit SoundPlayer versuchen.

Der spielt z.B. eine WAV-Datei ab die du beliebig starten und anhalten kannst.

private readonly SoundPlayer _sound = new SoundPlayer("<Pfad zu einer WAV-Datei>");
const int DIT_LENGTH = 100;
const int DAH_LENGHT = DIT_LENGTH * 3;
const int SYMBOL_LENGTH = DIT_LENGTH;
const int CHAR_LENGth = DIT_LENGTH * 3;
const int WORD_LENGTH = DIT_LENGTH * 7;

public async Task SOS()
{
    // S
    await Dit();
    await SymbolGap();
    await Dit();
    await SymbolGap();
    await Dit();
    
    await CharGap();

    // O
    await Dah();
    await SymbolGap();
    await Dah();
    await SymbolGap();
    await Dah();
    
    await CharGap();

    // S
    await Dit();
    await SymbolGap();
    await Dit();
    await SymbolGap();
    await Dit();
}

public async Task Dit()
{
    _sound.Play();
    await Task.Delay(DIT_LENGTH);
    _sound.Play();
}

public async Task Dah()
{
    _sound.Play();
    await Task.Delay(DAH_LENGTH);
    _sound.Play();
}

public Task SymbolGap() => Task.Delay(SYMBOL_LENGTH);
public Task CharGap() => Task.Delay(CHAR_LENGTH);
public Task WordGap() => Task.Delay(WORD_LENGTH);

Hat die Blume einen Knick, war der Schmetterling zu dick.