gpt4 book ai didi

r - 从 R 驱动声卡

转载 作者:行者123 更新时间:2023-12-03 01:35:14 25 4
gpt4 key购买 nike

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

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

谢谢。

最佳答案

你可以试试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 - 从 R 驱动声卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53899424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com