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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2011, 19:15   #1
Pasha_Sh
Форумчанин
 
Аватар для Pasha_Sh
 
Регистрация: 16.05.2010
Сообщений: 137
По умолчанию Азбука морзе

unit Unit1;

interface

Код:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, portunit, StdCtrls, gen;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Gen1: TGen;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
   const letters= 'ÿàáâãäåæçèéêëìíîïðñòóôõö÷øùûüýþ1234567890,.;:?¹\"@()!-';
      codes: array[0..53]of string =('.-','-...','.--','--.','-..','.','...-','--..','..','.---',
                                     '-.-','.-..','--','-.','---','.--.','.-.','...','-','..-',
                                     '..-.','....','-.-.','---.','----','--.-','-.--','-..-','..-..','..--',
                                     '.-.-',
                                     '.----','..---','...--','....-','.....','-....','--...','---..','----.','-----',
                                     '.-.-.-','......','-.-.-','---...','..--..','-..-.','.-..-.','.----.','-.--.-','--..--','-.--.-','--..--',
                                     '-....-'
                                     );
var
  Form1: TForm1;
  str: string;

implementation

{$R *.dfm}


procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
begin
for i:=1 to length(str) do begin
if str[i]='.' then begin gen1.Duration:=50;  gen1.PlayADSR end;
if str[i]='-' then begin gen1.Duration:=350; gen1.PlayADSR end;
if str[i]=' ' then sleep(350);

end;
end;
procedure TForm1.Edit1Change(Sender: TObject);
var i,n: integer;
begin
if edit1.Text<>'' then begin
str:= '';
for i:=0 to length(edit1.Text) do begin
n:= pos(lowercase(edit1.Text[i]),letters);
if n<>0 then str:= str + codes[n-1] + ' '
end;
edit2.Text:=str;
end;
end;
end.
Вроде как всё работает, но траблы с проигрыванием звука, он совсем не такой, который нужен.
Помогите исправить пожалуйста.

P.S. gen компонент, для выведения звука.
osu
Pasha_Sh вне форума Ответить с цитированием
Старый 15.12.2011, 19:30   #2
Xardas
Сисадмин
Форумчанин
 
Аватар для Xardas
 
Регистрация: 28.12.2007
Сообщений: 320
По умолчанию

Возможно, звук не успевает проигрываться, как уже начинается следующая итерация цикла. Нужно дать возможность звуку проиграться до конца перед началом следующего шага цикла
Xardas вне форума Ответить с цитированием
Старый 15.12.2011, 19:31   #3
Pasha_Sh
Форумчанин
 
Аватар для Pasha_Sh
 
Регистрация: 16.05.2010
Сообщений: 137
По умолчанию

Куда меньше? это какой-то не звук уже получается
может есть другие компоненты этому подобные?
или лучше с динамика на мат плате звук проигрывать?
osu
Pasha_Sh вне форума Ответить с цитированием
Старый 15.12.2011, 19:43   #4
Xardas
Сисадмин
Форумчанин
 
Аватар для Xardas
 
Регистрация: 28.12.2007
Сообщений: 320
По умолчанию

Вы меня, наверное, не поняли...

Код:
...
for i:=1 to length(str) do begin
if str[i]='.' then begin gen1.Duration:=50;  gen1.PlayADSR end;
....
В то время пока проигрывается звук, начинает выполняться следующая итерация цикла, то есть получается, что звуки друг на друга как бы накладываются... Попробуйте после gen1.PlayADSR выставить задержку и посмотрите результат
Xardas вне форума Ответить с цитированием
Старый 15.12.2011, 20:09   #5
Pasha_Sh
Форумчанин
 
Аватар для Pasha_Sh
 
Регистрация: 16.05.2010
Сообщений: 137
По умолчанию

Цитата:
Сообщение от Xardas Посмотреть сообщение
Вы меня, наверное, не поняли...

