18 / 15 / 3
Регистрация: 04.05.2017
Сообщений: 136

Обработка аудио средствами js для изменения темпа и тональности

18.11.2021, 22:33. Показов 1744. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Просьба подсказать, каким образом можно изменить тональность и темп аудиотрека при помощи js, или как это сделать лучше иначе, в сети много сайтов с обработкой музыки онлайн, подозреваю, что через js это делается, могу ошибаться
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.11.2021, 22:33
Ответы с готовыми решениями:

Изменение тональности без изменения темпа (Sound Forge 7.0, например)
Дело простое: есть песня, есть Sound Forge 7.0... :rolleyes: Как повысить тональность песни так, чтобы при этом не ускорялся её темп и...

Изменение темпа воспроизведения аудио файла
Ребята подскажите как можно изменить темп воспроизведения файла? Хочу написать аудио проигрыватель меняющий темп с некоторым шагом во...

Ищу программу для изменения тональности "на лету"
Суть такая: Видел как-то в одном кабаке, музыкант включал на ноуте минусовки, а тональность музыки подстраивал под себя прям на нем же с...

6
274 / 178 / 30
Регистрация: 16.03.2017
Сообщений: 1,631
19.11.2021, 11:49
Цитата Сообщение от Кверт Посмотреть сообщение
через js это делается
Не всегда! Чаще как раз отправляют на сторону сервера, там обрабатывают стандартными библиотеками (например готовыми линуксовыми программам на С++), а потом дают "скачать" или "проиграть".

Но такое тоже можно и в браузере.
Кажется это
https://tonejs.github.io/
0
18 / 15 / 3
Регистрация: 04.05.2017
Сообщений: 136
19.11.2021, 11:52  [ТС]
Ок, спасибо, без перезагрузки страницы такое видел, поэтому думаю, что через js все таки можно, почитаю, спасибо еще раз
0
274 / 178 / 30
Регистрация: 16.03.2017
Сообщений: 1,631
19.11.2021, 16:42
Цитата Сообщение от Кверт Посмотреть сообщение
без перезагрузки страницы
Почитай про ajax технологию! Это возможность "общаться" с сервером не перегружая страницу. Например GMail позволяет заливать и скачивать файлы оставаясь на одной странице. Ютюб позволяет смотреть сотню роликов не перегружая странницу - просто докачивая нужный кусок видео.

JS конечно может все! Но обработку аудио раньше делали ТОЛЬКО на сервере. Так было быстрее. Сейчас обычно домашний комп быстрее дешевого хостинга (у меня на хостинге 2 слабых ядра, на компе 12 и в мобилке 8), поэтому пытаются максимум перенести в браузер. Но не для всего еще есть нужные библиотеки... А писать подобное "с нуля"... нужно быть профи! Но с аудио вам повезло! Я видел мощные библиотеки для аудиопроигрывателей и "визуализации" аудио. Правда они скорее для игр сделаны а не для "обработчиков аудио"...

Года 2 назад кучу времени убил в поисках онлайн редактора аудио - не нашел...
0
18 / 15 / 3
Регистрация: 04.05.2017
Сообщений: 136
19.11.2021, 21:50  [ТС]
да, про Ajax знаю, конечно, но по моему обрабатывается именно в браузере. Ну даже предположим на сервере, какими средствами там лучше это реализовать? Если сайт на wordpress? Плагинов похожих не нашел, зато нашел скрипт js в котором звуки воспроизводятся вообще без файла, так что обработку думаю точно можно произвести
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
'use strict';
 
// Количество семплов в одной секунде
const SAMPLE_FREQUENCY = 44100;
// Максимальная амплитуда волны
const MAX_AMPLITUDE = 22000;
// PI
const PI = Math.PI;
const PI_2 = PI*2;
 
/******************************************************************************/
 
/**
 * Создание буфера данных
 * @param {number} millisecond - длинна буффера в милиссекундах
 * @returns {Int16Array} Подготовленный буффер
 */
function createBuffer(millisecond) {
    let waveBytes = SAMPLE_FREQUENCY * 4 * millisecond / 1000;
    return new Int16Array(new ArrayBuffer(waveBytes));
}
 
/**
 * Создание объекта Audio с Wave Data переданным в buffer
 * @param   {Int16Array} buffer Буффер в который производится запись
 * @returns {Audio} Объект 'Audio'
 */
function createAudio(buffer) {
    let bufferLen = buffer.length,
        audioData = [],
        fromCharCode = String.fromCharCode;
    
    for (let i = 0; i < bufferLen; i++) {
        let b = buffer[i] / MAX_AMPLITUDE * 0x7800;
        audioData.push(fromCharCode(b & 255, (b >> 8) & 255));
    }
    
    return new Audio('data:audio/wav;base64,' + 
        btoa(atob('UklGRti/UABXQVZFZm10IBAAAAABA' + 
                  'AIARKwAABCxAgAEABAAZGF0YbS/UAA') +
                    audioData.join('')));
}
 
