Привод звуковой карты от R - PullRequest
       0

Привод звуковой карты от R

0 голосов
/ 23 декабря 2018

Я работаю над экспериментом, в котором используется звуковая карта для воспроизведения звука и вывода электрических сигналов с многоканальной звуковой карты.Из MatLab я могу напрямую управлять каждым каналом, но я бы предпочел использовать R. Я смог создать многоканальный файл и назвать каналы, но не могу заставить их воспроизводиться правильно.Я установил звуковую карту по умолчанию, и когда я играю тест в окне конфигурации в окне «Звук», но когда я запускаю свой код, он не воспроизводится.Код открывает WMP, и воспроизводится файл, который имеет правильную длину для сигнала, который я создал, но я не получаю звук из динамиков, и я не могу измерить электрический сигнал от других каналов, которые я настроил.Windows 7 Soundcard: 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 и мне сообщили, почему мой точный код не работает (слушайте () для WaveMC воспроизводит только первый канал).Но мой больший вопрос заключается в том, есть ли способ напрямую подключить звуковую карту от R, или она должна проходить через сторонний плеер.До сих пор я пробовал tuneR и seewave.

Спасибо.

1 Ответ

0 голосов
/ 23 декабря 2018

Вы можете попробовать пакет 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)

Сделайте аудиоwave dataframe:

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

Это использует слегка адаптированную версию Призрачной функции Ника Кеннеди .

... и воспроизводит ее прямо из консоли:

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) 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...