Программа с помощью которой создан файл музыкальный редактор

Здесь можно скачать редактор аудио файлов, в том числе и бесплатный аудиоредактор (например, Wavosaur, Audacity или Adobe Audition v3.0). Звуковой редактор поможет конвертировать в mp3, обрезать песню, убрать шум, осуществить запись и обработку вокала, добавить эффекты (все современные редакторы поддерживают vst-плагины, благодаря которым, возможности становятся просто безграничными). Часто новички ищут редактор музыки, но на самом деле им нужна программа для создания музыки типа FL Studio.

  • Виртуальные студии 55
  • Редакторы 22
  • Мастеринг 173
  • Синтезаторы 1093
  • DJ-инг 26
  • Трэкеры 12
  • Проигрыватели 20
  • Прочее 246
  • Сэмплеры 48
  • Работа с голосом 45
  • Драм-машины 147
  • Гитара 129
  • Пакеты плагинов 42
  • Эффекты 816
  • Дополнения 37
  • по популярности
  • по дате добавления

Источник: cjcity.ru

Программы для нарезки (обрезания) музыки

Создание простого аудиоредактора

Предлагаем вниманию читателей продолжение статьи от наших партнеров, Music Paradise. В прошлый раз команда представила туториал по извлечению аудиоданных из wav-файлов; сегодня речь пойдет о том, как использовать этот функционал в более широком контексте — при разработке полноценного аудиоредактора со стандартным набором функций.

«В предыдущей статье мы рассмотрели процесс извлечения аудиоданных и даже смогли построить график на их основе. Однако никаких изменений в аудиоданные мы не вносили и, соответственно, необходимости сохранять аудиофайл не возникало. Мы лишь отметили, что процесс сохранения обратен чтению. Поэтому, чтобы не быть голословными, мы решили подкрепить слова делом и рассмотреть полный цикл работы с аудиофайлом. Целесообразность этого начинания подтверждается многочисленными вопросами на эту тему на просторах сети Интернет, причем большинство из них так и остается открытыми.

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

Не теряя времени, сразу переносим в наш новый проект уже знакомые нам структуру GraphicalWavePlot и класс PlottingGraphImg, но в последний добавляем метод:

public async Task GetImage() < if (softwareBitmap.BitmapPixelFormat != BitmapPixelFormat.Bgra8 || softwareBitmap.BitmapAlphaMode == BitmapAlphaMode.Straight) < softwareBitmap = SoftwareBitmap.Convert(softwareBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied); >var source = new SoftwareBitmapSource(); await source.SetBitmapAsync(softwareBitmap); return source; >

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

Как редактировать pdf файл БЕСПЛАТНО | Изменить pdf документ онлайн

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

Еще одному известному нам классу WavFile предстоит претерпеть множественные изменения. Мы должны привести его к следующему виду:

Развернуть

