Запускаем Visual Studio.
Создаём новый проект. Выбираем тип проекта приложение Windows Forms (NET Framework)
Выбираем путь для проекта. А так же обязательно выбираем целевую платформу не ниже NET Framework 4.7.2
В созданном проекте справа в дереве проекта кликаем правой кнопкой по корню проекта и в выпавшем меню выбираем Управление пакетами NuGet...
Выбираем вкладку Обзор и вводим в строке поиска NAudio. Когда находит пакет NAudio нажимаем кнопку Установить и ждем завершения процесса установки.
Теперь вкладку загрузки пакетов NuGet можно закрыть.
Что мы проделали? Создали новый проект и подключили к нему пакет NAudio который содержит классы необходимые для работы с аудио, которым мы и воспользуемся при написании нашего приложения.
Двойной клик по Form()
Вот собственно здесь будем писать наш программный код.
Создаём аудио приложение (C#)
-
- Сообщения: 3720
- Зарегистрирован: 17 май 2015, 23:27
- Откуда: Беларусь
- Благодарил (а): 152 раза
- Поблагодарили: 406 раз
Re: Создаём аудио приложение (C#)
Вписываем сюда такой код:
(можно скопировать отсюда и вставить в проект заменив исходный код)
Теперь жмем на кнопку запустить программу на выполнение
Слышим звук из колонок.
Поздравляем, вы написали своё первое аудио приложение!
(можно скопировать отсюда и вставить в проект заменив исходный код)
Код: Выделить всё
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;
}
}
}
Слышим звук из колонок.
Поздравляем, вы написали своё первое аудио приложение!
-
- Сообщения: 3720
- Зарегистрирован: 17 май 2015, 23:27
- Откуда: Беларусь
- Благодарил (а): 152 раза
- Поблагодарили: 406 раз
Re: Создаём аудио приложение (C#)
Для создания музыки полно хороших профессиональных приложений. Типа FL Studio и иже c ним. Пытаться изобретать велосипеды в этой сфере смысла нет никакого. Но всё же это не то что мне интересно. Долго кидался то в одну то в другую сторону пытаясь нащупать концепцию именно того инструмента который я хотел бы для себя. И в общем наверное нащупал. Буду наконец делать наброски в ближайшее время. И выкладывать здесь. Позже это можно будет реализовать в виде VSTi плагина для того же FL Studio.
-
- Сообщения: 3720
- Зарегистрирован: 17 май 2015, 23:27
- Откуда: Беларусь
- Благодарил (а): 152 раза
- Поблагодарили: 406 раз
Re: Создаём аудио приложение (C#)
Ну не суть. Одно либо другое. Вообще мультитрекеры - это просто и понятно но одного только этого не достаточно. Нужен инструмент автоматизирующий работу с музыкальной гармонией чтобы музыкант уже не тратил время на ненужные поиски и изобретение велосипедов в этой области. Я написал об этом в соседней теме "Простые правила музыки" viewtopic.php?f=4&t=898
-
- Сообщения: 3720
- Зарегистрирован: 17 май 2015, 23:27
- Откуда: Беларусь
- Благодарил (а): 152 раза
- Поблагодарили: 406 раз
Re: Создаём аудио приложение (C#)
Я свой музыкальный инструмент вижу так:
Это должно быть приложение которое может работать как на PC так и на смартфоне. Вариант на смартфоне особенно интересен - заниматься музыкой пока еду в маршрутке.
Среди вариантов реализации я всё никак не могу определиться- хочу ли я иметь синтез звука в реальном времени или можно обойтись генерацией звука не в реальном времени. Реал-тайм даёт больше удобства но накладывает сильные ограничения на возможности. Особенно на смартфоне который прилично слабее писишника. С другой стороны если генерить не реал тайм то можно получать максимальное качество и возможности звукогенерации даже на смартфоне, при этом возможно пожертвовав некоторым удобством работы.
И на самом деле для разных целей мне больше нравится каждый из этих подходов. Если заниматься музыкой пока еду в маршрутке - мне очень нравится второй подход. Но если музицировать на вечеринках и тусовках - то очень интересен первый вариант. Короче говоря наверное буду делать два разных приложения для первого и второго типа нужд.
===
Итак на самом деле и одно и второе приложение будут иметь общую концепцию в следующем - полностью автоматизированная работа с музыкальной гармонией. А вот что касается работы с тембром - здесь наоборот полностью ручная работа чтобы иметь возможность полностью конфигурировать мельчайшие нюансы звучания вручную.
Это будет выглядеть так. Программа будет оперировать таким понятием как музыкальный loop. Суть - это некий не длинный фрагмент музыки который можно крутить по кругу. Это понятие по аналогии с сэмпловыми лупами. Но отличие вот в чем - сэмпловый луп это заранее записанный звук который можно крутить по кругу - это отлично подходит для ритмических барабанных партий. Однако если мы работаем с мелодическими партиями то очевидно невозможно втыкнуть один такой луп в разные музыкальные композиции поскольку он не подойдет туда по нотам и аккордам. Поэтому если работать с обычными сэмпловыми лупами то вариантов только два - либо подстраивать композицию под ноты и аккорды лупа - что дает на выходе одинаковые (и однообразные) в музыкальном смысле композиции, либо для каждой композиции создавать собственные уникальные лупы - что очень трудоемко, особенно если на вылизывание звука до тончайших нюансов тратится очень много времени - и очень обидно что вся эта рутинная работа применима только один раз к одной композиции не может быть просто сохранена чтобы потом применить в других композициях.
Так вот - музыкальный луп который я хочу сделать - это такая штука которая не является заранее записанным аудио сэмплом. Скорее это записанная заранее последовательнось операций которые мы делаем когда редактируем этот луп вручную. И затем можно это сохранить и повторно применить в другой композиции. Но фишка в том что в новой композиции этот луп заново перегенерирует звук подстровишись под гармонию того места в который мы его втыкнули - то есть получаем удобство работы с мелодическими лупами такое же как ранее было доступно только для ритмических.
====
Далее. Собственно приложение будет иметь два раздела - первый предназначен для редактирования гармонии нашей музыкальной композиции, второй для редактирования собственно вот этих музыкальных лупов.
При редактировании гармонии мы работаем только с нотами и не касаемся инструментов, эффектов и прочих чисто аккустических процессов звукогенерации. В этой части мы записываем аккорды и мелодии - но они не привязаны ни каким синтезаторам. Для того чтобы просдушивать это дело - можно выбрать какой нибудь музыкальный луп из библиотеки и прослушивать наши аккорды и мелодии через него. Таким образом мы создаём гармоническую линию будущей композиции.
Во второй части мы уже не редактируем аккорды и ноты а редактируем уже музыкальные лупы настраивая и вылизывая звук до совершенства. При этом вместо конкретных нот здесь применяются ссылки на номера нот из гармонической линии - то есть мы привязываемся к аккордам и мелодиям записанным в гармонической части но не прописываем конкретные аккорды и мелодии в музыкальный луп. Таким образом созданный таким способом музыкальный луп можно легко подвязать к любой гармонической линии - и все звучащие в этом лупе ноты перестроятся в соответствии с той гармонической линией с которой мы будем использовать этот музыкальный луп. При этом в музыкальном лупе можно применить разные способы подвязки к гармонической линии - можно брать из неё ноты напрямую, сдвигать на октавы или любые другие интервалы, обращать чтобы удерживать в заданном диапазоне нот и др. То есть привязка к гармонической линии может быть достаточно гибкой.
Теперь о том как собственно будет редактироваться музыкальный луп. Мне не очень нравится концепция использования синтезаторов и эффектов. Мне больше нравится подход как в аудиоредакторах а не в музыкальных редакторах - то есть мы выполняем серию операций применяя разные преобразования и эффекты. Суть в том что мы сохраняем в конце не сам звук а последовательность операций - таким образом звук может потом перегенериться заново но уже с новой информацией о нотах полученной от привязки к мелодической линии в том месте где он применяется.
=====
Теперь о реалтайме и оффлайне. Если вести речь только о редактировании музыки то это можно делать не в риалтайме. Ну то есть это может выглядеть так - выполняем некоторые редактирования, потом нажимаем кнопочку "применить" - и ждем пока полоска дойдет до конца - после чего можем прослушивать результат. Затем еще подредактировать, опять применить, и снова прослушать - и вот в таком процессе редактировать музыку.
Но дело в том что мне еще очень интересен такой формат - игра вживую. Дело в том что можно на заранее заготовленную гармоническую линии на лету подкидывать лупы и генерить музыку на лету во время тусовок и вечеринок. Получится интересно - одна и та же композиция может быть каждый раз вживую сыграна очень по разному. То есть это не проигрывание заранее записанных треков а достаточно такая живая импровизация на лету, но при этом это не будет так же сложно как попытаться сыграть музыку на инструментах и не будет требовать профессионального коллектива музыкантов - с такой импровизацией справится любой диджей.
И вот для этого варианта интересно иметь всё же генерацию звука в реалтайме. Наверное это будет отдельное приложение . Для такого приложения я применю упрощенную генерацию звука - там не будет многообразия эффектов и синтезаторов но будет применен вариант сэмплера с неким типовым набором эффектов. Так чтобы это хозяйство могло играть в реалном времени. Музыкальные лупы в таком случае будут состоять не из многообразия аудиоопераций а из небольшого набора операций управляющих параметрами сэмплера и его эффектов. Звук будет возможно несколько попроще (хотя может и вполне нормальный) но зато в реалтайме. Ну и наверное есть вариант вперспективе развит это приложение применив VST и VSTi, что тоже вполне применимый вариант на достаточно мощном компе (но лично я для себя рассматриваю вариант использования планшета на open air с блютуз колонками - где нет электричества и возможности включить полноценный комп - поэтому собственно и заморачиваюсь на упрощенном варианте звукогенерации)
Это должно быть приложение которое может работать как на PC так и на смартфоне. Вариант на смартфоне особенно интересен - заниматься музыкой пока еду в маршрутке.
Среди вариантов реализации я всё никак не могу определиться- хочу ли я иметь синтез звука в реальном времени или можно обойтись генерацией звука не в реальном времени. Реал-тайм даёт больше удобства но накладывает сильные ограничения на возможности. Особенно на смартфоне который прилично слабее писишника. С другой стороны если генерить не реал тайм то можно получать максимальное качество и возможности звукогенерации даже на смартфоне, при этом возможно пожертвовав некоторым удобством работы.
И на самом деле для разных целей мне больше нравится каждый из этих подходов. Если заниматься музыкой пока еду в маршрутке - мне очень нравится второй подход. Но если музицировать на вечеринках и тусовках - то очень интересен первый вариант. Короче говоря наверное буду делать два разных приложения для первого и второго типа нужд.
===
Итак на самом деле и одно и второе приложение будут иметь общую концепцию в следующем - полностью автоматизированная работа с музыкальной гармонией. А вот что касается работы с тембром - здесь наоборот полностью ручная работа чтобы иметь возможность полностью конфигурировать мельчайшие нюансы звучания вручную.
Это будет выглядеть так. Программа будет оперировать таким понятием как музыкальный loop. Суть - это некий не длинный фрагмент музыки который можно крутить по кругу. Это понятие по аналогии с сэмпловыми лупами. Но отличие вот в чем - сэмпловый луп это заранее записанный звук который можно крутить по кругу - это отлично подходит для ритмических барабанных партий. Однако если мы работаем с мелодическими партиями то очевидно невозможно втыкнуть один такой луп в разные музыкальные композиции поскольку он не подойдет туда по нотам и аккордам. Поэтому если работать с обычными сэмпловыми лупами то вариантов только два - либо подстраивать композицию под ноты и аккорды лупа - что дает на выходе одинаковые (и однообразные) в музыкальном смысле композиции, либо для каждой композиции создавать собственные уникальные лупы - что очень трудоемко, особенно если на вылизывание звука до тончайших нюансов тратится очень много времени - и очень обидно что вся эта рутинная работа применима только один раз к одной композиции не может быть просто сохранена чтобы потом применить в других композициях.
Так вот - музыкальный луп который я хочу сделать - это такая штука которая не является заранее записанным аудио сэмплом. Скорее это записанная заранее последовательнось операций которые мы делаем когда редактируем этот луп вручную. И затем можно это сохранить и повторно применить в другой композиции. Но фишка в том что в новой композиции этот луп заново перегенерирует звук подстровишись под гармонию того места в который мы его втыкнули - то есть получаем удобство работы с мелодическими лупами такое же как ранее было доступно только для ритмических.
====
Далее. Собственно приложение будет иметь два раздела - первый предназначен для редактирования гармонии нашей музыкальной композиции, второй для редактирования собственно вот этих музыкальных лупов.
При редактировании гармонии мы работаем только с нотами и не касаемся инструментов, эффектов и прочих чисто аккустических процессов звукогенерации. В этой части мы записываем аккорды и мелодии - но они не привязаны ни каким синтезаторам. Для того чтобы просдушивать это дело - можно выбрать какой нибудь музыкальный луп из библиотеки и прослушивать наши аккорды и мелодии через него. Таким образом мы создаём гармоническую линию будущей композиции.
Во второй части мы уже не редактируем аккорды и ноты а редактируем уже музыкальные лупы настраивая и вылизывая звук до совершенства. При этом вместо конкретных нот здесь применяются ссылки на номера нот из гармонической линии - то есть мы привязываемся к аккордам и мелодиям записанным в гармонической части но не прописываем конкретные аккорды и мелодии в музыкальный луп. Таким образом созданный таким способом музыкальный луп можно легко подвязать к любой гармонической линии - и все звучащие в этом лупе ноты перестроятся в соответствии с той гармонической линией с которой мы будем использовать этот музыкальный луп. При этом в музыкальном лупе можно применить разные способы подвязки к гармонической линии - можно брать из неё ноты напрямую, сдвигать на октавы или любые другие интервалы, обращать чтобы удерживать в заданном диапазоне нот и др. То есть привязка к гармонической линии может быть достаточно гибкой.
Теперь о том как собственно будет редактироваться музыкальный луп. Мне не очень нравится концепция использования синтезаторов и эффектов. Мне больше нравится подход как в аудиоредакторах а не в музыкальных редакторах - то есть мы выполняем серию операций применяя разные преобразования и эффекты. Суть в том что мы сохраняем в конце не сам звук а последовательность операций - таким образом звук может потом перегенериться заново но уже с новой информацией о нотах полученной от привязки к мелодической линии в том месте где он применяется.
=====
Теперь о реалтайме и оффлайне. Если вести речь только о редактировании музыки то это можно делать не в риалтайме. Ну то есть это может выглядеть так - выполняем некоторые редактирования, потом нажимаем кнопочку "применить" - и ждем пока полоска дойдет до конца - после чего можем прослушивать результат. Затем еще подредактировать, опять применить, и снова прослушать - и вот в таком процессе редактировать музыку.
Но дело в том что мне еще очень интересен такой формат - игра вживую. Дело в том что можно на заранее заготовленную гармоническую линии на лету подкидывать лупы и генерить музыку на лету во время тусовок и вечеринок. Получится интересно - одна и та же композиция может быть каждый раз вживую сыграна очень по разному. То есть это не проигрывание заранее записанных треков а достаточно такая живая импровизация на лету, но при этом это не будет так же сложно как попытаться сыграть музыку на инструментах и не будет требовать профессионального коллектива музыкантов - с такой импровизацией справится любой диджей.
И вот для этого варианта интересно иметь всё же генерацию звука в реалтайме. Наверное это будет отдельное приложение . Для такого приложения я применю упрощенную генерацию звука - там не будет многообразия эффектов и синтезаторов но будет применен вариант сэмплера с неким типовым набором эффектов. Так чтобы это хозяйство могло играть в реалном времени. Музыкальные лупы в таком случае будут состоять не из многообразия аудиоопераций а из небольшого набора операций управляющих параметрами сэмплера и его эффектов. Звук будет возможно несколько попроще (хотя может и вполне нормальный) но зато в реалтайме. Ну и наверное есть вариант вперспективе развит это приложение применив VST и VSTi, что тоже вполне применимый вариант на достаточно мощном компе (но лично я для себя рассматриваю вариант использования планшета на open air с блютуз колонками - где нет электричества и возможности включить полноценный комп - поэтому собственно и заморачиваюсь на упрощенном варианте звукогенерации)