Sách Giải

https://sachgiai.com

Màu sắc và âm thanh trong Pascal

Chương này sẽ trình bày hai công cụ mà Pascal cung cấp cho ta. Đó là màu sắc và âm thanh trong Unit CRT; Vì vậy trong chương trình, ta phải khai báo USES CRT;
■ Ví dụ:
PROGRAM Mausac;
USES CRT;

1. MỤC ĐÍCH
a) Chương trình ví dụ
Trước hết xin giới thiệu một vài chương trình mẫu về màu sắc.
■ Ví dụ:
Viết chương trình thể hiện màu chữ và màu nền của Pascal.
PROGRAM Mau Sac;
     USES CRT;
BEGIN
     CLRSCR;
     GOTOXY(20,2);
WRITELN (*CHUONG THE HIEN MAU CUA PASCAL*');
     TEXTCOLOR (Yellow);
     TEXTBACKGROUND (Red);
     GOTOXY (27,4);
     WRITELN (‘CHU MAU VANG TREN NEN DO’);
     TEXTCOLOR (Red);
     TEXTBACKGROUND (Yellow);
     GOTOXY (27,6);
     WRITELN (‘CHU MAU DO TREN NEN VANG');
     TEXTCOLOR (Green);
     TEXTBACKGROUND (While);
     GOTOXY (22,8);
     WRITELN (CHU MAU XANH LA CAY TREN NEN TRANG);
      TEXTCOLOR (Blue);
      TEXTBACKGROUND (Black);
      GOTOXY (22,10);
      WRITELN ('CHU MAU XANH DA TROI TREN NEN DEN');
      TEXTCOLOR (Light Red + Blink);
      TEXTBACKGROUND (Light Blue);
      GOTOXY (17,12);
      WRITELN (‘CHU MAU DO TUOI NHAP NHAY TREN NEN XANH SANG’);
      TEXTCOLOR (14);
      TEXTBACKGROUND (4);
       GOTOXY (27,16);
       WRITELN (‘CHU MAU VANG TREN NEN DO’);
       NORMVIDEO;
       GOTOXY(28,18);
       WRITELN (’TRO LAI MAU LUC BAN DAU’);
       READLN;
END.
• Giải thích:
- Dòng lệnh 2: Khai báo Unit CRT để quản lý màn hình. Trong thí dụ này dùng để thể hiện màu sắc và định vị trí xuất ra trên màn hình (thủ tục GOTOXY).
- TEXTCOLOR: Thủ tục thể hiện màu chữ. 
TEXTBACKGROUND: Thủ tục thế hiện màu nền.
- Các màu: Yellow (vàng), Red (đỏ) v.v...
- Có thể dùng số trong thủ tục TextColor và TextBackGround để thay cho tên màu.
■ Ví dụ:
Thay vì viết Yellow, người ta viết 14, hoặc Red là 4.
- Thủ tục NORMVIDEO, trở về màu lúc ban đầu.
b) Một số thủ tục dùng để thể hiện màu sắc trong UNIT CRT
Trong Unit CRT có nhiều thủ tục chuẩn. Để thể hiện màu sắc và vị trí xuất hiện của chúng trên màn hình, ta sẽ sử dụng một số thủ tục chuẩn sau đây:
• CLRSCR
Xóa toàn bộ màn hình và đặt con trỏ vào vị trí góc trên bên trái (cột 1, hàng 1). Ta cần lưu ý có một số loại màn hình sẽ tự động đặt lại thuộc tính màu khi ta xóa màn hình và do đó có thể làm thay đổi các thuộc tính màu đã được ta đặt cho nó.
• GOTOXY (X, Y: byte)
Dịch chuyển con trỏ tới tọa độ (là giao điểm của X và Y, kiểu sô nguyên) trên màn hình, với:
- X: là cột (theo chiều nằm ngang)
- Y: là dòng hay hàng (theo chiều thẳng đứng).
■ Ví dụ:
GOTOXY(1,1): Vị trí góc trên bên trái nhất của màn hình.
GOTOXY(80,25): Vị trí góc dưới bên phải nhất của màn hình.
GOTOXY(20,2): Vị trí cột thứ 20, hàng thứ 2.

• LOWVIDEO
Bắt đầu chế độ sáng thấp (Start of low Video). Sau khi gọi thực hiện thủ tục này thì mọi dữ liệu xuất ra trên màn hình đều có màu với độ sáng thấp.
• HIGHVIDEO
Bắt đầu chế độ sáng cao. Các dữ liệu xuất ra trên màn hình sẽ có màu sáng chói hơn.
• NORMVIDEO
Bắt đầu chế độ sáng thông thường. Sau khi gọi thực hiện.
TEXTCOLOR (Mau: byte)
Thủ tục này đặt màu cho chữ, số và các kí hiệu khác.
• TEXTBACKGROUND (Mau: byte)
Thủ tục này đặt màu nền.
Màu của hai thủ tục này có thể viết nguyên từ tiếng Anh chỉ màu đó hoặc viết một số nguyên thể hiện màu đó theo bảng thống kê dưới đây:
BẢNG MÀU CỦA PASCAL
Viết theo tên màu Viết theo số Ghi chú
Black
Blue
Green
Cyan
Red
Magenta
Brown
LightGray
DarkGray
LightBlue
LightGreen
LightCyan
LightRed
LightMagenta
Yellow
White		 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15		 Màu đen
Màu xanh dương
Màu xanh lá cây
Màu thiên thanh
Màu đỏ
Màu đỏ tươi
Màu nâu
Màu xám sáng
Màu xám tối
Màu xanh sáng
Màu xanh lá cây sáng
Màu thiên thanh sáng
Màu đỏ sáng
Màu đỏ tươi sáng
Màu vàng
Màu trắng

Để thể hiện một màu nào đó ta có thể sử dụng một trong hai cách: TEXTCOLOR (Yellow); hoặc TEXTCOLOR(14);
WINDOW(X1, Y1, X2, Y2: byte)
Thủ tục để vẽ một cửa sổ trên màn hình có tọa độ:
- Góc trên bên trái là cột X1, hàng Y1.
- Góc dưới bên phải là cột X2, hàng Y2.
Với X1, Y1, X2, Y2 là các số nguyên.
Cửa sổ định sẵn (default) là X1 = 1; Y1 = 1; X2 = 80; Y2 = 25 với màn hình loại 80 cột. Hoặc X1 = 1; Y1 = 1; X2 = 40; Y2 = 25 với màn hình loại 40 cột.
Bây giờ ta nhập chương trình sau đây vào máy để xem màu của Pascal nhảy nhót tung tăng trên màn hình.

■ Ví dụ 2:
Tạo màu ngẫu nhiên trên màn hình.
PROGRAM Mau_Nhay_Nhot;
     USES CRT;
     VAR
           X, Y: Byte
     BEGIN
           TEXTBACKGROUND (Black);
           CLRSCR;
           REPEAT
                 X:= SUCC(RANDOM(80));
                 Y:= SUCC(RANDOM(25));
                 WIND0W(X, Y, X+RANDOM (10)), Y+RANDOM(8);
                 TEXTBACKGROUND(RANDOM(16));
                 CLRSCR;
            UNTIL Key Pressed;
     END.
• Giải thích:
Dòng lệnh 4: Khai báo 2 biến nguyên kiểu Byte là X và Y là tọa độ của con trỏ.
- Dòng lệnh 6: Nền màn hình có màu đen.
Dòng lệnh 7: Xóa màn hình. Câu lệnh CLRSCR đi sau một câu lệnh xác định màu sẽ có công dụng làm loang màu ra toàn màn hình. Trong thí dụ này màu của màn hình có màu đen.
Dòng lệnh 8: Tạo vòng lặp REPEAT..UNTIL: Cho tới khi bấm một phím bất kì để kết thúc chương trình.
- Dòng lệnh 9 và 10: Tọa độ của con trỏ. Với:
+ SUCC(x): Hàm cho phần tử đứng sau X, X ở đây là RANDOM()).
+ RANDOM(80): Cho số ngẫu nhiên trong khoảng từ 0 đến (80 - 1)
- Dòng lệnh 11: Tạo cửa sổ ngẫu nhiên với tọa độ.
+ Góc trên bên trái:
X1 = X (câu lệnh 9)
Y1 = Y (câu lệnh 10)
+ Góc dưới bên phải:
X2 = X + RANDOM(10); Số ngẫu nhiên từ 0 đến (10 - 1)
Y2 = Y + RANDOM(8); Số ngẫu nhiên từ 0 đến (8-1)
- Dòng lệnh 12: Tạo màu nền ngẫu nhiên từ 0 đến (16-1) tức 15 màu.
Với chương trình này, ta đã cho màu của Pascal nhảy múa trên màn hình. Nhưng, như vậy vẫn chưa đủ ta còn có thể cho chúng ca hát nữa bằng cách viết một chương trình gồm thủ tục màu và âm thanh. Việc này cũng dễ dàng thôi vì Pascal đã cung cấp cho ta đủ công cụ. Bây giờ ta bắt đầu tìm hiểu về âm thanh.