public class WavFile < public string PathAudioFile < get; >public string FileName < get; >private TimeSpan duration; public TimeSpan Duration < get < return duration; >> private const int ticksInSecond = 10000000; #region HeadData int headSize; int chunkID; int fileSize; int riffType; int fmtID; int fmtSize; int fmtCode; int channels; int sampleRate; int byteRate; int fmtBlockAlign; int bitDepth; int fmtExtraSize; int dataID; int dataSize; public int Channels < get < return channels; >> public int SampleRate < get < return sampleRate; >> #endregion #region AudioData private List floatAudioBuffer = new List(); #endregion public WavFile(string _path) < PathAudioFile = _path; FileName = Path.GetFileName(PathAudioFile); ReadWavFile(_path); >public float[] GetFloatBuffer() < return floatAudioBuffer.ToArray(); >public void SetFloatBuffer(float[] _buffer) < floatAudioBuffer.Clear(); floatAudioBuffer.AddRange(_buffer); CalculateDurationTrack(); CalculateDataSize(); CalculateFileSize(); >public void CalculateDurationTrack() => duration = TimeSpan.FromTicks((long)(((double)floatAudioBuffer.Count / SampleRate / Channels) * ticksInSecond)); public void CalculateDataSize() => dataSize = floatAudioBuffer.Count * sizeof(Int16); public void CalculateFileSize() => fileSize = headSize + dataSize; void ReadWavFile(string filename) < try < using (FileStream fileStream = File.Open(filename, FileMode.Open)) < BinaryReader reader = new BinaryReader(fileStream); chunkID = reader.ReadInt32(); fileSize = reader.ReadInt32(); riffType = reader.ReadInt32(); long _position = reader.BaseStream.Position; int zeroChunkSize = 0; while (_position != reader.BaseStream.Length — 1) < reader.BaseStream.Position = _position; int _fmtId = reader.ReadInt32(); if (_fmtId == 544501094) < fmtID = _fmtId; break; >else < _position++; zeroChunkSize++; >> fmtSize = reader.ReadInt32(); fmtCode = reader.ReadInt16(); channels = reader.ReadInt16(); sampleRate = reader.ReadInt32(); byteRate = reader.ReadInt32(); fmtBlockAlign = reader.ReadInt16(); bitDepth = reader.ReadInt16(); if (fmtSize == 18) < fmtExtraSize = reader.ReadInt16(); reader.ReadBytes(fmtExtraSize); >dataID = reader.ReadInt32(); dataSize = reader.ReadInt32(); headSize = fileSize — dataSize — zeroChunkSize; byte[] byteArray = reader.ReadBytes(dataSize); int bytesInSample = bitDepth / 8; int sampleAmount = dataSize / bytesInSample; float[] tempArray = null; switch (bitDepth) < case 16: Int16[] int16Array = new Int16[sampleAmount]; System.Buffer.BlockCopy(byteArray, 0, int16Array, 0, dataSize); IEnumerabletempInt16 = from i in int16Array select i / (float)Int16.MaxValue; tempArray = tempInt16.ToArray(); break; default: return; > floatAudioBuffer.AddRange(tempArray); CalculateDurationTrack(); > > catch < Debug.WriteLine(«File error»); >> public void WriteWavFile() < WriteWavFile(PathAudioFile); >public void WriteWavFile(string filename) < using (FileStream fs = File.Create(filename)) < fs.Write(BitConverter.GetBytes(chunkID), 0, sizeof(Int32)); fs.Write(BitConverter.GetBytes(fileSize), 0, sizeof(Int32)); fs.Write(BitConverter.GetBytes(riffType), 0, sizeof(Int32)); fs.Write(BitConverter.GetBytes(fmtID), 0, sizeof(Int32)); fs.Write(BitConverter.GetBytes(fmtSize), 0, sizeof(Int32)); fs.Write(BitConverter.GetBytes(fmtCode), 0, sizeof(Int16)); fs.Write(BitConverter.GetBytes(channels), 0, sizeof(Int16)); fs.Write(BitConverter.GetBytes(sampleRate), 0, sizeof(Int32)); fs.Write(BitConverter.GetBytes(byteRate), 0, sizeof(Int32)); fs.Write(BitConverter.GetBytes(fmtBlockAlign), 0, sizeof(Int16)); fs.Write(BitConverter.GetBytes(bitDepth), 0, sizeof(Int16)); if (fmtSize == 18) fs.Write(BitConverter.GetBytes(fmtExtraSize), 0, sizeof(Int16)); fs.Write(BitConverter.GetBytes(dataID), 0, sizeof(Int32)); float[] audioBuffer; audioBuffer = floatAudioBuffer.ToArray(); fs.Write(BitConverter.GetBytes(dataSize), 0, sizeof(Int32)); // Add Audio Data to wav file byte[] byteBuffer = new byte[dataSize]; Int16[] asInt16 = new Int16[audioBuffer.Length]; IEnumerabletemp = from g in audioBuffer select (Int16)(g * (float)Int16.MaxValue); asInt16 = temp.ToArray(); Buffer.BlockCopy(asInt16, 0, byteBuffer, 0, dataSize); fs.Write(byteBuffer, 0, dataSize); > > >

Читайте также:
МТС кэшбэк правила программы

Невозможно не заметить перегружаемый метод WriteWavFile.

