Создаём аудио приложение (C#)

Программирование, Хакинг, Безопасность, Софт, Железо, а также всё связанное с компьютерами
Аватара пользователя
BDK
Сообщения: 3720
Зарегистрирован: 17 май 2015, 23:27
Откуда: Беларусь
Благодарил (а): 152 раза
Поблагодарили: 406 раз

Создаём аудио приложение (C#)

Сообщение BDK »

Запускаем Visual Studio.
Создаём новый проект. Выбираем тип проекта приложение Windows Forms (NET Framework)
Изображение

Выбираем путь для проекта. А так же обязательно выбираем целевую платформу не ниже NET Framework 4.7.2
Изображение

В созданном проекте справа в дереве проекта кликаем правой кнопкой по корню проекта и в выпавшем меню выбираем Управление пакетами NuGet...
Изображение

Выбираем вкладку Обзор и вводим в строке поиска NAudio. Когда находит пакет NAudio нажимаем кнопку Установить и ждем завершения процесса установки.
Изображение
Теперь вкладку загрузки пакетов NuGet можно закрыть.

Что мы проделали? Создали новый проект и подключили к нему пакет NAudio который содержит классы необходимые для работы с аудио, которым мы и воспользуемся при написании нашего приложения.


Двойной клик по Form()
Изображение

Вот собственно здесь будем писать наш программный код.
Аватара пользователя
BDK
Сообщения: 3720
Зарегистрирован: 17 май 2015, 23:27
Откуда: Беларусь
Благодарил (а): 152 раза
Поблагодарили: 406 раз

Re: Создаём аудио приложение (C#)

Сообщение BDK »

Вписываем сюда такой код:
(можно скопировать отсюда и вставить в проект заменив исходный код)

Код: Выделить всё

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using NAudio.Wave;

namespace Audio_test
{
    public partial class Form1 : Form
    {
        float f = 0;
        public Form1()
        {
            InitializeComponent();
            AudioPlayback au = new AudioPlayback(NextWave, 48000);
            au.Play();
        }

        public void NextWave(float[] buffer, int offset, int sampleCount, WaveFormat waveFormat)
        {
            float pi2 = 2f * 3.14159f;
            for (int i = 0; i < sampleCount / 2; i++)
            {
                float v = (float)Math.Sin(f);
                f += 0.05f;
                if (f >= pi2) f -= pi2;
                int adr = i + offset;
                buffer[adr * 2 + 0] = v;
                buffer[adr * 2 + 1] = v;
            }
        }
    }

    public class AudioPlayback
    {
        WaveOut wo;
        SineWaveProvider32 waveProvider;// = new SineWaveProvider32();
        GetNextWave nextWave = null;
        public AudioPlayback(GetNextWave nextWave, int sampleRate)
        {
            this.nextWave = nextWave;
            wo = new WaveOut();
            waveProvider = new SineWaveProvider32();
            waveProvider.SetWaveFormat(sampleRate, 2);
            wo.DesiredLatency = 400;
            waveProvider.nextWave = nextWave;
            wo.Init(waveProvider);
            //wo.Play();
        }

        public void Play()
        {
            wo.Play();
        }

        public void Stop()
        {
            wo.Stop();
        }
    }
    public delegate void GetNextWave(float[] buffer, int offset, int sampleCount, WaveFormat waveFormat);
    public class SineWaveProvider32 : WaveProvider32
    {
        public GetNextWave nextWave = null;
        public override int Read(float[] buffer, int offset, int sampleCount)
        {
            if (nextWave != null) nextWave(buffer, offset, sampleCount, WaveFormat);
            return sampleCount;
        }
    }
}
Теперь жмем на кнопку запустить программу на выполнение
Изображение

Слышим звук из колонок.

Поздравляем, вы написали своё первое аудио приложение! :)
Аватара пользователя
BDK
Сообщения: 3720
Зарегистрирован: 17 май 2015, 23:27
Откуда: Беларусь
Благодарил (а): 152 раза
Поблагодарили: 406 раз

Re: Создаём аудио приложение (C#)

Сообщение BDK »

Для создания музыки полно хороших профессиональных приложений. Типа FL Studio и иже c ним. Пытаться изобретать велосипеды в этой сфере смысла нет никакого. Но всё же это не то что мне интересно. Долго кидался то в одну то в другую сторону пытаясь нащупать концепцию именно того инструмента который я хотел бы для себя. И в общем наверное нащупал. Буду наконец делать наброски в ближайшее время. И выкладывать здесь. Позже это можно будет реализовать в виде VSTi плагина для того же FL Studio.
Аватара пользователя
Андрей
Архитектор
Сообщения: 7381
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов
Благодарил (а): 534 раза
Поблагодарили: 462 раза

Re: Создаём аудио приложение (C#)

Сообщение Андрей »

BDK, в последнее время многие переходят с FL Studio на Reaper.
Аватара пользователя
BDK
Сообщения: 3720
Зарегистрирован: 17 май 2015, 23:27
Откуда: Беларусь
Благодарил (а): 152 раза
Поблагодарили: 406 раз

Re: Создаём аудио приложение (C#)

Сообщение BDK »

Ну не суть. Одно либо другое. Вообще мультитрекеры - это просто и понятно но одного только этого не достаточно. Нужен инструмент автоматизирующий работу с музыкальной гармонией чтобы музыкант уже не тратил время на ненужные поиски и изобретение велосипедов в этой области. Я написал об этом в соседней теме "Простые правила музыки" viewtopic.php?f=4&t=898
Аватара пользователя
BDK
Сообщения: 3720
Зарегистрирован: 17 май 2015, 23:27
Откуда: Беларусь
Благодарил (а): 152 раза
Поблагодарили: 406 раз

Re: Создаём аудио приложение (C#)

Сообщение BDK »

Я свой музыкальный инструмент вижу так:

Это должно быть приложение которое может работать как на PC так и на смартфоне. Вариант на смартфоне особенно интересен - заниматься музыкой пока еду в маршрутке.

Среди вариантов реализации я всё никак не могу определиться- хочу ли я иметь синтез звука в реальном времени или можно обойтись генерацией звука не в реальном времени. Реал-тайм даёт больше удобства но накладывает сильные ограничения на возможности. Особенно на смартфоне который прилично слабее писишника. С другой стороны если генерить не реал тайм то можно получать максимальное качество и возможности звукогенерации даже на смартфоне, при этом возможно пожертвовав некоторым удобством работы.

И на самом деле для разных целей мне больше нравится каждый из этих подходов. Если заниматься музыкой пока еду в маршрутке - мне очень нравится второй подход. Но если музицировать на вечеринках и тусовках - то очень интересен первый вариант. Короче говоря наверное буду делать два разных приложения для первого и второго типа нужд.
===
Итак на самом деле и одно и второе приложение будут иметь общую концепцию в следующем - полностью автоматизированная работа с музыкальной гармонией. А вот что касается работы с тембром - здесь наоборот полностью ручная работа чтобы иметь возможность полностью конфигурировать мельчайшие нюансы звучания вручную.

Это будет выглядеть так. Программа будет оперировать таким понятием как музыкальный loop. Суть - это некий не длинный фрагмент музыки который можно крутить по кругу. Это понятие по аналогии с сэмпловыми лупами. Но отличие вот в чем - сэмпловый луп это заранее записанный звук который можно крутить по кругу - это отлично подходит для ритмических барабанных партий. Однако если мы работаем с мелодическими партиями то очевидно невозможно втыкнуть один такой луп в разные музыкальные композиции поскольку он не подойдет туда по нотам и аккордам. Поэтому если работать с обычными сэмпловыми лупами то вариантов только два - либо подстраивать композицию под ноты и аккорды лупа - что дает на выходе одинаковые (и однообразные) в музыкальном смысле композиции, либо для каждой композиции создавать собственные уникальные лупы - что очень трудоемко, особенно если на вылизывание звука до тончайших нюансов тратится очень много времени - и очень обидно что вся эта рутинная работа применима только один раз к одной композиции не может быть просто сохранена чтобы потом применить в других композициях.

Так вот - музыкальный луп который я хочу сделать - это такая штука которая не является заранее записанным аудио сэмплом. Скорее это записанная заранее последовательнось операций которые мы делаем когда редактируем этот луп вручную. И затем можно это сохранить и повторно применить в другой композиции. Но фишка в том что в новой композиции этот луп заново перегенерирует звук подстровишись под гармонию того места в который мы его втыкнули - то есть получаем удобство работы с мелодическими лупами такое же как ранее было доступно только для ритмических.
====

Далее. Собственно приложение будет иметь два раздела - первый предназначен для редактирования гармонии нашей музыкальной композиции, второй для редактирования собственно вот этих музыкальных лупов.

При редактировании гармонии мы работаем только с нотами и не касаемся инструментов, эффектов и прочих чисто аккустических процессов звукогенерации. В этой части мы записываем аккорды и мелодии - но они не привязаны ни каким синтезаторам. Для того чтобы просдушивать это дело - можно выбрать какой нибудь музыкальный луп из библиотеки и прослушивать наши аккорды и мелодии через него. Таким образом мы создаём гармоническую линию будущей композиции.

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

Теперь о том как собственно будет редактироваться музыкальный луп. Мне не очень нравится концепция использования синтезаторов и эффектов. Мне больше нравится подход как в аудиоредакторах а не в музыкальных редакторах - то есть мы выполняем серию операций применяя разные преобразования и эффекты. Суть в том что мы сохраняем в конце не сам звук а последовательность операций - таким образом звук может потом перегенериться заново но уже с новой информацией о нотах полученной от привязки к мелодической линии в том месте где он применяется.
=====
Теперь о реалтайме и оффлайне. Если вести речь только о редактировании музыки то это можно делать не в риалтайме. Ну то есть это может выглядеть так - выполняем некоторые редактирования, потом нажимаем кнопочку "применить" - и ждем пока полоска дойдет до конца - после чего можем прослушивать результат. Затем еще подредактировать, опять применить, и снова прослушать - и вот в таком процессе редактировать музыку.

Но дело в том что мне еще очень интересен такой формат - игра вживую. Дело в том что можно на заранее заготовленную гармоническую линии на лету подкидывать лупы и генерить музыку на лету во время тусовок и вечеринок. Получится интересно - одна и та же композиция может быть каждый раз вживую сыграна очень по разному. То есть это не проигрывание заранее записанных треков а достаточно такая живая импровизация на лету, но при этом это не будет так же сложно как попытаться сыграть музыку на инструментах и не будет требовать профессионального коллектива музыкантов - с такой импровизацией справится любой диджей.

И вот для этого варианта интересно иметь всё же генерацию звука в реалтайме. Наверное это будет отдельное приложение . Для такого приложения я применю упрощенную генерацию звука - там не будет многообразия эффектов и синтезаторов но будет применен вариант сэмплера с неким типовым набором эффектов. Так чтобы это хозяйство могло играть в реалном времени. Музыкальные лупы в таком случае будут состоять не из многообразия аудиоопераций а из небольшого набора операций управляющих параметрами сэмплера и его эффектов. Звук будет возможно несколько попроще (хотя может и вполне нормальный) но зато в реалтайме. Ну и наверное есть вариант вперспективе развит это приложение применив VST и VSTi, что тоже вполне применимый вариант на достаточно мощном компе (но лично я для себя рассматриваю вариант использования планшета на open air с блютуз колонками - где нет электричества и возможности включить полноценный комп - поэтому собственно и заморачиваюсь на упрощенном варианте звукогенерации)