2. ÂM THANH
a) Chương trình thí dụ
• Ví dụ 3:
Viết chương trình thể hiện tiếng còi của đoàn tàu hỏa.
PROGRAM Tieng_coi_doan_tau;
     USES CRT;
     BEGIN
          REPEAT
               SOUND(50);
               DELAY! 10000);
               SOUNDC800);
               DELAY(2000);
          UNTIL Key Pressed;
          NOSOUND;
     END.
• Giải thích:
- Dòng lệnh 5: Thủ tục SOUND(50) cho loa của máy tính phát ra âm thanh có tần số 50Hz (Hertz).
- Dòng lệnh 6: Thủ tục DELAY (10000) cho loa phát ra âm thanh 50Hz trong 10 giây. Thể hiện tiếng đoàn tàu chạy.
- Dòng lệnh 7: Cho loa phát ra tần số 800Hz trong 2 giây.
(Dòng lệnh 8) thể hiện tiếng còi hú và sau đó lại lặp lại tiếng tàu chạy sau 10 giây lại hú còi 2 giây, cho tới khi ta bấm vào một phím bất kì thì kết thúc.
- Dòng lệnh 10: Thủ tục NOSOUND dùng để tắt âm thanh của loa. Nếu ta quên không đánh vào câu lệnh này thì chiếc loa trong máy cứ kêu hoài trừ phi ta tắt máy mới thôi.
Bây giờ ta viết thêm một chương trình vừa thể hiện màu sắc hoặc cái gì đó trên màn hình kết hợp với việc phát âm thanh ra loa của máy xem sao nhé. Chẳng hạn chương trình đơn giản sau đây:
■ Ví dụ 4:
Tiếng còi hú của nhà máy.
PROGRAM Gio_Tan_Ca;
     USES CRT;
     VAR
           Coihu: Integer;
