首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.Beep等效

System.Beep等效
EN

Stack Overflow用户
提问于 2015-11-18 06:19:46
回答 1查看 2.3K关注 0票数 3

有用不同音调在扬声器中发声的课程吗?System.Beep()是原始的,我不能双倍地发送那里的频率。

我想,比方说,播放一个声音或B#声音。我希望函数调用是这样的:

代码语言:javascript
复制
double d = 425,545;
int duration = 500;
int volume = 0.8;
f(d, duration, volume)
f(ToneClass.A, duration, volume)//or like this
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-18 06:25:55

频率的整数部分就足够了。你的耳朵甚至不会注意小数部分。

代码语言:javascript
复制
int frq = 425;
int duration = 500;

Console.Beep(frq, duration);

你可以从这里看到钢琴的关键频率。frequencies

一些笔记。

使用枚举而不是ints。还可以使用Task.Delay(duration).Wait();作为rest。(休息是指静默音符)

您可以使用一些公式来计算钢琴键,然后计算键的频率,而不是使用大枚举或大量硬编码的ints。此外,你也应该考虑笔记长度。你可以在这里看到他们,value

这是埃德沃德·格里格的“山王”一片。

代码语言:javascript
复制
static int GetPianoKey(string note)
{
    int key = -1;
    switch (note[0])
    {
        case 'A': key = 1; break;
        case 'B': key = 3; break;
        case 'C': key = 4; break;
        case 'D': key = 6; break;
        case 'E': key = 8; break;
        case 'F': key = 9; break;
        case 'G': key = 11; break;
    }
    if (note.Length == 2)
    {
        return key + 12*(note[1] - '0');
    }
    if (note.Length == 3)
    {
        return key + 12*(note[2] - '0') + (note[1] == 'b' ? -1 : 1);
    }
    throw new ApplicationException("Wrong note.");
}

static int GetNoteFrequency(string note)
{
    return (int) (Math.Pow(1.05946309436, GetPianoKey(note) - 49)*440);
}

static int GetTickDuration(int tempo)
{
    return 60000/tempo;
}

private static void Main(string[] args)
{
    int duration = GetTickDuration(120); // 120 bpm. duration for quarter note

    for (int i = 0; i < 2; i++)
    {
        Console.Beep(GetNoteFrequency("A3"), duration / 2); // eighth note ==> duration/2
        Console.Beep(GetNoteFrequency("B3"), duration / 2);
        Console.Beep(GetNoteFrequency("C3"), duration / 2);
        Console.Beep(GetNoteFrequency("D3"), duration / 2);

        Console.Beep(GetNoteFrequency("E3"), duration / 2);
        Console.Beep(GetNoteFrequency("C3"), duration / 2);
        Console.Beep(GetNoteFrequency("E3"), duration / 2);
        Task.Delay(duration/2).Wait(); //  eighth rest ==> duration/2

        Console.Beep(GetNoteFrequency("D#3"), duration / 2);
        Console.Beep(GetNoteFrequency("B3"), duration / 2);
        Console.Beep(GetNoteFrequency("D#3"), duration / 2);
        Task.Delay(duration / 2).Wait();

        Console.Beep(GetNoteFrequency("D3"), duration / 2);
        Console.Beep(GetNoteFrequency("Bb3"), duration / 2);
        Console.Beep(GetNoteFrequency("D3"), duration / 2);
        Task.Delay(duration / 2).Wait();

        Console.Beep(GetNoteFrequency("A3"), duration / 2);
        Console.Beep(GetNoteFrequency("B3"), duration / 2);
        Console.Beep(GetNoteFrequency("C3"), duration / 2);
        Console.Beep(GetNoteFrequency("D3"), duration / 2);

        Console.Beep(GetNoteFrequency("E3"), duration / 2);
        Console.Beep(GetNoteFrequency("C3"), duration / 2);
        Console.Beep(GetNoteFrequency("E3"), duration / 2);
        Console.Beep(GetNoteFrequency("A4"), duration / 2);

        Console.Beep(GetNoteFrequency("G3"), duration / 2);
        Console.Beep(GetNoteFrequency("E3"), duration / 2);
        Console.Beep(GetNoteFrequency("C3"), duration / 2);
        Console.Beep(GetNoteFrequency("E3"), duration / 2);

        Console.Beep(GetNoteFrequency("G3"), duration * 2); // half note ==> duration*2
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33773075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档