首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自R的驱动器声卡

来自R的驱动器声卡
EN

Stack Overflow用户
提问于 2018-12-22 21:29:54
回答 1查看 94关注 0票数 0

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

代码语言:javascript
复制
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开发人员发了同样的问题,并被告知为什么我的确切代码不起作用( WaveMC只播放第一个频道)。但我更大的问题是,是否有办法从R直接驱动声卡,或者它是否必须通过第三方播放器。到目前为止,我已经尝试了tuneR和seewave。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-12-23 14:06:45

您可以尝试audio包。

星球大战帝国三月与R

让我们写下一些注释和持续时间:

代码语言:javascript
复制
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)

制作音频波形数据:

代码语言:javascript
复制
w <- make_wave(pitch = p, duration = d, tempo = 120, sample_rate= 44100)

这使用的是稍微修改过的Nick Kennedy's phantastic function版本。

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

代码语言:javascript
复制
audio::play(w)

解释

你基本上需要的是一个有频率和持续时间的表格。这也可以通过查找表来实现。一旦你有了每一个音符的频率和持续时间,你就可以很容易地用make_sine()把它转换成一个音频,然后播放它。

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

函数

代码语言:javascript
复制
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) 
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53899424

复制
相关文章

相似问题

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