Благодаря ему наш класс умеет теперь не только получать аудиоданные, но и сохранять их в доступный для работы файл. Теперь вы можете сами убедиться: мы не лукавили, когда говорили о том, что процесс записи обратен чтению. Здесь используется все тот же FileStream, только на этот раз для записи.

Стало также понятно, почему поля, необходимые для хранения данных структуры файла, стали общедоступными внутри текущего класса. Обращаем ваше внимание на то, что над некоторыми из них — duration, dataSize, fileSize — необходимо осуществлять контроль. Для нахождения fileSize, мы не стали усложнять алгоритм и использовали самый простой вариант вычисления.

Это все фрагменты, которые мы можем перенести из предыдущей статьи, остальное будем писать с нуля. Пойдем по порядку.

Добавим в наш проект класс AudioDataEditor. Заметьте, что он является производным от WavFile:

Развернуть

class AudioDataEditor:WavFile < private ListaudioBufferInMemory = new List(); public List AudioBufferInMemory < get < return audioBufferInMemory; >set < audioBufferInMemory = value; >> public AudioDataEditor(string path) : base(path) < >private void SetExactPosition(ref double startPosition, ref double endPosition, int length) < SetExactPosition(ref startPosition, length); SetExactPosition(ref endPosition, length); >private void SetExactPosition(ref double position, int length) < position = (int)(length * position); if (Channels == 2) < if (position % 2 == 0) < if (position + 1 >= length) position—; else position++; > > > public void Copy(double relativeStartPos, double relativeEndPos) < float[] audioData = GetFloatBuffer(); AudioBufferInMemory.Clear(); double startPosition = relativeStartPos; double endPosition = relativeEndPos; SetExactPosition(ref startPosition, ref endPosition, audioData.Length); float[] temp = new float[(int)(endPosition — startPosition)]; Array.Copy(audioData.ToArray(), (int)startPosition, temp, 0, temp.Length); AudioBufferInMemory.AddRange(temp); >public void Cut(double relativeStartPos, double relativeEndPos) < Copy(relativeStartPos, relativeEndPos); Delete(relativeStartPos, relativeEndPos); >public void Paste(double relativeStartPos) < if (AudioBufferInMemory.Count >0) < Listtemp = new List(); temp.AddRange(GetFloatBuffer()); double startPosition = relativeStartPos; SetExactPosition(ref startPosition, temp.Count); temp.InsertRange((int)startPosition, AudioBufferInMemory); SetFloatBuffer(temp.ToArray()); WriteWavFile(); > > public void Delete(double relativeStartPos, double relativeEndPos) < List_temp = new List(); _temp.AddRange(GetFloatBuffer()); double startPosition = relativeStartPos; double endPosition = relativeEndPos; SetExactPosition(ref startPosition, ref endPosition, _temp.Count); _temp.RemoveRange((int)startPosition, (int)(endPosition — startPosition)); SetFloatBuffer(_temp.ToArray()); WriteWavFile(); > >

В классе AudioDataEditor реализованы те операции, о которых мы говорили в начале; их реализация не покажется вам сложной при детальном изучении.

И каждый процесс изменения аудиоданных, сопровождается их сохранением в текущем файле. Отметим лишь то, что при работе с двухканальными аудиоданными стоит быть внимательнее с чередующимися семплами.

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

Механизм выбора фрагмента аудио дорожки мы реализуем через создание собственного элемента интерфейса. Осуществляем следующие шаги: через контекстное меню выберем Add → NewItem…, в появившемся окне выбираем UserControl и даем ему название GraphicsEditor, после чего нажмем кнопку Add.

Читайте также:
Авторизация не выполнена недостаточно прав для входа в программу

Созданный GraphicsEditor.xaml в результате изменений принял следующий вид:

Развернуть

