• XSS.stack #1 – первый литературный журнал от юзеров форума

Программирование звуковых карт

CiSi

floppy-диск
Пользователь
Регистрация
14.04.2006
Сообщения
4
Реакции
0
Здравствуйте.

Немог бы кто нибудь мне подсказать, как запрограммировать на ТР
встроиную звукавую карту компьютера, что бы колонки издовали звук с
определёной частотой?????????????

Пожалуйсто помогите. :help:
 
CiSi
Можно уточнить, тебе именно динамик надо ??? или пещалку ??? пещалку можно запрограммировать примернно так...
Надо задать частоту ноты... после чего надо разбить ее на две части, на младшию и старшую... после чего тебе надо будет отправить в 42H пор сначала младшие биты частоты, и сразу после этого старшие биты частоты звука...
 
Тема такая.
Юзая чистый Паскаль ты ничего не накодишь.
Но Паскаль курит АСМ...

Так что ищи инфу по прерыванию int 80h на котором по моим сведениям висит драйвер Sound Blaster...
У меня в книге целая глава про это дело есть, но разбираться мне конкретно влом... :)
 
CiSi
Я сам АСМ не знаю. Я только книги умные читаю... :)
Факт в том, что Паскалем ты ниче круче пищалки не накодишь, да и то функцией beep() :)
 
Вообще идея токая: написать такую программу которая может издовать
буквы слова и т.п.Конечно если это возможно вообще и возможно
ли это на паскале.
Добавлено в [time]1145552398[/time]
Извините за ошибки. :bang:
 
ээээ
на Паскале ИМХО - вообще никак...
На С++ - самая простая реализация - записать кучу mp3 с буквами, слогами, связками, еще как-то...
Связать их в программе с конструкциями слова, в итоге все это дело собачится в одну большую функцию, на вход которой дается фраза...

+еще ко всей этой хренотени надо подключить либу-чтение-mp3, и я честно хз, будет ли это все работать...

И какова целесообразность данной проги, если то же самое умеет делать и Microsoft SAM и Magic Goody...

Только если в плане самообучения...
 
Вообще идея токая: написать такую программу которая может издовать
буквы слова и т.п.Конечно если это возможно вообще и возможно
ли это на паскале.
Cisi, здорово!
Namelles One, ему, короче, для робота надо, если я не ошибаюсь. Смысл вот в чем: запрограмировать на Паскале эту байду, чтоб потом в робота закинуть через USB, если не ошибаюсь, ну и робот мог произносить слова, звуки, пищать, наконец. :)
 
Ну ни шиша не понял...
Прога должна еще и ЮСБ курит? А причем тогда Паскаль?
Или робот проги на Паскале компилит и выполняет?
Тогда у него - своя документация, свои порты и т. д.
 
Вообщем могу скинуть простую прогу на С++ сделанную собственноручно, которая проигрывает какую-то мелодию(сильно не получилось -в нотной раскладке разобраться толком не смог).
Может тебе и поможет.....
 
Держи....все с комментами, причем заметь с подробными....разбирайся - может пригодиться

#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>

void main (void);
void tm_sound (int, int, int); //- функция генерации звука;
void tm_delay (int); //- функция для создания задержки;

// Массив частот (эквивалент нот в герцах) второй октавы
int iMel[ ] = {//Ми Ре До Ре Ми Ми Ми
330,294,262,294,330,330,330,
294,294,294,330,392,392,
330,294,262,294,330,330,330,
294,294,330,294,262,0
};

// Массив длительностей звуков в тиках
int iDel[ ] = {
5, 5, 5, 5, 5, 5, 10,
5, 5, 10, 5, 5, 10,
5, 5, 5, 5, 5, 5, 10,
5, 5, 5, 5, 20
};

int iOct; // коэффициента октавы
void main (void)
{
int i;
for(iOct=2;iOct<3;iOct++)
{
for ( i = 0; iMel != 0; i++ )
tm_sound ( iMel, iDel, iOct-1);
}
}
//Функция tm_sound генерирует звук с высотой тона и длительностью,
//независимой от тактовой частоты ЭВМ. Это достигнуто за счет того,
//что по умолчанию число тиков в секунду одинаково для всех
// компов. Частота тиков - приблизительно 18,2 Гц.

void tm_sound(int iFreq, int iTime, int Oct)
{
int iPer, //период звука;
iOct = Oct, //коэффициент октавы;
i; //дополнительный счетчик;

//обращение к порту регистра, который управляет таймером. Для этого необходио
//послать в командный регистр 43h байт, представляющий цепочку битов, которые
//выбирают канал (канал №2 таймера), статус чтения/записи, режим операции и
//форму представления чисел
outp(0x43, 0xb6);

// период импульсов, который измеряется числом тактов кварцевого генератора,
iPer = 1193180L / (pow(2,iOct)*iFreq); //1193180 Гц - частота кварцевого генератора;

//период импульсов загружается в регистр счетчика таймера и задает высоту звука: сначала младший, потом старший байт:
outp(0x42, iPer & 0x00ff); //обращение к порту канала №2 таймера
outp(0x42, ((iPer & 0xff00)>>8)); //обращение к порту канала №2 таймера

//включение динамика: сигнал от канала N 2 таймера подается на вход динамика:
//разрешить сигнал от часов: установить бит 0 порта 61 в единицу,
//включить динамик: установить бит 1 порта 61 в единицу.
outp(0x61, inp(0x61) | 3); //обращение к порту динамика

//выполняется задержка:
tm_delay(iTime);

//отключение динамика: устанавливаем бит 1 порта 61h в ноль;
outp(0x61, inp(0x61) & 0xfc);
}
// Функция задержки времени получает размер задержки в тиках;
// период тиков - приблизительно 1/18,2 сек; (точнее 65536/1193180).

void tm_delay ( int iTicks)
{

_asm {
push si //; - сохраняем в стеке содержимое регистра SI;
mov si,iTicks //; в регистр заносим необходимую задержку в тиках;
mov ah,0 //; - функция 00h - для чтения содержимого счетчика таймера;
int 1ah //;- прерывание для работы с таймером; в регистре DX прочитан младший байт
mov bx,dx //; счетчика таймера, этот байт занесен в регистр BX
add bx,si //; и в него добавлено число тиков, равное задержке;
}
delay_loop:
// с каждым тиком таймера содержимое счетчика с помощью прерывания BIOS INT 8h увеличивается
// на единицу
_asm {
int 1ah //;- прерывание для работы с таймером; в регистре DX прочитан младший байт
cmp dx, bx //; сравнивается с содержимым регистра BX;
jne delay_loop //; - если не равны – задержка продолжается;
pop si //; - иначе обновление регистра
}
}
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх