मैं आर का उपयोग करके संगीत खेलना चाहता हूं। जबकि आर इस उद्देश्य के लिए सबसे अच्छा उपकरण नहीं हो सकता है, यह वह उपकरण है जिससे मैं परिचित हूं और ऐसे खुशी के अवसर पर दूसरों को इसका लचीलापन प्रदर्शित करना अच्छा होगा।
मैं इसे कैसे पूरा कर सकता हूं?
मैं आर का उपयोग करके संगीत खेलना चाहता हूं। जबकि आर इस उद्देश्य के लिए सबसे अच्छा उपकरण नहीं हो सकता है, यह वह उपकरण है जिससे मैं परिचित हूं और ऐसे खुशी के अवसर पर दूसरों को इसका लचीलापन प्रदर्शित करना अच्छा होगा।
मैं इसे कैसे पूरा कर सकता हूं?
I would like to play video using R।
rasterImageप्रत्येक फ्रेम को रेंडर करने के लिए)
जवाबों:
यदि आप वास्तव में ऐसा करना चाहते हैं:
library("audio")
bday_file <- tempfile()
download.file("http://www.happybirthdaymusic.info/01_happy_birthday_song.wav", bday_file, mode = "wb")
bday <- load.wave(bday_file)
play(bday)
नोट आपको install.packages("audio")पहले करना होगा। यदि आपके पास पहले से कोई विशिष्ट फ़ाइल है, तो आपको इसे पहले WAV प्रारूप में बदलना होगा।
अगर आपको WAV फ़ाइल चलाने की तुलना में कुछ अधिक प्रोग्रामर चाहिए था, तो यहां एक संस्करण है जो साइन लहरों की एक श्रृंखला से धुन उत्पन्न करता है:
library("dplyr")
library("audio")
notes <- c(A = 0, B = 2, C = 3, D = 5, E = 7, F = 8, G = 10)
pitch <- "D D E D G F# D D E D A G D D D5 B G F# E C5 C5 B G A G"
duration <- c(rep(c(0.75, 0.25, 1, 1, 1, 2), 2),
0.75, 0.25, 1, 1, 1, 1, 1, 0.75, 0.25, 1, 1, 1, 2)
bday <- data_frame(pitch = strsplit(pitch, " ")[[1]],
duration = duration)
bday <-
bday %>%
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)
tempo <- 120
sample_rate <- 44100
make_sine <- function(freq, duration) {
wave <- sin(seq(0, duration / tempo * 60, 1 / sample_rate) *
freq * 2 * pi)
fade <- seq(0, 1, 50 / sample_rate)
wave * c(fade, rep(1, length(wave) - 2 * length(fade)), rev(fade))
}
bday_wave <-
mapply(make_sine, bday$freq, bday$duration) %>%
do.call("c", .)
play(bday_wave)
नोट करने के लिए कुछ बिंदु हैं। नोटों के लिए डिफ़ॉल्ट ऑक्टेव ऑक्टेव 4 है, जहां A4 440 हर्ट्ज पर है (ऑर्केस्ट्रा को ट्यून करने के लिए इस्तेमाल किया जाने वाला नोट)। ऑक्टेव्स C से अधिक बदलते हैं, इसलिए C3 B2 की तुलना में एक सेमीटोन अधिक है। फीका होने का कारण make_sineयह है कि इसके बिना नोट्स शुरू करने और बंद करने के लिए श्रव्य चबूतरे होते हैं।
cहै do.call, और अंतिम असाइनमेंट make_sineअनावश्यक है।
do.call। यह सब बहुत आसान है a <- 1; b <- 2; c <- 3कि रास्ते में कुछ किया जा सकता है, और उस स्थिति do.call(c, ...)में विफल हो जाएगा, जबकि c(1, 2, 3)वह असफल नहीं होगा। हालांकि बाद के बिंदु से पूरी तरह सहमत हैं, और अनावश्यक असाइनमेंट को हटा दिया है!
do.call("c", ...)में काम करेगा। कोशिश करो c <- 4; do.call("c", list(1, 2))। R यथोचित रूप से सुसंगत है कि ज्यादातर मामलों में एक तर्क जो किसी फ़ंक्शन को स्वीकार करता है, वह या तो फ़ंक्शन को स्वीकार करेगा या फ़ंक्शन का नाम। कुछ मामलों में (उदाहरण के लिए lapply) यह है match.fun, जबकि अन्य में, उदाहरण के लिए do.call, getMethodकार्यान्वयन सी कोड में है (बाद में कॉल के माध्यम से C_R_getGeneric)। मैं देख सकता हूं कि स्टाइलिस्टिक रूप से आप इसके नाम के बजाय फ़ंक्शन को पास करना पसंद कर सकते हैं, लेकिन बाद का व्यवहार अच्छी तरह से प्रलेखित है।
symbolकोष्ठक द्वारा पीछा किया जाता है, भले ही दूसरा एक symbolऔर खोज मार्ग पर मौजूद हो। यह c <- 4; c(1, 2)सामान्य रूप से काम करने की अनुमति देता है, जबकि c <- paste0; c(1, 2)आधार का उपयोग नहीं करेगा c। मैंने इसके द्वारा बनाई गई उलझन देखी है जहां कोई c(1, 2)अपने कोड में बहुत खुशी से बुला रहा है, लेकिन फिर do.call(c, ...)काम करने में विफल रहता है। दिन के अंत में, मैं दृढ़ता से महसूस नहीं करता कि क्या कार्य नाम या सीधे द्वारा प्रदान किए गए हैं।