/**
 * Синтез тона
 * @param   {Int16Array} buffer Буффер Wave данных
 * @param   {number}     start  Место начала сигнага
 * @param   {number}     length Длинна сигнала
 * @param   {number}     freq   Частота сигнала
 * @param   {number}     volume Громкость сигнала (От 0 до 1)
 * @param   {function}   func   Функция - форма волны
 * @returns {Int16Array} Буффер Wave данных
 */
 
function synthTone(buffer, start, length, freq, volume, func) {
    start = start * SAMPLE_FREQUENCY * 2;
    length = length * SAMPLE_FREQUENCY * 2;
    freq = freq / SAMPLE_FREQUENCY;
    volume = volume * 32767;
    
    for (let i = 0; i < length; i++) {
        buffer[start + i] = func(start + i, freq) * volume;
    }
    
    return buffer;
}
 
/* Форма волны ****************************************************************/
 
/**
 * Синусоидальная функция волны
 * @param   {number} index     Номер текущего фрейма
 * @param   {number} frequency Частота сигнала
 * @returns {number} Значение сигнала в момент времени
 */
function sin(index, frequency) {
    return Math.sin(PI_2 * frequency * index);
}
 
/**
 * Пилообразная функция волны
 * @param   {number} index     Номер текущего фрейма
 * @param   {number} frequency Частота сигнала
 * @returns {number} Значение сигнала в момент времени
 */
function saw(index, frequency) {    
    return 2.0 * (index * frequency - 
                Math.floor(index * frequency )) - 1.0;
}
 
/**
 * Треугольная функция волны
 * @param   {number} index     Номер текущего фрейма
 * @param   {number} frequency Частота сигнала
 * @returns {number} Значение сигнала в момент времени
 */
function triangle(index, frequency) {
    return 2.0 * Math.abs(2.0 * 
            (index * frequency -
            Math.floor(index * frequency + 0.5))) - 1.0;
}
 
/**
 * Прямоугольная функция волны
 * @param   {number} index     Номер текущего фрейма
 * @param   {number} frequency Частота сигнала
 * @returns {number} Значение сигнала в момент времени
 */
function flat(index, frequency) {
    return (Math.sin(frequency * index ) > 0) ? 1 : -1;
}
 
/**
 * Функция волны типа "Шум"
 * @returns {number} Значение сигнала в момент времени
 */
function noise() {
    return Math.random();
}
 
/* Ноты **********************************************************************/
 
/**
 * Опредиление частоты звучания ноты по ее номеру и октаве
 * @param   {number} key    Номер ноты
 * @param   {number} octave Номер октавы
 * @returns {number} Частота сигнала
 */
function noteToFreq(key, octave) {
    if (!key) return 0;
    return 27.5 * Math.pow(2, (key + octave * 12.0) / 12.0);
}
 
/**
 * Опредиление частоты звучания ноты по ее строчной записи
 * @param   {string} str Строчная запись ноты
 * @returns {number} Чостота сигнала
 */
function getNote(str) {
    let symb = ['C-', 'C#', 'D-', 'D#', 'E-', 'F-', 
                'F#', 'G-', 'G#', 'A-', 'A#', 'B-'],
        note = symb.indexOf(str.substr(0, 2)),
        octave = parseInt(str.substr(2, 1), 10);
    
    return noteToFreq(note + 1, octave);
}
 
/******************************************************************************
 *                                  MAIN
******************************************************************************/
 
function synthAndPlay() {
        // Создаем буффер длинной в 10 сек
    let buffer = createBuffer(10000), 
        // Получаем частоту ноты ДО 3-ей октавы
        note = getNote('C-3'),
        volume = 0.7;  
 
    // Синтез тона
    synthTone(buffer, 0, 1, note, volume, sin);         // Синусоидальная волна
    synthTone(buffer, 2, 1, note, volume, saw);         // Пилообразная волна
    synthTone(buffer, 4, 1, note, volume, triangle);    // Треугольная волна
    synthTone(buffer, 6, 1, note, volume, flat);        // Прямоугольная волна
    synthTone(buffer, 8, 1, note, volume, noise);       // Шум
 
    createAudio(buffer).play();
}
 
//*********************************
 