Код:
...
for i:=1 to length(str) do begin
if str[i]='.' then begin gen1.Duration:=50;  gen1.PlayADSR end;
....
В то время пока проигрывается звук, начинает выполняться следующая итерация цикла, то есть получается, что звуки друг на друга как бы накладываются... Попробуйте после gen1.PlayADSR выставить задержку и посмотрите результат
Спасибо большое, работает.
Вопрос, как это всё сделать без ф-и sleep, ато программа зависает, как то не очень так
osu
Pasha_Sh вне форума Ответить с цитированием
Старый 15.12.2011, 21:07   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Можно сделать так
Код:
for i := 1 to 10 do 
begin
  sleep(10);
  application.processmessages;
end;
это будет аналогично sleep(100) но без зависаний
phomm вне форума Ответить с цитированием
Старый 15.12.2011, 22:13   #7
Pasha_Sh
Форумчанин
 
Аватар для Pasha_Sh
 
Регистрация: 16.05.2010
Сообщений: 137
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Можно сделать так
Код:
for i := 1 to 10 do 
begin
  sleep(10);
  application.processmessages;
end;
это будет аналогично sleep(100) но без зависаний
не катит
osu
Pasha_Sh вне форума Ответить с цитированием
Старый 15.12.2011, 22:38   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...а что ж вы TC не спросите автора утилиты, откуда сдерт код ? А автор пишет: "...пишите, задавайте вопросы."

Ок, добавляем таймер, чуть меняем последовательность, метод воспроизведения и частоту:
Код:
var i: integer = 0;

procedure TForm1.Image1Click(Sender: TObject);
begin
 TIMER1.Enabled:= TRUE
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 gen1.ResetAM;
 gen1.Prepare;
 gen1.Frequency:= 500;

 INC(I); if i> length(slovo) then begin
   timer1.Enabled:= false;
   i:= 0
 end;

 if slovo[i]= '.' then begin gen1.Duration:=100;  gen1.Play end;
 if slovo[i]= '-' then begin gen1.Duration:= timer1.Interval; gen1.Play end
end;
Вложения
Тип файла: zip mz_res.zip (236.5 Кб, 147 просмотров)
Тип файла: pdf Виртуальные приборы. Синтезатор азбуки Морзе (Минск).pdf (264.8 Кб, 93 просмотров)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 16.12.2011, 11:28   #9
Pasha_Sh
Форумчанин
 
Аватар для Pasha_Sh
 
Регистрация: 16.05.2010
Сообщений: 137
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
...а что ж вы TC не спросите автора утилиты, откуда сдерт код ? А автор пишет: "...пишите, задавайте вопросы."

Ок, добавляем таймер, чуть меняем последовательность, метод воспроизведения и частоту:
Код:
var i: integer = 0;

procedure TForm1.Image1Click(Sender: TObject);
begin
 TIMER1.Enabled:= TRUE
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 gen1.ResetAM;
 gen1.Prepare;
 gen1.Frequency:= 500;

 INC(I); if i> length(slovo) then begin
   timer1.Enabled:= false;
   i:= 0
 end;

 if slovo[i]= '.' then begin gen1.Duration:=100;  gen1.Play end;
 if slovo[i]= '-' then b]egin gen1.Duration:= timer1.Interval; gen1.Play end
end;
Код нашел через яндекс, ненужное себе я выкинул. Если это Ваш, то спасибо. Вам! И простите.
osu

Последний раз редактировалось Pasha_Sh; 16.12.2011 в 11:30.
Pasha_Sh вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Азбука Морзе на Паскале Intersap Помощь студентам 2 31.03.2012 17:20
[C++]Азбука Морзе, программа-телеграф persy Помощь студентам 1 02.12.2011 20:13
Морзе декодер(с++) jambas92 Помощь студентам 3 14.11.2010 11:32
С# азбука морзе tinka13 Помощь студентам 1 08.05.2010 01:09
Программа-кодировщик(или Морзе возвращается!) AsPeeD Помощь студентам 2 01.04.2008 18:41