public sealed partial class GraphicsEditor : UserControl < public GraphicsEditor() < this.InitializeComponent(); DataContext = this; MainContainer.PointerPressed += new PointerEventHandler(PointerPressed); MainContainer.PointerMoved += new PointerEventHandler(PointerMoved); MainContainer.PointerReleased += new PointerEventHandler(PointerReleased); MainContainer.PointerExited += new PointerEventHandler(PointerReleased); >private double leftPos; private double rightPos; private double minSelectionWidth = 10; private bool isPressed = false; private double startSelectionPosition = 0; private double currentSelectionWidth = 0; public event EventHandler SelectionChanged = delegate < >; private bool enableSelection = false; public bool EnableSelection < get < return enableSelection; >set < enableSelection = value; >> private SoftwareBitmapSource imageSource; public SoftwareBitmapSource ImageSource < get < return imageSource; >set < imageSource = value; BackgroundImage.Source = value; >> public double LeftPos < get < return leftPos; >set < leftPos = value; SetRightSelectionMargin(); >> public double RelativeLeftPos < get < return leftPos / ActualWidth; >> public double RightPos < get < return rightPos; >set < rightPos = value; SetRightSelectionMargin(); >> public double RelativeRightPos < get < return rightPos / ActualWidth; >> private void SetRightSelectionMargin() < currentSelectionWidth = Math.Abs(rightPos — leftPos); ManageGraphics(); >private void ManageGraphics() < SelectedChunk.SetValue(Canvas.LeftProperty, LeftPos); SelectedChunk.Width = currentSelectionWidth; >private void PointerReleased(object sender, PointerRoutedEventArgs e) < isPressed = false; if (Math.Abs(startSelectionPosition — GetPointerPositionX(e)) < minSelectionWidth) < EnableSelection = false; >> private void PointerMoved(object sender, PointerRoutedEventArgs e) < if (isPressed) < EnableSelection = true; double xPosition = GetPointerPositionX(e); currentSelectionWidth = Math.Abs(startSelectionPosition — xPosition); if (currentSelectionWidth >minSelectionWidth) < if (xPosition < startSelectionPosition) < if (xPosition < 0) < LeftPos = 0; >else if (xPosition < RightPos — minSelectionWidth) < LeftPos = xPosition; >RightPos = startSelectionPosition; > else if (xPosition > startSelectionPosition) < if (xPosition >this.ActualWidth) < RightPos = this.ActualWidth; >else if (xPosition > LeftPos + minSelectionWidth) < RightPos = xPosition; >LeftPos = startSelectionPosition; > > > > private void PointerPressed(object sender, PointerRoutedEventArgs e) < SelectedChunk.Visibility = Visibility.Visible; isPressed = true; startSelectionPosition = GetPointerPositionX(e); LeftPos = startSelectionPosition; RightPos = LeftPos + 2; >private double GetPointerPositionX(PointerRoutedEventArgs e) < PointerPoint pt = e.GetCurrentPoint(MainContainer); Point position = pt.Position; return position.X; >>

Коротко о работе этого элемента: GraphicsEditor позволяет отслеживать положение курсора мыши на экране и реагировать на клик, в качестве результата изменяя параметры Rectangle, который, в свою очередь, при наложении на отрисованную волну позволяет визуально выделить произвольный фрагмент аудиодорожки.

Все готово, чтобы обьединить наши наработки в файлах главной страницы приложения. В MainPage.xaml.cs объявим переменные ссылочного типа:

private StorageFile currentFile, sourceFile; private PlottingGraphImg imgFile; private AudioDataEditor editor;

Повторим уже реализованные в предыдущей статье методы:

private async Task OpenFileDialog() < var picker = new Windows.Storage.Pickers.FileOpenPicker(); picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.MusicLibrary; picker.FileTypeFilter.Add(«.mp4»); picker.FileTypeFilter.Add(«.mp3»); picker.FileTypeFilter.Add(«.wav»); sourceFile = await picker.PickSingleFileAsync(); if (sourceFile == null) await OpenFileDialog(); >public async Task ConvertToWaveFile() < OpenLoadWindow(true); MediaTranscoder transcoder = new MediaTranscoder(); MediaEncodingProfile profile = MediaEncodingProfile.CreateWav(AudioEncodingQuality.Medium); CancellationTokenSource cts = new CancellationTokenSource(); string fileName = String.Format(«_.wav», sourceFile.DisplayName, Guid.NewGuid()); currentFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync(fileName); Debug.WriteLine(currentFile.Path.ToString()); try < var preparedTranscodeResult = await transcoder.PrepareFileTranscodeAsync(sourceFile, currentFile, profile); if (preparedTranscodeResult.CanTranscode) < var progress = new Progress((percent) => < Debug.WriteLine(«Converting file: » + percent + «%»); >); await preparedTranscodeResult.TranscodeAsync().AsTask(cts.Token, progress); > else < Debug.WriteLine(«Error: Convert fail»); >> catch < Debug.WriteLine(«Error: Exception in ConvertToWaveFile»); >OpenLoadWindow(false); >

Скрывать пользовательский интерфейс во время конвертирования аудиофайла будем строчкой:

private void OpenLoadWindow(bool enable) => LoadDummy.Visibility = enable ? Visibility.Visible : Visibility.Collapsed;

Для воспроизведения аудио трека, используем логику:

private async Task SetAudioClip(StorageFile file) < var stream = await file.OpenReadAsync(); Player.SetSource(stream, «»); >private void Playback_Click(object sender, RoutedEventArgs e) < if (Player.CurrentState == MediaElementState.Playing) < Player.Stop(); >else < Player.Play(); >> private void Player_CurrentStateChanged(object sender, RoutedEventArgs e) => PlayBtn.IsChecked = Player.CurrentState == MediaElementState.Playing;

Обновляем контент при помощи методов:

private async Task BuildImageFile() < editor = new AudioDataEditor(currentFile.Path.ToString()); await Update(); >private async Task Update()

При старте приложения или при попытке подгрузить новый трек будет срабатывать метод:

private async void LoadAudioFile(object sender, RoutedEventArgs e)

Теперь остаются вызовы операций: копирование, вырезать, вставить, удалить.

private void Copy_Click(object sender, RoutedEventArgs e) < if (AudioEditorControl.EnableSelection) editor.Copy(AudioEditorControl.RelativeLeftPos, AudioEditorControl.RelativeRightPos); >private void Cut_Click(object sender, RoutedEventArgs e) < if (AudioEditorControl.EnableSelection) editor.Cut(AudioEditorControl.RelativeLeftPos, AudioEditorControl.RelativeRightPos); Update(); >private void Paste_Click(object sender, RoutedEventArgs e) < editor.Paste(AudioEditorControl.RelativeLeftPos); Update(); >private void Delete_Click(object sender, RoutedEventArgs e)

Переходим к файлу MainPage.xaml и реализуем следующий интерфейс:

Читайте также:
Как убрать программу из списка рекомендуемых

Отлично! Наше приложение готово, осталось добавить отсутствующие библиотеки и проверить код на наличие ошибок. Мы с вами создали простейший аудио редактор, но даже в нем возможны эксперименты с личными аудиофайлами. Схожая логика реализована в различных наших проектах.

Скажем, Audio Editor несет схожий функционал, но его преимуществом является работа с каждым каналом аудиофайла по отдельности. Другое приложение, Audio Genesis, имеет отличие в числе обрабатываемых аудио дорожек одновременно и возможности свести их в один трек. Каждое из разработанных приложений имеет свою область применения, возможно, и вам придет в голову идея уникального инструмента».

  • Блог компании Productivity Inside
  • C#
  • Разработка под Windows

Источник: habr.com

compizomania

Иногда для работы с аудио файлами нам требуется какой-нибудь аудио редактор для конвертации файлов, устранения шумов, увеличения звука (усиление звуковых файлов) и редактирования треков.
В Linux есть много достойных и бесплатных программ, которые выполняют перечисленные функции.

В этой статье я хотел бы представить вам 10 программ для редактирования звука, которые можно установить и использовать в Ubuntu 14.10 и старше.

1. Audacity

Audacity — звуковой редактор с поддержкой работы с несколькими дорожками одновременно. Его назначение — упрощение записи, проигрывания и редактирования оцифрованного звука. Позволяет анализировать спектр звука, создавать звуковые эффекты, отменять и повторять действия.
Поддерживает форматы Ogg Vorbis, MP2, MP3, WAV, AIFF и AU.