BEGIN
     TEXTCOLOR (Red + Blink);
     TEXTBACKGROUND(Blue);
     GOTOXY(31,10);
     WRITELN (‘*CHÚ Ý ! CHÚ Ý !*');
     TEXTCOLOR(Yellow);
     TEXTBACKGROUND(Magenta);
     GOTOXY(30,12);
     WRITELN('Đã hết giờ làm việc');
     REPEAT
          FOR Coihu:= 100 TO 3000 DO
                BEGIN
                   DELAY(1);
                   SOUND(Coihu);
             END;
       FOR Coihu:= 3000 TO 100 DO
            BEGIN
                 DELAY(1).;
                 SOUND(Coihu);
            END;
        UNTIL Key Pressed;
        NOSOUND;
        READLN;
END.
• Giải thích:
- Dòng lệnh 4: Khai báo biến nguyên Coihu.
- Dòng lệnh 6, 7, 8, 9: Đặt màu chữ là đỏ nhấp nháy trên nền xanh ở vị trí cột 31 dòng 10 hiện ra 4 chữ CHÚ Ý ! CHÚ Ý !
Dòng lệnh 10, 11, 12, 13: Đặt màu chữ vàng trên nên đỏ tươi ở vị trí cột 30 dòng 12 hiện ra câu “Đã hết giờ làm việc”.
- Dòng lệnh 14: Khởi tạo vòng lặp đề bắt đầu phát ra tiếng còi hú cho tới khi nào muốn ngừng thì bấm vào một phím bất kì (dòng lệnh 25).
- Dòng lệnh 15 đến 19: Tạo vòng lặp tiếng còi hú có âm thanh tăng dần từ 100Hz đến 3000Hz, mỗi tần số kéo dài 1/1000 giây (như vậy vòng lặp sẽ thực hiện trong 2900/1000 giây).
- Dòng lệnh 20 đến 24: Tạo vòng lập tiếng còi hú có âm thanh giảm dần từ 3000Hz xuống 100Hz cùng trong thời gian 2900/1000 giây.
- Dòng lệnh 26: Tắt tiếng loa trong máy.
b) Một sỏ thủ tục để tạo âm thanh
• SOUND (Hz: word)
Thủ tục này tạo ra âm thanh có tần số là Hertz có kiểu là số nguyên.
Âm thanh là sự rung động của không khí. Sự thăng, trầm (cao, thấp) của âm thanh được xác định bằng tần số. Đơn vị của tần số là Hertz, viết tắt là Hz. Âm thanh càng cao thì tần số càng lớn. Thí dụ tiếng động cơ xe gắn máy có tần số khoảng 50Hz, tiếng còi tàu có tần số 800Hz.
NOSOUND
Thủ tục này dùng đế tắt âm thanh của loa trong máy tính.
• DELAY (Tiem: word)
Thủ tục Delay tạo ra một vòng lặp trong thời gian xấp xỉ bằng số miligiây (1/1000 giây) được chi ra bởi đối số Time; Vì vậy Time phải là số nguyên. Thời gian đó chính xác hay không còn tùy thuộc vào hệ thống cụ thể.
Sử dụng ba thủ tục này ta có thê viết chương trình để cho máy phát ra một bản nhạc bất kì miễn là ta phải nắm được chút ít về nhạc lí.
Để thể hiện cao độ của nốt nhạc, ta dùng thủ tục SOUND.
Để thể hiện trường độ của nốt nhạc, ta dùng thủ tục DELAY. 
BẢNG TẦN SỐ NỐT NHẠC THEO QUÃNG TÁM (OCTAVE)
(từ OCTAVE 3 đến OCTAVE 6)
Qua bảng này, chúng ta rút ra nhận xét:
Muốn tăng lên 1 quãng tám (bát độ) thì nhân đôi tần số của nốt ấy (có làm tròn xấp xỉ). Ngược lại muốn giảm 1 nốt nào xuống 1 quãng tám thì lấy tần số của nốt ấy chia 2.
Như vậy là đã giải quyết được cao độ của các nốt nhạc, còn trường độ thì sao ? Cũng đơn giản thôi, hoàn toàn do ta tự qui định tùy thuộc vào bản nhạc đó nhanh hay chậm. Chẳng hạn ta lấy nốt đen (*) làm mốc và cho nốt này một giá trị trường độ (giả sử 1/10 giây thì):

