让C在我的扬声器上播放不同的频率

时间:2015-01-10 06:03:29

标签: c

在学校,我们正在使用一些乐高头脑风暴机器人及其各自的程序RobotC来编写我们选择的歌曲。经过长时间的努力,我决定将它带回家工作,唯一的问题是我家里没有Lego Mindstorm,因此我不可能听完成品。所以我意识到我必须编写一个新程序,并从那里运行它,所以我的问题是,是否有可能用C语言编写的程序在我的扬声器上播放不同的频率?如果是的话,请你提供一些例子,因为我不知道。

float fNote = 107,      // Whole Note
hNote = fNote/2,        // Half Note
qNote = hNote/2,        // Quarter Note
eNote = qNote/2,        // Eighth Note
sNote = eNote/2,        // Sixteenth Note
tNote = sNote/2,        // Thirtysecond Note
xtNote = tNote/2,       // Sixtyfourth Note

float FLow = 349,   // Note: Low F
A = 440,            // Note: A
B = 466,            // Note: B
EHigh = 659,        // Note: High E
DHigh = 587,        // Note: High D
GLow= 392,          // Note: Low G
ELow = 330,         // Note: Low E
Rest = 0,           // Note: Rest
C = 523,            // Note: C
DLow = 294,         // Note: Low D
FHigh = 698,        // Note: High F
GHigh = 783,        // Note: High G

task main()
{
//start 1
playTone(FLow,eNote);       // Frequency: 349
wait10Msec(eNote+xtNote);
playTone(A,eNote);          // Frequency: 440
wait10Msec(eNote+xtNote);
playTone(B,qNote);          // Frequency: 466
wait10Msec(qNote+xtNote);
}

我心灵风暴计划中的一些示例代码

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

有一个名为NAudio的.NET软件包可以让你在PC上合成音调。您必须使用C#或Visual Basic或C ++ / CLR编写。

这是一个介绍。 http://msdn.microsoft.com/en-us/magazine/ee309883.aspx

答案 2 :(得分:1)

这有点复杂,但我建议使用GStreamer完成此任务。要播放单个频率,您可以使用以下示例代码:

static void play_sound (gdouble frequency) {
    GstElement *source, *sink;
    GstElement *pipeline;

    pipeline = gst_pipeline_new ("note");
    source   = gst_element_factory_make ("audiotestsrc", "source");
    sink     = gst_element_factory_make ("autoaudiosink", "output");

    /* set frequency */
    g_object_set (source, "freq", frequency, NULL);

    gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);
    gst_element_link (source, sink);

    gst_element_set_state (pipeline, GST_STATE_PLAYING);

    /* stop it after 500ms */
    g_timeout_add (LENGTH, (GSourceFunc) pipeline_stop, pipeline);
}

audiotestsrc是音调生成器,autoaudiosink是系统的默认声音设备。此代码是Guitar Tuner example application的一部分。顺便说一下,完整的source code就在这里。

可以从here安装当前版本的GStreamer(适用于Windows)。我建议使用Code::Blocks进行开发,因为您可以使用预先捆绑的MinGW编译器下载它,这是GLib和GStreamer必需的AFAIK。