sudo apt-get install audacity

2. Jokosher

Jokosher — функциональный музыкальный редактор, в котором можно осуществлять запись и микшинг, редактировать готовые аудиоматериалы, добавлять различные эффекты. Поддерживается экспорт/импорт форматов mp3, ogg Vorbis, wav, которые поддерживают GStreamer. Работа с различными музыкальными инструментами.

cd /tmp; wget http://goo.gl/QeUiG0 -O jokosher_0.11.5-0_all.deb
sudo dpkg -i —force-depends jokosher_0.11.5-0_all.deb
sudo apt-get -f install

3. mhWaveEdit

mhWaveEdit — удобная и надёжная программа с графическим интерфейсом для редактирования звуковых файлов. Может работать даже на не очень быстром компьютере. Поддерживает JACK, ALSA, OSS и PulseAudio.

sudo apt-get install mhwaveedit

4. Ardour

Ardour — мощный аудиоредактор/аранжировщик, работающий в недеструктивном режиме и способный выполнять все стандартные операции нелинейного редактирования (добавление, замена, удаление, перемещение, обрезка, выделение, вырезание/копирование/вставка). Редактор имеет неограниченный уровень отмены/повтора действий и может сохранять независимые «версии» дорожек или всей композиции.

cd /tmp; wget http://goo.gl/tyxxHT -O ardour_2.8.16-0_amd64.deb
sudo dpkg -i —force-depends ardour_2.8.16-0_amd64.deb
sudo apt-get -f install

5. Kwave

Kwave — аудиоредактор для KDE. Включает несколько плагинов для различных преобразований аудиофайлов и показывает графическое отображение с полноценными возможностями масштабирования и прокрутки.
С Kwave вы можете записывать, воспроизводить, импортировать и редактировать многие виды аудио-файлов, включая многоканальные.

sudo apt-get install kwave

6. Qtractor

Qtractor — многодорожечный синтезатор MIDI/аудио. Полнофункциональный MIDI и аудио-секвенсер.

Возможности:
-поддержка профессионального аудиоинтерфейса JACK;
-традиционная многодорожечная запись MIDI и аудио;
-нелинейное, недеструктивное редактирование;
-эффекты LADSPA;
инструменты DSSI и native VSTi.

sudo apt-get install qtractor

7. LMMS

LMMS позиционируется как свободная альтернатива популярным (коммерческим и собственническим) программам, как FruityLoops, Cubase и Logic, позволяющим создавать музыку на компьютере путём создания лупов, синтезирования и микширования звуков, аранжировок треков, экспериментов с MIDI-клавиатурой и многого другого.
LMMS вобрал возможности трекеров/секвенсоров (pattern-/channel-/ sample-/song-/effect-management) и некоторые из лучших синтезаторов и сэмплеров в современном, лёгком в использовании и удобном графическом пользовательском интерфейсе.

sudo apt-get install lmms

8. Traverso

Traverso представляет собой набор инструментов для записи и редактирования аудио-потоков, позволяющий пользователю записи с большим количеством дорожек и идеально подходит для записи подкастов, как профессионалам, так и любителям.

sudo apt-get install traverso

9. Sweep

Звуковой редактор Sweep поддерживает все основные операции по редактированию аудиофайлов (такие как удаление, копирование, вставка и пр. ), звуковые эффекты в редакторе реализованы в виде LADSPA плагинов.

sudo apt-get install sweep

10. Rosegarden

Rosegarden — полнофункциональный MIDI секвенсер и нотный редактор.
Rosegarden имеет раздельные микшеры MIDI и звука, импорт/экспорт и редакторы MIDI (матричный, списочный, редактор нотных партитур и редактор перкуссии), поддерживает автоматическое преобразование аудио-фрагментов, звуковые эффекты реального времени LADSPA, а так же виртуальные инструменты DSSI и VST (через dssi-vst).

sudo apt-get install rosegarden

Источник: compizomania.blogspot.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru