Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2013, 11:38   #1
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию Вопрос про обработку WAV (касетная запись в бинарь)

Приветствую!

Пытаюсь сделать программу для перевода кассетной программы (стандарт IBM cassette tape) в бинарный файл. Более подробно описано здесь: http://www.brutman.com/Cassette_Wave...Waveforms.html

Вкратце суть такова: данные пишутся битами (1,0). Если полярность успевает сменится с отрицательной на положительную за 1 миллисекунду - то это единичный бит. Если не успевает - то нулевой. Казалось бы, что может быть проще?

Работаю с WAV файлами 8 bit, mono, 22-44Khz. По вышеприведенной ссылке есть тестовая запись в MP3, я конверчу ее в WAV 44Khz, 8 bit, mono. Открываю в audacity и вижу такую картину:


Картинка изумительная, читается глазами: 1111 0000 1011 001 .Теперь беру свою прогу. Читаю в массив shortint всю WAV, и пытаюсь нарисовать
так:
PHP код:
:= 0;
for 
:= start_offset to end_offset do
begin
LineTo
(X,128+Mas[i]);
Inc(x,2);
end
Вижу примерно следующее:


Вопрос: что я вижу? Где моя красивенькая синусойда?
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 22.01.2013, 12:37   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

надеюсь в массив грузишь чистые аудиоданные без wav заголовков?
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 22.01.2013, 12:45   #3
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
надеюсь в массив грузишь чистые аудиоданные без wav заголовков?
Ессесно...
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 22.01.2013, 13:30   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Можно больше кода?
У меня тот же артефакт возникает при переходе через 0.
Тестовый код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  mas: array [1 .. 100] of byte;
  i: integer;
begin
  for i := 1 to 100 do
    mas[i] := round(127 * sin(pi*i/10));
  canvas.moveto(0, 0);
  for i := 0 to 100 do
  begin
    canvas.LineTo(3*i, 128 + mas[i]);
  end;
end;
Картинка как у Вас.
-1 превращается в 255.

Чтобы вывелось правильно (у меня):
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  mas: array [1 .. 100] of byte;
  i: integer;
begin
  for i := 1 to 100 do
    mas[i] := round(127 * sin(pi * i / 10));
  canvas.moveto(0, 0);
  for i := 0 to 100 do
  begin
    if mas[i] > 127 then
      canvas.LineTo(3 * i, 128 + mas[i] - 255)
    else
      canvas.LineTo(3 * i, 128 + mas[i]);
  end;
end;
Т.е. у Вас знаковые значения считаются как беззнаковые.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 22.01.2013 в 13:34.
BDA вне форума Ответить с цитированием
Старый 22.01.2013, 14:03   #5
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Я много думал над этим, но я все равно решительно не понимаю ничего.
Значит по коду : буффер, куда грузится весь файл:
Код:
Type
  BufferType    = Array[0..MaxLongInt-1] of Byte;
  pBuffer       = ^BufferType;

Var
   Buf : Pointer;
То есть вроде-бы он у меня беззнаковый. Правильно?
Далее загрузка файла:

Код:
   AssignFile(F,'d:\poisk\ibm.WAV');
   Reset(F,1);
   BlockRead(F,Hdr,44); // Hdr - загловок WAV, 44 байта в целом
   Size := FileSize(F)-44;
   GetMem(Buf,Size);
   BlockRead(F,pBuffer(Buf)^,Size);
   CloseFile(F);
Вот тут начинается весь замес. Я подразумеваю, что если у меня в буфер - беззнаковый, а значения в теории должны быть знаковыми (ведь должны же?), то я могу с помощью такой операции value := shortint(pBuffer(Buf)^[i]) получить в value нужное мне значение от -127 до 128, value при этом типа shortint.
Рисую приблизительно так:
Код:
Var
cur : shortint;