Để viết một bản nhạc, có nhiều cách. Sau đây sẽ giới thiệu cách viết đơn giản nhất, đó là một thủ tục có hai tham số hình thức là caodo và truongdo. Khi thực hiện sẽ truyền cho chúng ta giá trị thực. Ta hãy nhập chương trình sau đây vào máy và cho chạy thử xem sao ?
■ Ví dụ 5:
PROGRAM Am_Thanh;
     USES CRT;
     PROCEDURE Nhac (Caodo, Truongdo: Integer;)
          BEGIN
               SOUND (Caodo);
               DELAY iruongdo);
          END;
      BEGIN (Chuong trinh chinh)
      WRITE1.N ('DOAN NHAC GIAO HUONG PASCAL');
      WRITELN ('Xin trinh bay ban nhac so 1');
      WRITELN (‘Cua nhac si DOREMI') ;
       Nhac(131,112) ;      Nhac(175,448) ;   Nhac(131,112) ;
       Nhac(262,448) ;      Nhac(131,112) ;   Nhac(220,336) ;
       Nhac(196,112) ;      Nhac(220,112) ;   Nhac(175,336) ;
       Nhac(131,336) ;      Nhac(175,336);    Nhac(294,336);
       Nhac(262,336) ;      Nhac(220,112) ;   Nhac(235,112) ;
       Nhac(262,1344) ;    Nhac(131,336) ;   Nhac(175,336) ;
       Nhac(294,336) ;      Nhac(262,336) ;   Nhac(220,112) ;
       Nhac(235,112) ;      Nhac(262,336) ;   Nhac(196,112) ;
       Nhac(220,112);       Nhac(175,336);    Nhac(131,336);
       Nhac(175,336) ;      Nhac(220,112) ;   Nhac(235,112) ;
       Nhac(196,560) ;      Nhac(175,112) ;   Nhac(175,1120) ;
       NOSOUND ;
       READLN ;
END.
Cuối cùng chúng ta tham khảo thêm một chương trình tạo âm thanh tự động sau đây. Hãy nhập vào máy và chạy thử xem sao?
• Ví du 6:
PROGRAM SoundDemo;
     CONST
          Don = 8*58; {nốt móc đơn}
          Doi = Don DIV 2; (nốt móc kép}
     TYPE
          NoteType = (c, cj, d, df, e, f, ff, g, gỉ, a, a, af, b);
          {Các not tu Do den Si}
     VAR
          Note: Note Type;
      PROCEDURE Play (Note: NoteType; octave, duration: Integer; {3 tham so: Note, caodo, truongdo}
      VAR
         Frequency: Real;
         i: Integer;
      BEGIN •
         Frequency:= 32,625;
         FOR i:= 1 TO octave DO
         Frequency:= Frequency * 2;
         FOR i:= 1 TO ord(Note) DO
         Frequency:= Frequency * 1.05946;
         IF duration <> 0 THEN
              BEGIN
                   SOUND (Round (Frequency));
                   DELAY (duration);
                   NOSOUND;
              END;
         ELSE
             SOUND (Round (Frequency));
END; {Play}
BEGIN { Chuong trinh chinh)
      Play(c, 4, don);
      Play(f, 4, don);
      Play(g, 4, don);
      Play(a, 4, don);
      Play(a, 4, don);
END.
Bản quyền bài viết thuộc về Sachgiai.com. Ghi nguồn Sách giải.com khi đăng lại bài viết này.
Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây