Моцарт из внутреннего динамика. Сороковая симфония и delphi.

Привет) Заждался, да? Часть 1, если что. Вот часть 2, вспомним былое.

Итак, пойдём по порядку, расставим все точки над и. Ты уже заметил, что мы пишем используя только модуль windows.pas. Поэтому в модуле melody.pas (там, где все функции) мы пишем свой StrToInt без использования SysUtils.

[парсим!]

Ты уже заметил, что мелодия в формате nokia состоит из неких последовательностей, разделенных пробелами? Да? Ок = )
Нам надо это всё разбить на звуки и записать в массив типа taos. Он должен быть динамическим, но у меня почему-то изначально задана длина.

function FillInTAOS(s: string):taos;
var
  p: integer;
  l: integer;
begin
  repeat
    p:=Pos(' ', s);
    if Length(s)<=1 then exit;
    l:=Length(Result);
    SetLength(Result, l + 1);
    if p <> 0 then
      Result[l]:=Copy(s, 1, p-1)
    else
      Result[l]:=s;
    Delete(s, 1, p);
  until p = 0;
end;

А теперь надо превратить отдельно каждый звук в TSound. Углубляться не буду, времени сейчас мало'(

function ParseSound(s: string):TSound;
var
  p,i: integer;
  f: char;
const
  ch = '1234567890';
begin
  p:=Pos('#', s);
  if p=0 then
    Result.d:=False
  else begin
    Result.d:=True;
    Delete(s, p, 1);
  end;
  p:=Pos('.', s);
  if p=0 then
    Result.t:=False
  else begin
    Result.t:=True;
    Delete(s, p, 1);
  end;
  for i:=1 to Length(s) do
    if Pos(s[i], ch)=0 then Break;
  Dec(i);

  Result.l:=StrToInt(Copy(s, 1, i));
  Delete(s, 1, i);

  f:=s[1];
  Delete(s, 1, 1);

  case f of
    'c': Result.n:=ndo;
    'd': Result.n:=nre;
    'e': Result.n:=nmi;
    'f': Result.n:=nfa;
    'g': Result.n:=nso;
    'a': Result.n:=nla;
    'b': Result.n:=nsi;
    else begin
      Result.n:=nsl;
      exit;
    end;
  end;

  Result.n:=oct(Result.n,StrToInt(s));

end;

С парсингом вроде всё.

[финал]

И напоследок пару функций, например для определения длины звука в миллисекундах при определенном темпе, ну и для проигрывания TSound.

function notlen(l, bpm: integer): integer; 
begin
  Result:= 240000 div l div bpm;
end;

procedure PlaySound(s: TSound);
var
  len: integer;
begin
  len:=notlen(s.l, 225);
  if s.t then
    len:=len + len div 2;
  notebeep(s.n, s.d, len);
end;

(c) crystalbit, http://parsers.info

А вот и исходник сороковой симфонии моцарта из внутреннего динамика!