let playButton = document.createElement('button');
playButton.innerText = 'Play';
playButton.addEventListener('click', synthAndPlay);
document.body.appendChild(playButton);
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,149
Записей в блоге: 43
20.11.2021, 02:10
Цитата Сообщение от Кверт Посмотреть сообщение
в сети много сайтов с обработкой музыки онлайн, подозреваю, что через js это делается
Скорей всего так оно и есть, только вряд ли тут речь идет именно об обработке аудио. Под аудио, все-таки видимо, следует подразумевать запись звука. Я очень сильно сомневаюсь, что можно взять какой-нибудь mp3-файл с записью какого-нибудь произведения, снятой с акустических инструментов и "легким движением руки" поменять в ней тональность (хотя если воспроизвести быстрее, то тональность будет, конечно же, другой и темп тоже, но вряд ли ты это имел в виду). Но зато есть такие форматы записи музыки, которые просто содержат набор инструкций, что-то типа нот для компьютера, которые он может прочитать и воспроизвести. В качестве примера можно привести тот же формат MIDI.
В браузере есть такая штука как Web Audio API - Интерфейсы веб API | MDN. Средствами этих интерфейсов можно в браузере создать и синтезатор и шарманку, которая будет воспроизводить какой-нибудь формат нотной записи типа ABC Notation, MusicXML и т. п. Существует куча библиотек, позволяющих работать с этими апи в более удобном режиме. Вот на базе этого всего можно реализовать много чего интересного, в частности транспозиция и изменение темпа там не будет представлять сложности. Но тут речь не идет об обработке звукозаписи, а вот когда у тебя есть что-то типа электронных нот, то внести в них изменение совсем не сложно, поскольку тут речь не об обработке звука как такового, а о работе с данными достаточно простого формата.
0
274 / 178 / 30
Регистрация: 16.03.2017
Сообщений: 1,631
20.11.2021, 06:22
Цитата Сообщение от Кверт Посмотреть сообщение
Ну даже предположим на сервере, какими средствами там лучше это реализовать?
Есть куча консольных программ для подобного! Прямо не интересовался, но встречал...

Даже на PHP можно забрать файл клиента на сервер, обработать внешней утилитой и вернуть назад. Поэтому так много подобных "обработчиков рингтонов для СМС" и наплодилось в свое время! ))

Добавь к этому что утилиты пишутся на С/С++ поэтому ОЧЕНЬ шустрые (по сравнению с JS минимум в 1.5-2 раза, а может и в 10). Да еще и могут быть многопоточными.

Цитата Сообщение от Кверт Посмотреть сообщение
зато нашел скрипт js в котором звуки воспроизводятся вообще без файла, так что обработку думаю точно можно произвести
Есть и такое! Да - это ВОЗМОЖНО! Готовых решений не находил (кроме фреймворка типа того "игрового" что вам раньше ссылкой скинул), поэтому придется "с нуля" разбираться. Еще встречал JS-компонент аудио-плеер с кучей модификатоворов (громкость, скорость, эквалайзер), но слишком тяжелый и много "графики". (если гугл не поможет, скажи - покопаюсь в архивах)

Не по теме:

Сам "пет-проектом" пытаюсь написать свой "аудио-фреймворк для браузера" (времени не хватает). Хорошо изучил вопрос... Пока учусь работать с буферами получаемыми с микрофона и выводить на экран бегущий график. Смог короткое mp3 вывести на канвас в виде амплитуд так-же как в аудио-редакторах (сверил = совпало). Смог заполнить буфер "белым шумом с убыванием" и проиграть... Подбираюсь к FFT )))



Добавлено через 16 минут
Цитата Сообщение от diadiavova Посмотреть сообщение
Я очень сильно сомневаюсь, что можно взять какой-нибудь mp3-файл с записью какого-нибудь произведения, снятой с акустических инструментов и "легким движением руки" поменять в ней тональность (хотя если воспроизвести быстрее, то тональность будет, конечно же, другой и темп тоже, но вряд ли ты это имел в виду)
МОЖНО! Файл можно загнать в буферы через "аудиопреобразователи". Сам в этом еще плаваю, но иногда получалось (еще не понял как, а потом на много месяцев отложил проект). Полученные буферы содержат готовые амплитуды как в древних WAV файлах. Кучу места в памяти занимают. А для обычных амплитуд уже подходят алгоритмы обработки аудио, известнные еще с 60х годов и первых радио! ))) Я в этом тоже пока плаваю, но смена громкости = равомерное уменьшение амплитуд во всем буфере, а ускорение/замедление = добавление/сокращеине количества аплитуд методами "сглаживания графика". А уж если добраться до FFT... то и с "тонами" можно будет поиграться... Результат можно либо а проигрывание пустить, либо назад в аудио-файл попытаться ужать. (у меня проигрывать получалось, а в аудио - только в WAV файлы)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.11.2021, 06:22
Помогаю со студенческими работами здесь

Обработка изображений из темпа
Всем привет! После передачи картинки через форму ($_FILES) она попадает в Temp. И выглядит файл примерно так C:\Windows\Temp\phpF93B.tmp....

прога для изменения типа подключение аудио (колонки\наушники)
Привет. Такая проблема есть: когда подключаю наушники (к монитору), чтобы звук шел в этот порт, нужно выключить динамики в настройках (пр...

Программа для смены тональности
всем привет, занимаюсь музыкой, и вот пришла идея написать программу которая бы автоматически меняла тональности. Пример, допустим я в memo...

Обработка исключений для изменения строки
private void button1_Click(object sender, EventArgs e) { stroka = tb_result.Text; string res =...

внешняя обработка для изменения свойств номенклатуры
1С восьмерка занимаюсь совсем недавно, так что может вопрос и простой, но для меня сложный ) ситуация: нужно изменить одно из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru