- •Обробка виключних ситуацій
- •6.0804 “Комп’ютерні науки”
- •1. Мета роботи
- •2.Основні теоретичні відомості
- •2.1. Оператори мови java
- •15.1. Модель обробки "поставщик-споживач"
- •15.2. Класи-фільтри
- •15.6. Модель обробки прямим доступом
- •15.7. Перетворення зображення в Java 2d
- •15.8. Афінне перетворення зображення
- •15.9. Зміна інтенсивности зображення
- •Import java.Awt.*;
- •Import java.Awt.Image.*;
- •Import java.Awt.Event.*;
- •15.10. Зміна складових кольору
- •15.11. Створення різних эфектів
- •Import java.Awt.*;
- •Import java.Awt.Event.*;
- •15.13. Покращення зображення подвійною буферизацією
- •50, 50, 0, 360, Arc2d.Open));
- •15.14. Звук
- •Import java.Applet.* ;
- •Import java.Net.*;
- •15.15. Програвання звуку в Java 2
- •Import javax.Sound.Sampled.*;
- •Import java.Io.*;
- •If (!AudioSystem.IsLineSupported(info)){
- •Import javax.Sound.Sampled.*;
- •Import java.Io.*;
- •If (!AudioSystem.IsLineSupported(info)){
- •Import javax.Sound.Midi.*;
- •Import java.Io.*;
- •15.16. Синтез і запис звуку в Java 2
- •Import javax.Sound.Midi.*;
- •Import java.Io.*;
- •3.Контрольні запитання
- •4.Лабораторне завдання
- •Мета роботи.
- •Список рекомендованої літератури
Import javax.Sound.Sampled.*;
Import java.Io.*;
class PlayAudio{
PlayAudio(String s){
play(s);
}
public void play(String file){
Clip line = null;
try{
// Створюємо обєкт, представляючий файл
File f = new File (file);
// Отримуємо інформацию про спосіб запису файла
AudioFileFormat aff = AudioSystem.getAudioFileFormat(f);
// Отримуємо інформацию про спосіб запису звуку
AudioFormat af = aff.getFormat();
// Збираємо всю інформацію вмісті, додаючи дані про клас
DataLine.Info info = new DataLine.Info(Clip.class, af) ;
// Перевіряємо, чи можна програвати такий формат
If (!AudioSystem.IsLineSupported(info)){
System.err.println("Line is not supported");
System.exit(0);
}
// Отримуємо лінію звязку з файлом
line = (Clip)AudioSystem.getLine(info);
// Створюємо потік байтів із файла
AudioInputStream ais = AudioSystem.getAudioInputStream(f);
// Відкриваємо лінію
line.open(ais);
}catch(Exception e){
System.err.println(e);
}
// Начинаємо програвання
line.start();
// Тут треба зробити затримку до закінчення програвання або зупинити його наступним //методом:
try{ // Затримка в 0.1 сек
Thread.sleep(60000);
}catch(InterruptedException e){ }
line.stop();
//По закінченні програвання закриваємо лінію
line.close();
}
public static void main(String[] args){
if (args.length != 1)
System.out.println("Usage: Java PlayAudio filename");
new PlayAudio(args[0]);
}
}
Як бачите, методи Java Sound API виконують елементарні дії, які треба повторяти із програми в программу. Як говорять, це методи "низького рівня" (low level). Другий спосіб, використовуючий методи інтерфейса SourceDataLine, вимагає попереднього створення буфера довільного розміру.
Лістинг 15.16. Програвання аудіофайла
Import javax.Sound.Sampled.*;
Import java.Io.*;
class PlayAudioLine{
PlayAudioLine(String s){
play(s);
}
public void play(String file){
SourceDataLine line = null;
AudioInputStream ais = null;
byte[] b = new byte[2048]; // Буфер даних
try{
File f = new File(file);
// Створюємо вхідний потік байтів із файла f
ais = AudioSystem.getAudioInputStream(f);
// Дістаємо із потоку інформацію про спосіб запису звуку
AudioFormat af = ais.getFormat () ;
// Заносимо цю інформацію в обєкт info
DataLine.Info info = new DataLine.Info(SourceDataLine.class, af);
// Перевіряємо, чи підходить такий спосіб запису звуку
If (!AudioSystem.IsLineSupported(info)){
System.err.println("Line is not supported");
System.exit(0);
}
// Отримуємо вхідну лінію
line = (SourceDataLine)AudioSystem.getLine(info);
// Відкриваємо лінію
line.open(af);
try{
Thread.sleep(1000);
}catch(InterruptedException e){}
// Починаємо програвання
int num = 0 ;
line.start(); // Чекаємо появи даних в буфері
// Раз за разом заповняємо буфер
while(( num = ais.read(b)) != -1)
line.write(b, 0, num);
// "Зливаємо" буфер, програючи залишок файла
line.drain();
// Закриваємо потік
ais.close();
} catch (Exception e) {
System.err.println (e);
}
// Зупиняємо програвання
line.stop();
// Закриваємо лінію
line.close();
}
public static void main(String[] args){
String s = "bark.aif";
if (args.length > 0) s = args[0];
new PlayAudioLine(s) ;
}
}
Управляти програванням файла можна за допомогою подій. Подія класу LineEvent настає при відкриті, OPEN, і закритті, CLOSE, потоку, при початку, START, і закінченні, STOP, програвання. Характер події відмічається указаними константами. Відповідний інтерфейс LineListener описує тільки один метод update().
В MIDI-файлах зберігається послідовність (sequence) команд для секвенсора (sequencer) – пристрою для запису, програвання і редагування MlDI-послідовності, яким може бути фізичний пристрій або программа. Послідовність складається із декількох дорожок (tracks), на яких записані MIDI-події (events). Кожна дорожка завантажується в своєму каналі (channel). Звичайно дорожка містить звучання одного музичнного інструмента або запис голосу одного виконавця або запис декількох виконавців, мікшовану синтезатором (synthesizer). Для програвання MIDI-послідовності в найпростішому випадку треба створити екземпляр секвенсора, відкрити його і направити в нього послідовність, отриману із файла, як показано в лістинзі 15.17. Після цього треба почати програвання методом start(). Закінчити програвання можна методом stop(), "перемотать" послідовність на початок запису або на указаний час програвання - методами setMicrosecondPositionflong mcs) або setTickPosition(long tick).
Лістинг 15.17. Програвання MIDI-послідовності