close

Вход

Забыли?

вход по аккаунту

?

FreeBASIC10

код для вставкиСкачать
Пособие для начинающих программировать на языке высокого уровня FreeBASIC. Работа состоит из нескольких глав. В главе 10 "В мире звуков" – продолжение пособия, которое будет интересно для учащихся школ, студентов институтов, а также преподавателей.
 1
Евгений Рыжов, инженер
Программирование на языке FreeBASIC
пособие для начинающих
Фрагмент 10. В мире звуков
Пособие для начинающих программировать на языке высокого уровня FreeBASIC.
Работа состоит из нескольких глав. В главе 9 "Методы оптимиза
ции" –
продолжение пособия, которое будет интересно для учащихся школ, студентов институтов, а также преподавателей.
Отверг я рано праздные забавы;
Науки, чуждые музыке, были
Постылы мне; упрямо и надменно
От них отрёкся я и предался
Одной музыке. Труден первый шаг
И скучен первый путь. Преодолел
Я ранние невзгоды. Ремесло
Поставил я подножием искусству;
2
Я сделался ремесленник: перстам
Придал послушную, сухую беглость
И верность уху. Звуки умертвив,
Музыку я разъял, как труп. Поверил
Я алгеброй гармонию. Т
огда
Уже дерзнул, в науке искушённый,
Предаться неге творческой мечты.
Я стал творить; но в тишине, но в тайне,
Не смея помышлять ещё о славе.
Александр Пушкин.
Трагедия
"
Моцарт
и
Сальери
" (1830)
Ка
др из фильма "Моцарт и Сальери"
(СССР, 1979, 3 серии по мотивам произведений А.С.Пушкина "Скупой рыцарь", "Моцарт и Сальери", "Каменный гость", "Пир во время чумы"). На фотографии:
Валерий Сергеевич Золотухин -
Моцарт
Иннокентий Михайлович Смоктуновский -
Сальери
Исследование души, охваченной страстью
, —
вот
что объединяет "Маленькие трагедии" и делает интересной каждую новую встречу с ними...
Сальери, учитель Бетховена и Шуберта, был хорошо известен во времена Пушкина как выдающийся композитор. Он славился своей принципиальностью в вопросах искусства. Позна
комившись с произведениями оперного реформатора Глюка, стремившегося превратить опору из "блестящего концерта в костюмах и декорациях" в подлинную драму и музыку ее –
"из собрания виртуозных эффектов", дающих 3
возможность певцам щегольнуть красотой и техник
ой голоса, -
в художественное выражение глубоких и серьёзных чувств и переживаний, -
молодой Сальери решительно изменил свою старую манеру и сделался последователем оперной реформы Глюка.
Справка:
Кристоф Виллибальд Глюк (Christoph Willibald Ritter von Gl
uck, 1714 —
1787) —
австрийский композитор классической эпохи, осуществивший во второй половине XVIII века реформу итальянской оперы
-
сериа (итал. орега seria —
серьезная опера) и французской лирической трагедии.
1.
Почтовый ящик.
Читательница EV задала
сразу два интересных вопроса:
Вопрос №1.
При сохранении брошюр с сайта в формате PDF возникают затруднения с использованием программ на компьютере. Можно ли создать хранилище текстов программ в формате "просто текст"?
Ответ №1.
Конечно, такое хранилище с
оздать можно, а многие уже и созда
ли
, подбирая интересные программы и сохраняя их в структурированном каталоге. Открою "большой секрет"
–
для того, чтобы преобразовать скаченный файл в формате PDF в формат DOC использую маленькую удобную программу "Total P
DF Converter", предназначенную для преобразования файлов в формате PDF в файлы в форматах Doc, Text, HTML или изображения (TIFF, JPEG). При этом программа преобразовывает как отдельный файл, так и множество PDF файлов одновременно. Язык интерфейса: Multila
nguage/Русский.
Вопрос №2.
Очень хорошие брошюры, содержат интересные программы на языке FreeBASIC, но все они реализуют численные (расчетные) методы. У Вас нет желания освежить их, например, музыкой?
Ответ №2.
Конечно, такое желание у меня есть, но, к со
жалению, нет возможности. Помните русскую пословицу: "Беда, коль пироги начнет печи сапожник, а сапоги точать пирожник"
? Программирование вывода
\
ввода звука на компьютере весьма сложная задача, решение которой требует достаточной подготовки. Но, поскольку обещал выполнять разумные пожелания читателей, попробую изложить азы в этой брошюре...
2.
Введение.
Если кого
-
то из читателей интересует не процесс программирования, а процесс создания музыки с помощью компьютера, рекомендую зайти на сайт:
http://scratch.sostradanie.org/index.html
Scratch
(по
-
русски произносится "Скрэтч") это язык программирования, при помощи которого можно легко создавать свои собственные интерактивные программы, анимацию, игры
, музыкальные приложения... Scratch развивается силами разработчиков из группы Lifelong Kindergarten Group, входящей в MIT Media Lab (Массачусетский Технологический Университет, США), при финансовой поддержке Национального Фонда по Науке США (National Scie
nce Foundation), компании Микрософт (Microsoft), Фонда Интел (Intel Foundation), Фонда МакАртура (MacArthur 4
Foundation), компании Гугл (Google), Иомега (Iomega) и Исследовательского Консорциума MIT Media Lab.
Не смотря на "детский" вид, этот язык программи
рования очень удобный и обладает множеством мощных и интересных возможностей! Для начала работы с программой Scratch, вам понадобится скачать ее по ссылке:
http://info.scratch.mit.edu/Scratch
_1.4_Download
и установить на свой компьютер... Желаю удачи!
Прочим же рекомендую приобрести
(например, путем скачивания из сети) две книжки для предварительной подготовки:
Руссинович М., Соломон Д.
Внутреннее устройство Microsoft Windows: Windows Serve
r 2003, Windows XP и Windows 2000. СПб.: 2005. 992 с., ил.
Книга посвящена внутреннему устройству и алгоритмам работы основных компонентов операционной системы Microsoft Windows -
Windows Server 2003, Windows XP и Windows 2000 -
и файловой системы NTFS. Де
тально рассмотрены системные механизмы: диспетчеризация ловушек и прерываний, DPC, APC, LPC, RPC, синхронизация, системные рабочие потоки, глобальные флаги и др. Также описываются все этапы загрузки операционной системы и завершения ее работы. В четвертом издании книги большое внимание уделяется глубокому анализу и устранению проблем, из
-
за которых происходит крах операционной системы или из
-
за которых ее не удается загрузить. Кроме того, рассматриваются детали реализации поддержки аппаратных платформ AMD x
64 и Intel IA. 64. Книга состоит из 14 глав, словаря терминов и предметного указателя.
Кинтцель Т.
Руководство программиста по работе со звуком (A Programmer's Guide to Sound). М.: 2000. 432 с, ил.
Книга содержит подробную информацию о хранении, обработке
и компрессии звуковых файлов. Разработчики, которые хотят использовать в своих приложениях возможность обработки звука, найдут в этой книге ответы на все интересующие их вопросы: применение низкоуровневых средств работы со звуком для Win32, Mac OS и Unix;
декомпрессия данных в форматах MPEG, IMA ADPCM; чтение файлов WAVE, VOC, AIFF и AU; воспроизведение файлов MIDI и MOD. В книге можно найти обзор смежных тем, в частности синтеза звучания музыкальных инструментов, восприятия звуков человеком, цифровой филь
трации и преобразований Фурье. Для каждого раздела приведены полные исходные тексты программ, иллюстрирующие все обсуждаемые принципы. Книга предназначена для звукоинженеров, желающих пополнить свои знания о программировании звука, а также для программисто
в, которым необходима информация о работе с аудиоматериалами. Некоторые разделы книги могут быть полезны специалистам, разрабатывающим программные средства обработки сигналов для геофизики, телеметрии, связи, систем автоматического управления и сбора данны
х.
2.1.
Человек –
Открытая система.
Гомеостаз
(одинаковый, подобный и стояние, неподвижность) —
саморегуляция, способность открытой системы сохранять постоянство своего внутреннего состояния посредством скоординированных реакций, направленных на поддер
жание динамического равновесия -
стремление системы воспроизводить себя, восстанавливать утраченное равновесие, преодолевать сопротивление внешней среды. 5
Изначально этот термин использовался для характеристики биологических организмов, в дальнейшем быстро распространился на способность динамически сохранять постоянство своего внутреннего состояния любой открытой системы. Представление о постоянстве внутренней среды было сформулировано Клодом Бернаром
(1813 —
1878) —
французский медик, исследователь процессов
внутренней секреции, основоположник эндокринологии. Член
-
корреспондент Санкт
-
Петербургской академии наук (с 1860 года). Прежде всего Бернар известен благодаря разработанной им концепции гомеостаза. Его формулировка "Постоянство внутренней среды —
залог св
ободной и независимой жизни" остаётся актуальной и в настоящее время.
В отношении любого параметра организмы делятся
на конформационные и регуляторные:
Регуляторные
организмы сохраняют параметр на постоянном уровне, независимо от того, что происходит в ср
еде.
Конформационные
организмы позволяют окружающей среде определять текущий уровень параметра.
Например, теплокровные животные сохраняют постоянную температуру тела, тогда как холоднокровные демонстрируют широкий диапазон температур. Попытки моделировани
я процессов гомеостаза привели к созданию в 1948 году "Гомеостата" —
самоорганизующейся системе, моделирующей способность живых организмов поддерживать некоторые величины (например, температуру тела) в физиологически допустимых границах. Английский учёный У.Р.Эшби, изобретатель гомеостата, сконструировал его в виде устройства, состоящего из четырёх магнитных систем, имеющих перекрёстные обратные связи. Ученого уже вспоминали в брошюре №7 "Аппроксимация. Сплайны". Уильям Росс Эшби
(William Ross Ashby; 1903 —
1972) —
английский психиатр, специалист по кибернетике, пионер в исследовании сложных систем.
Человек обладает рядом важных специализированных периферических образований -
органов чувств, обеспечивающих восприятие воздействующих на организм внешних раздра
жителей. К ним относятся органы зрения, слуха, обоняния, вкуса, осязания. Орган чувств —
специализированная периферическая анатомо
-
физиологическая система, обеспечивающая, благодаря своим рецепторам, получение и первичный анализ информации из окружающего м
ира и от других органов самого организма, то есть из внешней среды и внутренней среды организма.
Информация, получаемая головным мозгом человека от органов чувств, формирует восприятие человеком окружающего мира и самого себя. Человек получает информацию посредством пяти основных органов чувств:
1.
глаза (зрение),
2.
уши (слух),
3.
язык (вкус),
4.
нос (обоняние)
5.
кожа (осязание).
Существует мнение, что есть шестое чувство: вестибулярный аппарат (чувство равновесия и положения в пространстве). Дистантные органы чувств воспринимают раздражения на расстоянии (например, органы зрения, слуха, обоняния); другие органы (вкусовые и осязания) —
лишь при непосредственном контакте. Информация о раздражителях, воздействующих на рецепторы органов чувств человека, передается в 6
центр
альную нервную систему. Она анализирует поступающую информацию и идентифицирует её (возникают ощущения). Затем вырабатывается ответный сигнал, который передается по нервам в соответствующие органы организма. Если по каким
-
то причинам, один из органов перес
тает правильно работать, то гармония восприятия жизни нарушается и трудно гарантировать реакцию адекватную ситуации.
Исследования показали, что механизм человеческого восприятия за двадцать или тридцать миллионов лет эволюции приматов сложился так, что че
ловек 70
-
80% входных данных (но не информации) получает через зрение и 10
-
15% через слух. Причем визуальные данные на 80
-
85% "не осознаваемы" -
не являются решающей информацией для принятия решений. То есть, человек воспринимает глазами абсолютно все, но о
сознает (т.е. видит) очень немногое из того, что получает с помощью зрения. Ниже приведена таблица "скоростной" характеристики органов чувств:
Воспринимаемый сигнал
Скорость передачи данных
Зрительный (глаза)
3.0 –
3.4 бит/с
Слуховой (уши)
2.2 –
2.6 бит/
с
Вкусовой (язык)
1,2 –
1,4 бит/с
Обонятельный (нос)
1,4 –
1,6 бит/с
Тактильный (кожа)
1,8 –
3,0 бит/с
Получается так, что общую картину состояния окружающей среды удобнее наблюдать с помощью зрения, а для "оперативной работы" следует привлекать слух!
2.2.
Немного о Звуке.
Звук с физической точки зрения представляет собой распространение в виде упругих (продольно
-
поперечных) волн механических колебаний в твердой, жидкой или газообразной среде. В окружающей человека среде практически постоянно проис
ходят разнообразные механические процессы. Движение транспорта, людей, животных; различные метеорологические явления —
ветер, дождь, гром; работа различных механизмов —
все это в большей или меньшей степени вызывает колебания окружающих предметов и, следов
ательно, колебания воздуха. Даже если в хорошо изолированной от звука комнате находится только один человек, то он сам является причиной таких колебаний. Ведь при этом человек дышит, периодически меняет позу, по его сосудам пульсирует кровь. И эти столь не
значительные процессы тоже вызывают соответствующие колебательные процессы. Совершенно понятно, что очень многие из таких колебаний в окружающей среде для животных и человека имеют большое сигнальное значение
, то есть по существу несут в себе информацию о тех явлениях, которые и послужили причиной колебаний. Именно это и обусловило формирование и совершенствование в процессе эволюции специальных органов чувств, которые были бы способны улавливать такие колебания воздуха, то есть органов слуха. Благодаря орг
ану слуха, слуховому анализатору человек и ощущает как звук механические колебания окружающего его воздуха или, как это иногда бывает, колебания воды. Звуковые ощущения возможны также, если колеблющееся твердое тело находится в непосредственном контакте с головой, но это уже несколько своеобразная ситуация.
Как и любая волна, звук характеризуется амплитудой и спектром частот. Обычно человек слышит
колебания, передаваемые по воздуху, в диапазоне частот от 7
16
—
20 Гц до 15
—
20 кГц
. Звук ниже диапазона слышимост
и человека называют инфразвуком; выше: до 1 ГГц, —
ультразвуком, от 1 ГГц —
гиперзвуком.
Природа возникновения инфразвуковых колебаний (верхняя граница частотного диапазона 16 Гц, нижняя граница 0,001 Гц) такая же, как и у слышимого звука, поэтому инфразв
ук подчиняется тем же закономерностям, и для его описания используется такой же математический аппарат, как и для обычного слышимого звука (кроме понятий, связанных с уровнем звука). Инфразвук слабо поглощается средой, поэтому может распространяться на зна
чительные расстояния от источника. Из
-
за очень большой длины волны ярко выражена дифракция. Следует принимать меры защиты от звуковых колебаний с частотами, приводящими к возникновению резонанса: 5
-
30 Гц (резонанс головы), 19 Гц (резонанс глаз), 0.5
-
13 Гц (резонанс вестибулярного аппарата), 4
-
6 Гц (резонанс сердца), 2
-
3 Гц (резонанс желудка), 2
-
4 Гц (резонанс кишечника), 6
-
8 Гц (резонанс почек), 2
-
5 Гц (резонанс рук).
2.3.
Немного о Музыке.
Музыка
(от греч. муза) —
искусство, средством воплощения художе
ственных образов для которого являются звук и тишина, особым образом организованные во времени.
О музыкальном искусстве говорят как о "
наиболее чувственном среди искусств
". Поэзию или живопись, к примеру, невозможно воспринимать на уровне физиологических реакций, музыка может не только восприниматься, но и воспроизводиться без включения интеллекта, и горизонт такого слушания и музицирования достаточно широк (медитативная практика отключения рационального мышления посредством определённых напевов, танцы в д
искотеке, пение больных с нарушениями речи и расстройством логического аппарата). Нейрофизиологическое воздействие музыки издавна использовалось в медицине. В то же время, по традиции, идущей издревле, музыку признают наиболее обобщённым, абстрактным искус
ством —
художественным эквивалентом философии и математики. Кардинал эпохи Возрождения Николай Кузанский
видел в музыке инструмент создания Вселенной
. У человека прослушивание музыки может сопровождаться чувством эйфории, вызванным высвобождением дофамина.
..
В теории музыки основополагающим "изобретением" можно признать "гамму" (
Scala
по
-
итальянски, G
amme
—
по
-
французски, Tonleiter
—
по
-
немецки) —
звукоряд неопределённой протяжённости, соседние ступени которого отстают друг от друга на целый тон или полуто
н. Под гаммой в школьной исполнительской практике подразумевают восходящие либо нисходящие октавные звукоряды. Сначала гаммы делятся на две большие группы: мажорные и минорные.
Мажорные гаммы
строятся по принципу: два тона, полутон, три тона, полутон. Сам
ая простая мажорная гамма для фортепиано —
до мажор, для скрипки —
ре мажор.
Минорные гаммы
строятся по принципу: тон, полутон, два тона, полутон, два тона. Самая простая минорная гамма для фортепиано —
ля минор (a moll).
Название "гамма" происходит от гр
еческой буквы гамма, обозначавшей нижайшую ноту диатонического звукоряда, простиравшегося от "d" в большой октаве 8
до "е" во второй октаве Гвидо Аретинского. Гвидо д’Ареццо, Гвидо Аретинский
(итал. Guido d'Arezzo, лат. Guido Aretinus, 991 —
1050) —
бенедикт
инский монах, итальянский теоретик музыки, один из крупнейших в эпоху Средних веков. В честь Гвидо д’Ареццо назван кратер на Меркурии.
Гвидо д’Ареццо впервые ввёл названия шести нот. Общепринятая сейчас нота "до" у него называлась "ут". За названия нот б
ыли взяты первые слоги строк Гимна святому Иоанну (покровителя певцов), который пелся в восходящей октаве:
UT queant laxis
(чтобы слуги твои)
REsonare fibris
(голосами своими)
MIra gestorum
(смогли воспеть)
FAmuli tuorum
, (чудные деяния твои)
SOLve poluti
(очисти грех)
LAbii reatum
, (с наших опороченных уст)
S
a
ncte Ioannes
. (Святой Иоанн) Мелодия каждой строки текста начинается на одну ступень выше предыдущей. Совсем недавно была возможность прослушать Гимн
по ссылке (простите, если ссылка уже "убита"):
http://www.youtube.com/watch?v=rUqzxEOEhnY
Ut queant laxis (Arezzoi GUIDO)
Текст гимна был сочинён около 770
-
го года Павлом Диаконом
.
Ноту "ut" заменили на "do" из
-
за неудобства пения на первом с
логе. Приписывается эта замена некоему Дж. Дони
, который назвал ее в честь Господа (Dominus). Седьмая нота не входила в средневековый шестиступенчатый звукоряд и при переходе на современную октавную систему была названа "si" по первым буквам имени Sancte I
oannes из последней строчки гимна.
"Синтетическое" понятие "Мультимедиа" (Multimedia) означает взаимодействие видео
-
и аудио
-
эффектов под управлением интерактивного программного обеспечения с использованием современных технических и программных средств. Технологии объединяют текст, звук, графику, фото, видео в одном цифровом представлении. Музыкальное программирование —
процесс создания музыки с помощью электронных устройств, зачастую секвенсоров или компьютерных программ. Программирование используется по
чти во всех направлениях электронной музыки.
9
3.
Программирование звуковых эффектов.
Но начнем с цитирования указанной выше книги М.Руссинович, Д.Соломон
. Открываем страницу 510
: Глава 8. Защита.
Защита конфиденциальных данных от несанкционированного доступа очень важна в любой среде, где множество пользователей обращается к одним и тем же физическим или сетевым ресурсам. У операционной системы, как и у отдельных пользователей, должна быть возможность защиты файлов, памяти и конфигурационных параметров
от нежелательного просмотра и внесения изменений. Безопасность операционной системы обеспечивается такими очевидными механизмами, как учетные записи, пароли и защита файлов. Но она требует и менее очевидных механизмов –
защиты операционной системы от повр
еждения, запрета непривилегированным пользователям определенных действий (например, перезагрузки компьютера), предотвращения неблагоприятного воздействия программ одних пользователей на программы других пользователей или на операционную систему.
Отсюда мо
жно сделать неутешительный вывод
–
работать со звуком будет сложнее, чем в прикладных программах QBasic под MS
-
DOS! Тот же вывод напрашивается и в отношении использования портов... Для работы со звуковым адаптером в среде операционной системы Windows нет в
озможности программировать на уровне портов ввода/вывода, прерываний и каналов прямого доступа. Весь необходимый интерфейс предоставляется разрабатываемой программе (приложению) DLL
-
библиотекой, которая называется mmsystem.dll
. Эту библиотеку можно даже ра
ссматривать как расширение системы Windows для обеспечения работы с мультимедиа. Совместно с компилятором FreeBASIC успешно используются также библиотеки BASS, FMOD,
а так же написанная на самом FreeBasic библиотека FBSound.
Их нетрудно найти в сети и уста
новить в системе.
В работающей системе библиотека mmsystem
располагается в системном каталоге:
C:
\
WINDOWS
\
system32
\
mmsystem.dll
(в этом же каталоге находится и библиотека kernel32.dll)
В этой библиотеке определены функции двух уровней:
функции низкого ур
овня
(Low
-
Level Functions), работающие непосредственно с драйверами устройств ввода/вывода, такими, как драйверы звукового адаптера, джойстика или устройства ввода/вывода MIDI;
функции высокого уровня
, представляющих собой интерфейс управления средой MCI (
Media Control Interface), работающие с драйверами устройств MCI, таким как драйверы устройств чтения компакт
-
дисков.
Имеется четыре типа драйверов звуковых устройств:
драйвер для ввода звука (Waveform Input Driver);
драйвер для вывода звука (Waveform Outp
ut Driver);
драйвер для ввода музыки в стандарте MIDI (MIDI Input Driver);
драйвер для вывода музыки в стандарте MIDI (MIDI Output Driver).
Все эти драйверы поставляются вместе со звуковым адаптером и устанавливаются после установки операционной системы Wi
ndows.
10
3.1.
Имитация функции Beep.
Поскольку IBM PC проектировался не как мультимедийная машина
, а инструмент для решения научных и деловых задач, звуковая карта на нём не была предусмотрена и даже не запланирована. Единственный звук, который издавал к
омпьютер, был звук встроенного динамика
, сообщавший о неисправностях. Но и теперь, в самом простейшем случае, приложение должно уметь выдавать короткие звуковые сигналы при появлении каких
-
либо непредвиденных событий для привлечения внимания пользователя. Эту функцию в прикладных программах QBasic под MS
-
DOS выполнял вызов "Beep". В рассматриваемом случае для этого можно воспользоваться функцией MessageBeep(). Подключение осуществляется с помощью заголовочного файла:
#Include "win/winuser.bi"
Функция имеет один параметр –
тип сигнала:
declare function MessageBeep (byval as UINT) as BOOL
Пример использования приведен ниже.
' P R O G R A M "Sound_Beep1"
' 19.01.2013
'
---------------------------------------
----------------------
' Имитация функции Beep через функцию MessageBeep
'
-------------------------------------------------------------
' Один из простейших случаев использования библиотеки
#Include "windows.bi" ' содержит
#include once "win/winuse
r.bi"
' Константы определены в заголовочном файле winuser.bi
' по умолчанию принимается сигнал MB_OK
Print " Start"
MessageBeep(MB_ICONASTERISK)
Print " Pause"
Sleep 2000 ' пауза
2 секунды
MessageBeep(MB_ICONERROR)
Print " Stop"
Sleep
Для имитации функции Beep можно воспользоваться функцией PlaySound() из упомянутой ранее библиотеки mmsystem:
function PlaySound(pszSound As LPCWSTR, hmod As HMODULE, fdwSound As DWORD) As BOOL
Параметры функции:
pszSound
–
Строка символов длиной до 256 символов (включ
ая нулевой символ), которая задает воспроизводимые звуки. Если этот параметр равен NULL, вывод звуков прекращается. Три флаги в fdwSound (SND_ALIAS, SND_FILENAME, и SND_RESOURCE) определяют интерпретацию параметра: имя системных событий, имя файла или иден
тификатор ресурса.
hmod
–
Указание на исполняемый файл, который содержит загружаемый ресурс. Этот параметр должен быть NULL, если в fdwSound указан флаг SND_RESOURCE.
fdwSound
–
Флаг для воспроизведения звука. В нашем случае SND_FILENAME указывает, что Psz
Sound содержит имя файла. Если файл не может 11
быть найден, функция воспроизводит звук по умолчанию (если флаг SND_NODEFAULT установлен).
Функция возвращает признак TRUE в случае успешного завершения и FALSE в противном случае. Конечно, при выводе из WAV
-
фа
йла желательно проверить его существование. В приведенной ниже программе это сделано функцией FileExists().
' P R O G R A M "Sound_Beep2"
' 19.01.2013
'
------------------------------------------------
-------------
' Имитация функции Beep через функцию PlaySound
'
-------------------------------------------------------------
' Один из простейших случаев использования библиотеки
#Include "windows.bi"
#Include "win/mmsystem.bi"
#include "file.bi"
D
im As Bool ERRORCODE
Dim As Integer FEC
Print " Start"
FEC = FileExists("c:
\
windows
\
media
\
tada.wav")
Print " FEC = "; FEC ' -
1 -
если существует, 0 -
если нет
ERRORCODE = PlaySound("c:
\
windows
\
media
\
tada.wav", NULL, _
SND_FILENAME)
If ERRORCODE = TRUE Then Print " Success"
If ERRORCODE = FALSE Then Print " Failure"
Print " Stop"
Sleep
3.2.
Wave File Format -
формат
звукового
файла
WAV.
WAVE
-
файлы изначально использовался в системе Windows для сохранения оцифрованных аудиоданных.
Это самый известный и широко поддерживаемый формат благодаря популярности платформы Windows и большому количеству написанных для неё программ. Почти любая современная программа, работающая со звуком, может прочитать или записать формат WAV, поэтому этот ф
ормат очень интересен для разработчиков программного обеспечения. WAVE
-
файл
-
это частный случай файла в формате файла
-
контейнера RIFF
(Resource Interchange File Format) для хранения потоковых мультимедиа
-
данных (видео, аудио, возможно текст). Наиболее изв
естными форматами, использующими RIFF в качестве контейнера, являются: AVI (видео), WAV (аудио), RMI (MIDI
-
треки). Каждый RIFF
-
файл начинается с группы символов RIFF. После этих символов идут 4 байта, в которых записана длина файла, а за ними -
код типа. Ф
ормат разработан в 1991 году компаниями Microsoft и IBM.
WAV
-
файл использует стандартную RIFF
-
структуру, которая группирует содержимое файла из отдельных секций (chunks)
-
формат выборок аудиоданных, аудиоданные, и т.п. Каждая секция имеет свой отдельный заголовок секции и отдельные данные секции. Заголовок секции указывает на тип секции и количество содержащихся в секции байт. Такой принцип организации позволяет программам анализировать только необходимые секции, пропуская остальные секции, которые не 12
изв
естны или которые не требуют обработки. Существует довольно много типов секций, заданных для файлов WAV, но большинство WAV
-
файлов содержат только две из них -
секцию формата ("fmt")
и секцию данных ("data")
. Это именно те секции, которые необходимы для оп
исания формата выборок аудиоданных, и для хранения самих аудиоданных. Хотя официальная спецификация не задает жесткий порядок следования секций, наилучшей практикой будет размещение секции формата перед секцией данных. Многие программы ожидают именно такой
порядок секций, и он наиболее разумен для передачи аудиоданных через медленные, последовательные источники наподобие Интернет. Иначе если формат придет после данных, то перед стартом воспроизведения необходимо считать и запомнить все аудиоданные, только п
осле получения формата запускать воспроизведение.
Секция формата содержит информацию о том, как сохранены аудиоданные и как они должны воспроизводиться. Информация включает в себя тип используемой компрессии, количество каналов, скорость выдачи выборок (s
ample rate), количество бит в выборке (bits per sample) и другие атрибуты. Секция данных Wave (Wave Data Chunk) содержит данные цифровых выборок аудиосигнала, которые можно декодировать с использованием формата и метода компрессии, указанных в секции форма
та Wave (Wave Format Chunk). Если код компрессии 1 (несжатый PCM, Pulse Code Modulation), то данные представлены в виде сырых, непреобразованных (raw) величин выборок. При оцифровке непрерывный сигнал заменяется "ступенчатым". Этот вид обусловлен тем, что компьютер может воспроизводить в любой короткий промежуток времени звук определенной амплитуды (громкости) и этот короткий момент далеко не бесконечно короткий. Продолжительность этого промежутка и определяет частота дискретизации. Например, у нас файл с ч
астотой дискретизации 44.1 kHz, это значит, что тот короткий промежуток времени равен 1/44100 секунды (следует из размерности величины Гц = 1/с). Современные звуковые карты поддерживают частоту дискретизации до 192 kHz.
В компьютере основные частоты дискр
етизации (11025, 22050 и 44100 Гц) в сочетаниях с различным количеством каналов (1 или 2) и различной разрядностью отсчета (8 или 16) при способе кодирования PCM образуют 12 типовых форматов. Частота 11025 Гц (полоса звуковых частот примерно до 5 кГц) приб
лизительно соответствует качеству телефонного сигнала, частота 22050 Гц (полоса до 10 кГц) —
среднего радиоприемника, частота 44100 Гц (полоса до 20 кГц) —
качественной звуковой аппаратуре.
Теперь, что касается амплитуды (громкости звука в коротком промеж
утке времени). От нее, я бы сказал, зависит точность звука. Амплитуда выражается числом, занимаемым в памяти (файле) 8, 16, 24, 32 бит (теоретически можно и больше). Как известно, 8 бит = 1 байту, следовательно, какая
-
то одна амплитуда в какой
-
то короткий промежуток времени в памяти (файле) может занимать 1, 2, 3, 4 байта соответственно. Таким образом, чем больше число занимает места в памяти (файле), тем больше диапазон значений для этого числа, а значит и для амплитуды.
Все эти премудрости станут понятне
е, если покопаться с реальными звуковыми файлами. Ниже приведена программа, единственная цель которой поближе познакомиться с WAV
-
форматом.
13
' P R O G R A M "Multimedia_IO1"
' 19.01.2013
'
------------
-------------------------------------------------
' Просмотр WAVE
-
файла для знакомства с его структурой
'
-------------------------------------------------------------
' Средства Win32 API не используются
#Include "file.bi"
Dim As Integer FEC, FOP
D
im As String FStr, SStr
Dim As Integer LFile, LFStr, NFStr, NSStr
Dim As String File = "c:
\
windows
\
media
\
tada.wav"
'Информация о файле tada.wav:
'Размер файла 171100
'Качество звука 705 кбит/с
'Размер аудио образца 16 бит
'Каналы 2(стерео)
'Частота дискрет
изации 22 кГц
'Формат аудио PCM
Open "CON" For Output As #2
'Open "Multimedia.res" For Outpup As #2
Print #2, " Start"
' Проверка существования файла
FEC = FileExists(File)
If FEC = -
1 Then Print #2, " File exists"
If FEC = 0 Then Print #2, " File not fou
nd!"
' Открытие файла в режие прямого доступа
FOP = Open(File For Random Access As #1)
If FOP = 0 Then Print #2, " Opened successfully"
If FOP <> 0 Then Print #2, " Error opening!"
' Определение размера файла в байтах
LFile = Lof(1) ' Определение длина по
номеру файла
'LFile = FileLen("c:
\
windows
\
media
\
tada.wav") ' длина
по
имени
Print #2, " Length of the file = "; LFile
' Анализ первой записи файла
NFStr = 1 ' Номер записи
Seek #1, NFStr ' Установить указатель на запись
Line Input #1,
FStr
LFStr = Len(Fstr)
Print #2, " Record Length = "; LFStr
SStr = Mid(FStr, 1, 4) ' Подстрока
с
1 позиции
4 символа
Print #2, " Substring 1 = "; SStr
SStr = Mid(FStr, 9, 4) ' Подстрока
с
9 позиции
4 символа
Print #2, " Substring 2 = "; SStr
NSStr = InS
tr(FStr, "data") ' регистр
имеет
значение
!
Print #2, " Position of the substring"; NSStr ' Номер
позиции
' Определение количества записей в файле
NFStr = 1 ' Начать с записи номер 1
Do ' Выполнять команды
Seek #1, NFStr ' Установить указатель на запись
If Eof(1) Then Exit Do ' Выйти
из
цикла
NFStr = NFStr + 1 ' Увеличить номер записи
Loop ' Вернуться
14
Print #2, " First free Record = "; NFStr
Seek #1, NFStr -
1 ' Последняя существующая запись
Line Input #1, FStr ' Прочитать последнюю запись
Print #2, FStr ' Вот такая последняя запись
Close #1 ' Закрыть файл ввода
Print #2, " Stop"
Close #2 ' Закрыть
файл
вывода
Sleep
Для тех, кто продолжит изучение этой
темы будет полезна таблица:
Смещение
от первого байта
Название и описание поля
0..3
chunkId
Содержит символы "RIFF" в ASCII кодировке (0x52494646 в big
-
endian представлении). Является началом RIFF
-
цепочки.
4..7
chunkSize
Это оставшийся размер цепочки
, начиная с этой позиции. Иначе говоря, это размер файла -
8, то есть, исключены поля chunkId и chunkSize.
8..11
format
Содержит символы "WAVE" (0x57415645 в big
-
endian представлении)
12..15
subchunk1Id
Содержит символы "fmt " (0x666d7420 в big
-
endian пр
едставлении)
16..19
subchunk1Size
16 для формата PCM. Это оставшийся размер подцепочки, начиная с этой позиции.
20..21
audioFormat
Аудио формат, полный список можно получить здесь. Для PCM = 1 (т.е. Линейное квантование). Значения, отличающиеся от 1, обо
значают некоторый формат сжатия.
22..23
numChannels
Количество каналов. Моно = 1, Стерео = 2 и т.д.
24..27
sampleRate
Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
28..31
byteRate
Количество байт, переданных за секунду воспроизведения.
32..33
blockAl
ign
Количество байт для одного сэмпла, включая все каналы.
34..35
bitsPerSample
Количество бит в сэмпле. Так называемая "глубина" или точность звучания. 8 бит, 16 бит и т.д.
36..39
subchunk2Id
Содержит символы "data" (0x64617461 в big
-
endian представлени
и)
40..43
subchunk2Size
Количество байт в области данных.
44..xx
data
Непосредственно WAV
-
данные -
Общий объем до 2Гбайт.
К сожалению, неудачей закончилась попытка загрузить и проиграть из памяти уже знакомый WAV
-
фал. "Экспериментальная" программа на
языке FreeBASIC приведена ниже.
15
' P R O G R A M "Multimedia_IO2"
' 19.01.2013
'
-------------------------------------------------------------
' Записать WAVE
-
файл в память и проиграть
'
----------
---------------------------------------------------
' Средства Win32 API не используются
#Include "windows.bi"
#Include "win/mmsystem.bi"
#Include "file.bi"
Dim As Integer FOP, LFile, NFStr, MFStr, LFStr(2000), SLFStr, LWaSo Dim As String FStr, WaveSo
und
Dim As String File = "c:
\
windows
\
media
\
tada.wav"
Open "CON" For Output As #2
'Open "Multimedia.res" For Output As #2
Print #2, " Start"
FOP = Open(File For Random Access As #1)
If FOP = 0 Then Print #2, " Opened successfully"
If FOP <> 0 Then Print #2
, " Error opening!"
LFile = FileLen("c:
\
windows
\
media
\
tada.wav")
Print #2, " Length of the File = "; LFile
NFStr = 1: SLFStr = 0 ' Начало -
сумма длин строк
Do
Seek #1, NFStr ' Установить указатель
If Eof(1) Then Exit Do ' Выход если файл закончилс
я
Line Input #1, FStr ' Читать очередную запись
WaveSound = WaveSound + FStr
LFStr(NFStr) = Len(Fstr)
NFStr = NFStr + 1
Loop
MFStr = NFStr -
1
Print #2, " Max number of Record = "; MFStr
SLFStr = 0
For NFStr = 1 To MFStr
SLFStr = SLFStr + LFStr(NFStr)
N
ext NFStr
Print #2, " Sum of Lengths = "; SLFStr
' На удивление большой суммарный объем дли записей
Close #1
' Проигрывание звукового фрагмента из памяти
PlaySound(WaveSound, NULL, SND_MEMORY)
' Слышно громкий треск (белый шум?) и тихая "музыка"
LWaSo = Le
n(WaveSound)
Print #2, " Length of the Variable = "; LWaSo Print #2, " Stop"
Close #2
Sleep
Уже знакомую музыку "Та
-
Да!"
еле слышно за сильным треском (отдаленно напоминающий слегка обрезанный по частоте "белый шум"). И не могу объяснить удивительный раз
мер суммы длин всех записей музыкального файла. Вот
, что
выводит
программа
:
16
' Start
' Opened successfully
' Length of the File = 171100
' Max number of Record = 1337
' Sum of Lengths = 367855
' Length of the Variable = 367855
' Stop
Конечно, нужно раз
обраться, но поджимает объем брошюры и отведенное время. Думаю, совместными усилиями мы победим эту проблему. Буду благодарен за помощь в этом деле...
3.3.
Подсистема мультимедийного файлового ввода/вывода.
Наряду с базовой подсистемой файлового ввода/
вывода
, представленной функциями CreateFile, ReadFile, WriteFile и т.п., в Windows существует подсистема мультимедийного (звукового, видео и другого подобного) файлового ввода/вывода MMIO (Multimedia Input/Output),
которая позволяет удобно и эффективно раб
отать со звуковыми и видеофайлами, а также упрощает работу с файлами, размещенными в оперативной памяти (memory files). Нужно было бы потренироваться в использовании функций этой подсистемы после фиаско с программой "Multimedia_IO2.bas" из предыдущего разд
ела, но... только азы...
Все функции интерфейса имеют имена с префиксом mmio. Большая часть функций получает в качестве основного параметра "ключ" (типа HANDLE) открытого файла. Такие функции имеют в прототипе параметр File типа HMMIO... Для каждого откры
того файла подсистема MMIO поддерживает информационную структуру, описывающую режимы работы с файлом и его параметры. Базовая информационная структура находится внутри самой подсистемы MMIO, приложение может поддерживать собственную локальную копию типа MM
IOINFO в своей собственной области памяти. Некоторые функции MMIO требуют от приложения указания локальной структуры MMIOINFO, и управляют полями структур таким образом, чтобы отразить операции, выполненные как приложением, так и самой подсистемой MMIO. Пр
иложение также может непосредственно запросить копию системной структуры функцией mmioGetInfo, и модифицировать системную структуру функцией mmioSetInfo.
Перечень базовых функций:
mmioStringToFOURCC -
Преобразование строки ASCIZ в код FOURCC;
mmioOpen -
О
ткрытие или опрос файла;
mmioClose -
Закрытие файла;
mmioRename -
Переименование файла;
mmioRead -
Чтение из файла;
mmioWrite -
Запись в файл;
mmioSeek -
Позиционирование по файлу.
Перечень функций управления буферизацией:
mmioGetInfo -
Запрос информацион
ной структуры файла;
mmioSetInfo -
Модификация информационной структуры файла;
mmioSetBuffer -
Установка буфера для файла;
17
mmioAdvance -
Продвижение по файлу;
mmioFlush -
Принудительная запись буфера в файл.
Перечень функций работы с форматом RIFF:
mmioCr
eateChunk -
Создание раздела;
mmioAscend -
Выход из раздела;
mmioDescend -
Вход в раздел.
Перечень остальных функций интерфейса:
mmioSendMessage -
Посылка произвольного сообщения процедуре обмена;
mmioInstallIOProc -
Установка процедуры обмена;
IOProc -
П
рототип процедуры обмена.
Короче, надо смелее пробовать –
в сети много всякой мути...
3.4.
Цифровой интерфейс музыкальных инструментов.
Буквально несколько слов о цифровом интерфейсе музыкальных инструментов (Musical Instrument Digital Interface)
. Ста
ндарт MIDI –
это стандарт "интерфейса" цифровой звукозаписи для обмена данными между электронными музыкальными инструментами. Интерфейс позволяет единообразно кодировать в цифровой форме такие данные как нажатие клавиш, настройку громкости и других акустич
еских параметров, выбор тембра, темпа, тональности и др., с точной привязкой во времени. На самом деле протокол MIDI не конкретизирует состав взаимодействующих устройств и не требует наличия живого исполнителя. Суть протокола в том, что в некой системе, со
стоящей из нескольких устройств, одно устройство (мастер) генерирует команды управления, а все другие устройства (подчиненные) выполняют эти команды. В системе кодировок присутствует множество свободных команд, которые производители, программисты и пользов
атели могут использовать по своему усмотрению. Поэтому интерфейс MIDI позволяет, помимо исполнения музыки, синхронизировать управление другим оборудованием,
например, осветительным, пиротехническим и т.п.
Последовательность MIDI
-
команд может быть записана
на любой цифровой носитель в виде файла, передана по любым каналам связи. Воспроизводящее устройство или программа называется синтезатором (секвенсором от sequence -
последовательность) MIDI и фактически является автоматическим музыкальным инструментом. Т
аким образом, секвенсор по своим функциям аналогичен магнитофону (и чаще всего оборудуется управлением магнитофонного типа), за исключением того, что он записывает не звуковые данные, а программные команды для различных MIDI
-
устройств. В октябре 1982 года была закончена предварительная спецификация MIDI. В декабре вышел Sequential Circuits Prophet 600 —
первый синтезатор, оборудованный MIDI
-
интерфейсом.
Для управления одним устройством с другого был разработан язык команд, понятный им обоим. То есть состав
ить список команд, обозначить каждую команду своим кодом и договориться: если устройство понимает команду, оно должно на нее реагировать так
-
то и так
-
то, если не понимает —
игнорировать. Язык MIDI состоит только из команд управления и параметров этих коман
д
. Ничего другого по MIDI
-
кабелю не передается. Сообщения логично разделить на два основных типа: одни 18
управляют звукообразованием, то есть говорят, например, какую ноту и как громко играть, вторые выполняют служебные функции, вроде изменения настроек тон
-
генератора и синхронизации. Поскольку извлечение звуков происходит в MIDI на определенном канале, сообщения первого типа называются сообщениями канала (Channel Messages). Сообщения второго типа называются системными (System Messages).
MIDI
-
сообщения делят
ся на короткие
(1
-
3 байта) и длинные (более трех байтов). Длинные
представляют собой особый вид сообщений —
системные исключительные (System Exclusive, или SysEx), которые имеют переменную длину. Поскольку MIDI
-
протокол создавался для связи между устройств
ами, которые могут быть соединены и разъединены в любой момент, структура сообщений сделана самосинхронизирующейся, чтобы приемное устройство всегда могло выделить начало сообщения. Первый байт каждого сообщения, называемый также байтом состояния (status b
yte) имеет установленный (единица) старший бит, во всех остальных байтах (байты данных, data bytes) старший бит сброшен (нуль). MIDI
-
поток состоит из разнородных сообщений, каждое из которых определяет какое
-
либо событие. Поток сообщений обычно неравномере
н, поскольку большинство событий привязано к определенным моментам времени.
Стандарт General MIDI разработан ассоциацией MIDI
-
производителей (MMA) в 1991 году в целях обеспечения частичной совместимости выпускаемых MIDI
-
устройств и облегчения переноса пар
титур между устройствами различных производителей. Устройство, совместимое с GM Level 1, должно удовлетворять следующим требованиям:
полифония не менее 24 голосов;
наличие 128 мелодических и 47 ударных тембров;
раздельный выбор тембров по всем 16 MIDI
-
кан
алам;
поддержка специальных канальных контроллеров 121 и 123;
выделение канала 10 для ударных тембров, остальных каналов -
для мелодических тембров.
Устройства воспроизведения MIDI хранят набор звуков, позволяющих имитировать различные музыкальные инструм
енты. Стандарт определяет набор из 128 инструментов
с номерами от 0 до 127 (хотя MIDI
-
устройства могут назначать этим номерам произвольные инструменты, большинство систем следуют стандарту). Кроме большого числа музыкальных инструментов, набор содержит так
же специальные звуки (например, хлопок в ладоши и выстрел). На каждом из 16 MIDI
-
каналов в данный момент времени может играть только один инструмент, при этом некоторые инструменты могут исполнять несколько нот одновременно (полифония). Общее число одновре
менно исполняемых нот ограничивается числом голосов (voices), поддерживаемых устройством. У современных звуковых карт число голосов варьируется от 32 до 128 (в зависимости от класса карты). Программные MIDI
-
синтезаторы могут поддерживать еще больше голосов
. Следует учесть, что при воспроизведении богатых звуков некоторые устройства используют такой прием как наложение слоев (layering). В этом случае для воспроизведения одной ноты может потребоваться несколько голосов, и максимальное число одновременно испол
няемых нот может уменьшиться. В MIDI используется равномерно
-
темперированный строй и 128 нот
различной высоты (с номерами от 0 до 127). Частота нот задается с помощью номера. Нота с номером 60 —
всегда "До" первой октавы (частота 261 Гц).
19
Полный частотный
диапазон, покрываемый таким образом, превышает 10 октав (от 8 Гц до 12543 Гц), что более чем достаточно. С номерами нот работать неудобно, но и музыкальный способ наименования (вроде d3 —
Ре третьей октавы или Cis1 —
До диез контроктавы) не подходит; еще и потому, что в разных странах применяются разные обозначения.
Давайте лучше посмотрим на текст программы, которую я написал для этой брошюры, и решим, что делать дальше с музыкальными эффектами...
' P R O G R A M "Midi_Out0"
' 1
9
.0
2
.201
3
'
-------------------------------------------------------------
' Вывод одной ноты на внешние колонки (mmsystem)
'
-------------------------------------------------------------
'
' Камертон издае
т звук ноты "ля" 1
-
октавы, частота 440 Гц
'
#Lang "FB" ' режим совместимости с FreeBASIC
#Include "windows.bi" ' подключение
файла
windows.bi
#Include once "win
\
mmsystem.bi"
'
Dim MmVers As UInteger ' Установленная версия библиотеки
Dim NumDe
v As UInteger
Dim DevId As UInteger
Dim CallBack As Double
Dim Inst As Double
Dim Flag As Double
Dim midiRES As Integer
Dim midiout As hmidiout
Dim T As Long
' Событие Статус
-
байт Байты данных:
Dim As Ubyte Note_Of, Note_On, Note_Kp, Note_Cc, Note_Pc, Note
_Cp
20
' Номер канала в системе от 0 до 15 (здесь = 0)
Note_Of = &h80
' завершить воспроизведение ноты
'0nnnnnnn (номер ноты); 0vvvvvvv (скорость нажатия клавиши).
Note_On = &h90
' начать воспроизведение ноты
'0nnnnnnn (номер ноты); 0vvvvvvv (скорость наж
атия клавиши).
Note_Kp = &hA0
' изменить интенсивность
'0nnnnnnn (номер ноты); 0vvvvvvv (новая скорость нажатия клавиши).
Note_Cc = &hB0
' изменить положение регулятора
'0ссссссс (номер регулятора); 0vvvvvvv (значение)
Note_Pc = &hC0
' выбрать инстру
мент
'0ppppppp номер инструмента
Note_Cp = &hD0
' изменить интенсивность на канале
'0ccccccc (значение интенсивности)
'
' Установка устройства аудиовывода ' Вывод данных на экран консоли. Обратите внимание:
' приведеные ниже операторы Open работают разл
ично! Open CONS For Output Encoding "ascii" As #2
'Open "CON" For Output As #2
' Вывод данных в файл на диске:
'Open "Midi_Out.res" For Output Encoding "ascii" As #2
Print #2, " Current Date: "; Date
Print #2, " Current Time: "; Time
'
Union aUnion
dw As UInteger ' 1 элемент
x 4 байта
by(1 To 3) As Ubyte ' 3 элемента
x 1 байт
End Union
Dim midiMsg As aUnion
'
' Запрос версии системы MmVers = 778
MmVers = mmsystemGetVersion()
Print #2, " Current version of the MultiMedia Library = "; MmVers
Pr
int #2, " HiMmVers = "; HiByte(MmVers); " LoMmVers = "; LoByte(MmVers)
' Запрос количества устройств в системе NumDev = 1
NumDev = midiOutGetNumDevs()
Print #2, " NumDev = "; NumDev
midiOut = 0: DevId = 0: CallBack = 0: Inst = 0: Flag = 0
' Открытие подсис
темы -
возвращает идентификатор -
ключ (handle)
midiRES = midiOutOpen(@midiOut, DevId, CallBack, Inst, Flag)
Print #2, " midiRES_Open = "; midiRES
midiMsg.by(1) = Note_Pc ' выбрать
инструмент
midiMsg.by(2) = 0 ' номер инструмента, например:
' 0 –
фор
тепьяно, 16 -
орган, 49 -
группа струнных, 57 -
труба
midiRES = midiOutShortMsg(midiOut, midiMsg.dw)
midiMsg.by(1) = Note_On ' воспроизвести ноту
midiMsg.by(2) = 69 ' от 0 до 127 -
частота
midiMsg.by(3) = 100 ' от 0 до 127 -
громкость
21
midiRES = mi
diOutShortMsg(midiOut, midiMsg.dw)
T = Timer
Do: Loop Until Timer > T + 5 ' время
затухания
звука
midiRES = midiOutClose(midiOut)
Print #2, " midiRES_Close= "; midiRES
Close #2
Sleep
' Результат выполнения программы:
' На колонки выдается "чистый звук", ниже отчет:
' Current Date: 02
-
23
-
2013
' Current Time: 21:47:47
' Current version of the MultiMedia Library = 778
' HiMmVers = 3 LoMmVers = 10
' NumDev = 1
' midiRES_Open = 0
' midiRES_Close= 0
Обратите внимание на время вывода сообщения
, а нужно еще и
оформ
ить
!
Помните
,
с какой русской пословицы началась эта брошюра?
"Беда, коль пироги начнет печи сапожник, а сапоги точать пирожник"!
Столько написал всяких слов, но запомнилось только словосочетание "преобразование Фурье"!
Им и займемся в следующий р
аз...
На этом позвольте закруглиться.
До новых встреч!
Пишите: eugene_r@mail.ru
Документ
Категория
Информатика
Просмотров
296
Размер файла
481 Кб
Теги
программы, звук, музыка, freebasic
1/--страниц
Пожаловаться на содержимое документа