从 R 驱动声卡

Posted

技术标签:

【中文标题】从 R 驱动声卡【英文标题】:Drive sound card from R 【发布时间】:2018-12-22 21:29:54 【问题描述】:

我正在进行一项实验,该实验利用声卡播放声音并从多声道声卡输出电信号。在 MatLab 中,我可以直接驱动每个通道,但我更喜欢使用 R。我已经能够制作多通道文件并命名通道,但我无法让它们正常播放。我已将声卡设置为默认值,并且当我在“声音”窗口的配置窗口中播放测试时,但是当我运行我的代码时它不会播放。该代码会打开 WMP 并播放一个文件,该文件的长度与我创建的信号的正确长度相符,但我没有从扬声器中听到声音,也无法测量来自我设置的其他通道的电信号。 Windows 7的 声卡:Lynx E44 R 3.4.4

library("seewave")
library("tuneR")
s1 <- 10*sin(2*pi*440*seq(0,1,length.out=8000))
s1_multi <- WaveMC(data = cbind(s1, s1, s1, s1),
               samp.rate=8000, 
               bit=16)
 colnames(s1_multi) <- c("FL", "FR", "FC", "LF")
setWavPlayer(shQuote("C:/Program Files (x86)/Windows Media Player/wmplayer.exe"))

listen(s1_multi)

我做错了什么?有没有办法直接从R驱动声卡的通道?


我在 seewave 开发人员留言板上发布了相同的问题,并被告知为什么我的确切代码不起作用(listen() for WaveMC 只播放第一个频道)。但我更大的问题是,是否有办法直接,或者是否必须通过第三方播放器。到目前为止,我已经尝试过 tuneR 和 seewave。

谢谢。

【问题讨论】:

以上代码适用于我(即我运行它并使用 Windows 媒体播放器播放声音)。 谢谢。我确实让那部分工作。我将正文留作上下文,但我希望有人对使用 R 直接控制声卡而无需初始化 windows 媒体播放器有所了解。 @jason 你的问题得到解答了吗? 我不认为是这样。我需要同时控制声卡的多个输出。我可以播放单声道,也可以创建多声道文件,但我还没有找到播放多个声道的方法(超过两个 - 我已经让立体声文件工作了)。 【参考方案1】:

你可以试试audio 包。

星球大战帝国进行曲与 R

让我们写下一些注意事项和持续时间:

p <- "A3 
      A3 A3 A3 F3 C3# A3 F3 C3# A3
      F4 F4 F4 F4# C3# G3 F3 C3# A3"

d <- c(2, 
       1, 1, 1, 0.75, 0.25, 1, 0.75, 0.25, 2,
       1, 1, 1, 0.75, 0.25, 1, 0.75, 0.25, 2)

制作音频波形数据帧:

w <- make_wave(pitch = p, duration = d, tempo = 120, sample_rate= 44100)

这里使用的是 Nick Kennedy's phantastic function 的略微改编版本。

...直接从控制台播放:

audio::play(w)


说明

您基本上需要的是一个包含频率和持续时间的表格。这也可以通过查找表来实现。一旦有了每个音符的频率和持续时间,您就可以使用make_sine() 轻松地将其转换为音频波并播放。

注意:tuneR 还有一个名为play() 的函数,它的工作方式不同,可能会因屏蔽而导致错误。


功能

make_wave <- function(pitch, duration, tempo, sample_rate)
    # Credit to Nick Kennedy
    require(dplyr)

    notes <- c(A = 0, B = 2, C = 3, D = 5, E = 7, F = 8, G = 10)

    # remove leading, trailing, and consecutive spaces (and some line breaks)
    pitch <- gsub("\n", " ", pitch)
    pitch <- gsub("(?<=[\\s])\\s*|^\\s+|\\s+$", "", pitch, perl=TRUE)

    # split notes, add duration
    x <- data_frame(pitch = strsplit(pitch, " ")[[1]],
                    duration = duration)

    # calculate frequency
    x <-
        x %>%
        mutate(octave = substring(pitch, nchar(pitch)) %>%
        suppressWarnings(as.numeric(.)) %>%
            ifelse(is.na(.), 4, .),
        note = notes[substr(pitch, 1, 1)],
        note = note + grepl("#", pitch) -
            grepl("b", pitch) + octave * 12 +
            12 * (note < 3),
        freq = 2 ^ ((note - 60) / 12) * 440)


    # create fade to remove clipping
    fade <- seq(0, 1, 50 / sample_rate)


    # turn frequency and duration into sound
    make_sine <- function(freq, duration) 
        # create audio wave
        wave <- sin(seq(0, duration / tempo * 60, 1 / sample_rate) *
                        freq * 2 * pi)

        # apply fade to audio wave
        wave * c(fade, rep(1, length(wave) - 2 * length(fade)), rev(fade))
    

    # create waveform
    wave_df <-
        mapply(make_sine, x$freq, x$duration) %>%
        do.call("c", .)

    return(wave_df) 

【讨论】:

谢谢。我可能遗漏了一些东西,但我不确定这如何解决多渠道问题。我正在尝试通过声卡的多个通道同时输出。

以上是关于从 R 驱动声卡的主要内容,如果未能解决你的问题,请参考以下文章

声卡驱动打不开是怎么了

windows2000怎样装声卡驱动?我的是独立声卡。

声卡驱动下载地址

Ubuntu下声卡驱动解决方法alsa

thinkpad X230 安装声卡驱动(官方网站下载)后没有声音,卸载声卡驱动后才能恢复有声?

黑苹果AppleALC声卡驱动教程详解