“Код” музыкальных файлов

303
06 января 2017, 11:36

Я хочу попробовать создать программу для создания/редактирования какой-либо музыки. Чисто в образовательных целях я хочу узнать как работать с музыкальными файлами, изменять их, создавать...

Я знаю что есть форматы со сжатием трека и без. Например тот же .aiff, но его не открыть просто так блокнотом. Как создать собственный .aiff? Как написать в нем пару секунд звуков и получить его структуру, для изменения, изучения?

Существует MIDI. С ним все проще, зато возможностей меньше. Музыкальный диапазон ограничивает возможности, зато его можно конвертировать в MusicXML и обратно и таким образом создавать, редактировать.

Почему с тем же .mp3 так много возни? Это ведь популярный формат, в интернете должно быть очень много информации про то как его изменить, но я не нахожу ничего кроме получения тегов трека с помощью ID3(на PHP).

Как конвертировать любой формат в редактируемый код(например .XML) и обратно и что вообще можно сделать с треком?

У меня в голове путаница на этот счет, я надеюсь что тут есть человек, который объяснит как это работает.

П.С. я надеюсь работать на JS, NodeJS, PHP, если это возможно, я не собираюсь создавать крайне мощные редакторы, я хочу понять как это работает, создать через PHP какой либо небольшой(даже некрасивый) трек и все.

Answer 1

Это возможно, вот тут написано как это сделать при помощи пхп http://www.theblog.ca/merge-mp3s-php

<?php
// This is the class to generate mp3 files based on the anti-spam words
// Based on the PHP mp3 class at http://www.sourcerally.net/Scripts/20-PHP-MP3-Class
// Output code based on the FPDF class at http://www.fpdf.org
class mp3
  {
    var $str;
    var $time;
    var $frames;
    // Create a new mp3
    function mp3($path="")
    {
    if($path!="")
        {
        $this->str = file_get_contents($path);
        }
    }
  // Put an mp3 behind the first mp3
  function mergeBehind($mp3)
  {
  $this->str .= $mp3->str;
  }
  // Calculate where's the end of the sound file
  function getIdvEnd()
  {
  $strlen = strlen($this->str);
  $str = substr($this->str,($strlen-128));
  $str1 = substr($str,0,3);
  if(strtolower($str1) == strtolower('TAG'))
  {
  return $str;
  }
  else
  {
  return false;
  }
  }
  // Calculate where's the beginning of the sound file
  function getStart()
  {
  $strlen = strlen($this->str);
  for($i=0;$i<$strlen;$i++)
  {
  $v = substr($this->str,$i,1);
  $value = ord($v);
  if($value == 255)
  {
  return $i;
  }
  }
  }
  // Remove the ID3 tags
  function striptags()
  {
  //Remove start stuff...
  $newStr = '';
  $s = $start = $this->getStart();
  if($s===false)
  {
  return false;
  }
  else
  {
  $this->str = substr($this->str,$start);
  }
  //Remove end tag stuff
  $end = $this->getIdvEnd();
  if($end!==false)
  {
  $this->str = substr($this->str,0,(strlen($this->str)-129));
  }
  }
  // Display an error
  function error($msg)
  {
  //Fatal error
  die('<strong>audio file error: </strong>'.$msg);
  }

 // Send the new mp3 to the browser
  function output($path)
  {
  //Output mp3
  //Send to standard output
  if(ob_get_contents())
  $this->error('Some data has already been output, can\'t send mp3 file');
  if(php_sapi_name()!='cli')
  {
  //We send to a browser
  header('Content-Type: audio/mpeg3');
  if(headers_sent())
  $this->error('Some data has already been output to browser, can\'t send mp3 file');
  header('Content-Length: '.strlen($this->str));
  header('Content-Disposition: attachment; filename="'.$path.'"');
  }
  echo $this->str;
  return '';
  }
  }
  ?>
READ ALSO
Angularjs 2 и jquery

Angularjs 2 и jquery

Как правильно подключить jQuery к проекту на AngularJS 2?

334
Передача данных между потоками POCO C++ Libraries

Передача данных между потоками POCO C++ Libraries

Использую TCPServer (POCO C++ Libraries), который создает поток на 1 клиентаНеобходимо передавать клиенту(потоку), к примеру, данные о передвижении персонажей...

671
Не собирается шаблонный проект CUDA 8.0 в VS15

Не собирается шаблонный проект CUDA 8.0 в VS15

Доброго времени суток! Порядок моих действий:

359
Проблема с созданием аналога SetLength на C++

Проблема с созданием аналога SetLength на C++

Пытаюсь сделать аналог SetLength (паскаль) в C++ Просто уже нет сил без такой же удобной вещи, но мой код почему-то не работает Вот код:

372