Begin
     X := 0;
     for i := start_offset to end_offset do
        begin
               cur:=shortint(pBuffer(Buf)^[j+i]);
               Form1.Image1.Canvas.LineTo(X,128+cur);
               Inc(X,2)
        end;
End;
Картинка приведена выше. Или в 8 bit WAV файле какие-то другие signed-unsigned значения, не по правилам "первый бит единица = ноль". То есть я предпологаю, что $80 - это нуль. А ноль ли это на самом деле в понимании WAV?
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 22.01.2013, 14:34   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Я ошибся ввиду плохого знания формата wav.
Волна хранится беззнаково.
Вот так у меня рисуется синусоида:
Код:
procedure TForm1.Button1Click(Sender: TObject);
Type
  BufferType = Array [0 .. MaxLongInt - 1] of byte;
  pBuffer = ^BufferType;
Var
  Buf: Pointer;
  i: integer;
  f: file;
  size: longint;
Begin
  AssignFile(f, 'tone.WAV');
  Reset(f, 1);
  seek(f, 44);
  // BlockRead(F, Hdr, 44); // Hdr - загловок WAV, 44 байта в целом
  size := FileSize(f) - 44;
  GetMem(Buf, size);
  BlockRead(f, pBuffer(Buf)^, size);
  CloseFile(f);
  canvas.moveto(0, pBuffer(Buf)^[0]);
  for i := 1 to size - 1 do
    canvas.LineTo(i, pBuffer(Buf)^[i]);
  freemem(Buf);
End;
UPD
Пожалуйста
Цитата:
Как всегда все оказывается банально просто.
Это точно
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 22.01.2013 в 14:54.
BDA вне форума Ответить с цитированием
Старый 22.01.2013, 14:51   #7
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Точно! Вот спасибо добрый человек, а то я себе уже голову второй день ломаю )) Как всегда все оказывается банально просто.
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 22.01.2013, 14:57   #8
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Можно больше кода?
У меня тот же артефакт возникает при переходе через 0.
Тестовый код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  mas: array [1 .. 100] of byte;
  i: integer;
begin
  for i := 1 to 100 do
    mas[i] := round(127 * sin(pi*i/10));
  canvas.moveto(0, 0);
  for i := 0 to 100 do
  begin
    canvas.LineTo(3*i, 128 + mas[i]);
  end;
end;
Картинка как у Вас.
-1 превращается в 255.
Т.е. у Вас знаковые значения считаются как беззнаковые.
сам себе злобный буратина...

byte 0..255 , а синус -1.. 1
вот и получается что пытаешься -127 в байт засунуть
надо заранее отраничивать диапазон, а не боротся с последствиями
for i := 1 to 100 do
mas[i] := 128+round(127 * sin(pi*i/10));
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 22.01.2013, 15:00   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Slym, это было сделано специально, исходя из предположения, что в pcm формате нижние части синусоиды хранятся в дополнительном коде, но это оказалось не так.
(Код может быть абсолютно неграмотным, т.к. стояла цель - получить в кратчайшие сроки прототип, выдающий такой же или близкий результат к скриншоту Tronixа)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 22.01.2013 в 15:15.
BDA вне форума Ответить с цитированием
Старый 23.01.2013, 13:34   #10
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Тему не читал, но, вдруг еще не нашли: в 8-разрядном формате используются беззнаковые данные, при этом паузе соответствует значение 127 или 128.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос про запись данных в файл. pinkiller Общие вопросы C/C++ 4 05.01.2012 15:57
Вопрос про MaskEdit и воиспроизведение *.wav Deis C++ Builder 4 20.04.2011 20:07
Вопрос про воиспроизведение *.wav Deis Помощь студентам 3 18.03.2011 17:43
Вопрос про MaskEdit и воиспроизведение *.wav в C++ Builder 6 Deis Помощь студентам 0 11.03.2011 22:33
Вопрос про обработку исключений Ok-ei Общие вопросы C/C++ 17 19.08.2009 22:49