Книга: Язык Си - руководство для начинающих

Использование функции tоnе( )

Использование функции tоnе( )

Наша функция tone( ) в значительной степени дублирует действие оператора SOUND языка Бейсик для компьютера IBM PC Здесь мы используем ее для создания довольно ограниченной ( 8 нот, одна октава) клавиатуры, в которой используются 8 клавишей, начиная с А, для воспроизведения нот. Ниже приведена соответствующая программа, а также некоторые пояснения к ней.

/* простая музыкальная клавиатура */

#include <conio.h> /* использует небуфсризованный ввод-вывод */

#include <ctype.h>

#define С 262 /* определяет частоты */

#define D 294

#define E 330

#define F 349

#define G 392

#define А 440

#define В 494

#define C2 524

main( )

{

int key, freq, tempo, time;

puts(" Введите, пожалуйста, основной темп: 10 = 1 с.");

scanf(" %d", &tempo);

printf(" %d n r", tempo);  /* эхо-ввод */

puts(" Спасибо. Используйте клавиши а - k для воспроизведения нот.nr");

puts(" Клавиша переключения регистра удваивает продолжительность звучания.

    Символ ! прекращает работу.");

while((key = getchar( )) != '!')

{ time = isupper(key)? 2 * tempo : tempo;

  key = tolower(key);

  switch (key) {

   case 'a' :  tone(C, time);

    break; 

   case 's' : tone(D, time);

    break;

   case 'd' :   tone(E, time);

    break;

   case 'f' :  tone(E, time);

    break;

   case 'g' :   tone(G, time);

    break;

   case 'h' :  tone(A, time);

    break;

   case 'j' :  tone(B, time);

    break;

   case 'k' :  tone(C2, time);

    break;

   default :    break; }

 }

рuts("До свидания!nr");

} }

Главной особенностью созданной программы является оператор switch, который присваивает разные звуки восьми клавишам от А до К. Кроме того, программа удваивает продолжительность звучания ноты, если вы используете верхний регистр. Эта продолжительность (time) устанавливается перед оператором switch, затем верхний регистр переключается на нижний, чтобы сократить число необходимых меток.

Вторая важная особенность заключается в том, что мы используем заголовочный файл conio.h. Этот файл содержит директивы #define, которые заменяют обычные функции ввода-вывода [такие, как getchar( )] на версии "пультового ввода-вывода", являющиеся не буферизованными. И в результате, если вы нажимаете, скажем, клавишу [а], немедленно звучит нота, и вам нe нужно нажимать клавишу [ввод]. Между прочим, эти функции не только не выполняют эхо-печать, но и не начинают автоматически новую строку. Поэтому мы вставили оператор printf( ) для эхо-печати вводимой переменной tempo и использовали символы n и r для перемещения курсора на новую строку и возврата его к левой сторонe экрана. Если вы хотите, чтобы символы, которые соответствуют нажимаемым клавишам, отображались одновременно на экране, вставьте

putchar(key);

в программу.

Хотя ввод не буферизован, клавиатура имеет свой собственный буфер. Это позволяет вам, если вы хотите, заранее набирать все требуемые символы. А ноты будут звучать в собственном устойчивом темпе. Вот, пример, начало мелодии "Радость мира"

KjhGfdsA

Предоставляем вам возможность закончить эту мелодию.

Оглавление книги


Генерация: 1.309. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз