Приставки > Железо
О наболевшем - Звук - техническая реализация!!!
ajak:
Привет всем. Выручайте!!!
1)Не понимаю техническую реализацию звуковых чипов. Как самое простое - возьму денди. В журнале – Ремонт и Обслуживание, а в частности - Игровые Приставки, написано, что для создания звука используются 2 канала с прямоугольной формой, 1 треугольный, 1 сигнал шума. Я не понимаю, как из этого получаются звуки, а именно ноты различного звучания, и эфеекты. А в сеге даже глосса – пример Рестлинг. Что, при смешивании всех этих каналов получаются нота? Или как? Это что, базис какой-то. Ну как RGB панель, при смешивании которой получаются разные цвета. Так что, и в звуке чтоли?
2)Ещё тут читал доки, по сеге и наткнулся на такую вещь. И не пойму, какая в них разница. В сеге есть музыкальный синтезатор и программируемый звуковой генератор. В чём их разница? И есть ли они в дендике?
3)Этот вопрос не такой важный, можно на него не отвечать, но, всё таки, кто хочет, пускай ответит. Он относиться конкретно к программированию. Допустим я сэмулирую z80, и мне нужно передать эти данные своему реальному звуковому генератору, т.е. мой настоящей звуковой карте, как это сделать? Какие у неё адреса, порты? Как в ней порыться низкоуровнево? Где-нить написано? API DirectX не предлагать. Альтернативы, плиз. Как быть, если на какой-то машине установлена редкая карточка(а не AC97 или как она там), или у них есть определенный базис тоже, как у видео карты, в которой зашиты ASCII символы к примеру?
4)В институте, мы проходили ряды, ну естественно, скоро я узнал, что любой звук можно разложить в косинусы и синусы различной частоты и амплитуды, и при смешивании (читай объединении, суммировании) получиться звук. До знакомства с денди я думал, что только так создаётся звук. Думал, что там стоит дюжина генераторов синусов и косинусов, так процесс и идёт. А тут в доках я читаю, что какие-то пилообразные, прямоугольные, треугольные, и т.д. генераторы используются.
У меня такой склад ума, что я хочу понять, почему так, а не иначе, почему именно эти формы сигналов и никакие не другие, и как до этого додумались. К примеру сигнал овальный.
Спасибо.
Rumata:
ajak, стоп.
Нет смысла задавать 33 вопроса одновременно. Вряд ли возможно получить внятный ответ. Давай сосредоточимся на главном вопросе, а в детали будем вникать по мере необходимости
Добавлено позже:
Пока попытаюсь подогнать немного теории
При воспроизведении звука есть два варианта: запись и синтез. В первом случае - грамофон, патефон, магнитофон... CD, DVD. Во втором - синтезатор, MIDI, wavetable
sergi:
Я тоже разбираюсь в этой хрени сейчас
Возьмем к примеру Yamaha 2610:
4 канала FM-синтеза - как я понимаю это сигнал который выдается путем наложения синусоид разных частот - только правда не впер - это значит 4 синусуиды?
7 каналов ADMPC - это короче как я понял цифровой выход (не понял 7 контактов чтоли) с которого звук идет в ЦАП, при этом сам по себе звук фактически wav только пожатый в 4 раза - используется для сжатия голосовых данных - сжатие за счет того, что в отличии от wav что не абсолютные значения, а только их изменения, при этом очень плохо соответственно прамоугольники получаются
3 канала PSG - ну это как у денди, только тоже не понял какие именно: прямоугольник, пила и синусоида?
1 канал noise - как мне объяснили это фактически аналоговый сигнал, который примешивается к основному чтобы сгладить неровности, он раднумный, т.е. реально вносит просто небольшие искажения
Ну и кто чего скажет? :?
Rumata:
--- Цитата: sergi ---Ну и кто чего скажет?
--- Конец цитаты ---
Я скажу
Не следует плодить сущности без необходимости
В теме задан вопрос, достаточно объемный, нет смысла добавлять свои. Лучше создать отдельную тему, а ещё лучше проследить за развитием этой
Ну и уж если ты влез в подробности, надеюсь, с даташитами сам справишься :D
ajak:
Ну для этого я и пометил их циферками. Главный - номер 1. Не очень важный - 2. И вообще не важный - 3.
Добавлено позже:
--- Цитата ---ajak, стоп.
Нет смысла задавать 33 вопроса одновременно.
--- Конец цитаты ---
Не знаю, просто накопилось. :blush: Решил выговориться. :unsure:
Добавлено позже:
--- Цитата ---Пока попытаюсь подогнать немного теории
--- Конец цитаты ---
Спасибо большое Rumata :)
Добавлено позже:
--- Цитата ---Лучше создать отдельную тему, а ещё лучше проследить за развитием этой
--- Конец цитаты ---
Мне кажеться, это верно, гляди и всплывут твои вопросы.
sergi:
На первый могу ответить как я это понимаю
В приставках стоит синтезатор, обычно даже от Yamaha - в сеге тоже он стоит только 2612 у него всего 10 каналов, по памяти помоему нет вообще ADMPC, зато FM-синтез 6 каналов, но тоже черт его разберешь
Обычно синтезатор у приставок имеет всроеный ЦАП, т.е. фактически из микрухи выходят 2 контакта и там звук
У нео-гео ЦАП внешний, но там все заточено и схемы выверенные, поэтому это не важно
Синтезатором рулит отдельных звуковой проц, обычно тоже Z80 юзают для этого
в нео-гео короче M68К только говорит что именно играть, а уже код написанный для звуков M.ROM уже сам там разводит что именно и откуда
Дальше пока не знаю, но это принцип многих приставок, при чем как я понял движок для звука можно не придумывать, т.к. их много стандартных уже придумано и даже для них декодеры существуют
Ну и как мне знакомый музыкант объяснил - можно wav конвертить в FM-синтез, в PSG запросто, даже проги есть, а там уже движок выбираешь - но пока реально не работал с этим, но активно инфу подбиваю
Даташиты очень помогают, т.к. написаны на простом и доступном каждому японском языке иероглифами :)
ajak:
Да, кстати, извините за оффтоп, но у меня 3 музыкальных образования, это на будущее, что я хоть кое-что, да знаю в этом деле. :)
sergi:
Тем легче жить на этом свете :lol:
Реально смотря какая приставка конечно интересует
Но реально даже на денди можно голос модулировать треугольничками и прямоугольничками - все от желания зависит
Или напрямую синтезатором самому музыку играть по нотам и потом уже готорое давать приставке - так походу игры и делались, возможно правда было спец программное обеспечение для этого формата звука, но думаю его можно подобрать
Короче - синтезатор нужно знать как работает ;)
ajak:
И тишина ... :(
Наверное слишком сложный вопрос задал :-\
sergi:
Чем мои ответы не удовлетворили интерес? 0_0
HardWareMan:
Оякс, если ты мужЫкант, то должен знать, как формируется звук. Мы не будет обсуждать преобразование электрического эквивалента звука в реальный, физический через усилитель и акустическую систему, а рассмотрим только его электрическую "реинкорнацию".
Есть 2 важных параметра: частота и амплитуда. Думаю, не надо объяснять тебе эти 2 параметра, изучаемые во всех музыкальных школах. Но в электрическом варианте они означают то же самое: частота колебаний электрического тока (которые потом АС преобразуют в колебания частиц воздуха) и амплитуда колебаний (т.е. громкость).
1. PSG. Это тональный генератор прямоугольной формы сигнала. Каждый канал PSG может вырабатывать только одну частоту в одно и то же время. Если задать ему, например, частоту 440Гц, то получим тон Ля первой вроде октавы (та же частота у камертона, извините, но я музыкалок не кончал). А вот амплитуда по напряжению будет задавать громкость этого звука.
2. FM. Это уже частотный синтезатор. Их бывают множество, так что все и не перечислишь. Но основное правило вывести можно. Смотри, каждый канал FM синтезатора имеет несколько тональных генераторов (если у PSG генератор вырабатывал прямоугольный сигнал, то у FM каждый генератор вырабатывает синус). Можно использовать от одного до всех доступных в разных сочетаниях. У сеговского YM2612 на каждый канал есть 4 таких генератора (т.н. Операторы). Если на одном генераторе выставить, скажем, частоту ноты До первой октавы, а к нему примешать суммированием частоты еще 2х генераторов, расстроенных в + и - соответственно на полтона, то получаем фактически звук рояля (помнишь, там по 3 струны на каждую клавишу?). А если задать алгоритм такой, что один генератор на низкой частоте (1-10Гц) будет по своему синусу изменять частоту (не амплитуду!) другого генератора (скажем в пределах +-50Гц), то получаем трель. ну и т.д., алгоритмов смешивания функций каждого генератора в YM2612 8 (0-7) и почитать о них можно в соответствующей доке. Так же, у FM есть Envelope Generator, т.е. генератор огибающей. Он влияет только на результирующую громкость канала, формируя атаку, удержание и затухание. Эти термины ты тоже должен знать. В общем, принцип формирования звука в FM очень похож на реальные инструменты (особенно струнные).
3. WT. Т.е. табличный или сэмплерный метод. Здесь все просто - записываем каждого звука по сэмплу (в идеале надо писать по каждой ноте, но прикинь, скока это будет весить, если записать рояль? поэтому пишут 1-3, чтобы перекрыть некоторый диапазон и просто выводят сэмпл с разной скоростью, чтиобы получить нужную ноту).
Вывод такой:
PSG способен только "гудеть", но при наличии хотя бы 3х каналов опытные музыканты делают шедевры (направление ChipTune).
FM - самый "богатый" на звук и количество разнообразия звука, но в одно и то же время самый сложный при имитации реальных инструментов. Некоторые инструменты не возможно сымитировать FM в принципе.
WT - самый достоверный синтез, но бедный, ибо чем больше звуков в него пихаешь - тем болше ресурсов он требует.
Rumata:
--- Цитата: ajak ---И тишина ...
--- Конец цитаты ---
Ну не все же в рабочее время в интернете сидят :)
Wave Table предполагает наличие ЦАП и зараннее записаных звуковых фрагментов - сэмплов. Обычно считается, что при табличном синтезе качество наивысшее. Но это не совсем так. Если сэмпл оцифрован 16 бит / 44 кГц, то качество будет как на CD. Но можно в целях экономии места оцифровать и 8 бит / 11 кГц, так что сам метод не является гарантией высокого качества. Кроме того, сэмпл - не просто нота, а некий более широкий фрагмент, скажем, аккорд, что и позволяет предать звучание конкретного инструмента или исполнителя.
Частотный синтезатор, как правило, имеет в своем составе генератор белого шума. Кстати, ударные синтезируются так же очень легко
HardWareMan:
Генератор белого шума есть и в PSG и в FM, чтобы придать оттенки получаемым звукам или имитировать те же ударные (в основном тарелки). Ударные представляют собой затухающие колебания одной-двух частот с очень резкой атакой и резким затуханием без удержания. Регулируюя крутизну затухания и основную частоту можно получить весь спектр - от басс бочки до том-томов. Так что их повторить проще всего.
ajak:
Посоветуйте книжки печатные издания или электронные по этой очень интересной теме. Много всего нового узнал.:debile: :debile: :debile:
Спасибо большое. Вы лучшие. :thumbup:
Rumata:
С книжками сложно однако. Есть вот у меня толковая книжка по синтезу речи, только она 1985 года издания. Попытайся помучить Яндекс. К примеру - http://slovari.yandex.ru/dict/informatica/article//info/info-497.htm Конечно, на большую глубину не претендует, но всё же
ajak:
А по поводу других вопрос ответите? :blush:
Rumata:
Ты их ещё не задал :)
ajak:
:lol:
Не, тама вопрос под номерм 3 ещё есть. ;)
ajak:
3)Этот вопрос не такой важный, можно на него не отвечать, но, всё таки, кто хочет, пускай ответит. Он относиться конкретно к программированию. Допустим я сэмулирую z80, и мне нужно передать эти данные своему реальному звуковому генератору, т.е. мой настоящей звуковой карте, как это сделать? Какие у неё адреса, порты? Как в ней порыться низкоуровнево? Где-нить написано? API DirectX не предлагать. Альтернативы, плиз. Как быть, если на какой-то машине установлена редкая карточка(а не AC97 или как она там), или у них есть определенный базис тоже, как у видео карты, в которой зашиты ASCII символы к примеру?
:blush:
HardWareMan:
Для SB-совестимых звуковушек я делал так:
--- Код: ---;Пример программы, проигрывающей файл C:\WINDOWS\MEDIA\TADA.WAV
;на звуковой плате при помощи DMA
FILESPEC equ "01.wav" ;Воспроизводимый файл
SBPORT equ 220h ;Адрес SB
SBIRQ equ 7
.model tiny
.code
.186
org 100h
start: call dsp_reset
jnc cont
ret
cont: mov byte ptr cs:state,0
mov bl,0D1h
call dsp_write
call open_file
call hook_sbirq
mov bl,40h
call dsp_write
mov bl,0D2h ;0D2h
call dsp_write
call program_dma
push dx
mov ah,9
mov dx,offset messagestrt
int 21h
pop dx
mov al,byte ptr cs:state
mov byte ptr cs:stat,al
push dx
mov ah,9
mov dx,offset countb
int 21h
mov ax,word ptr cs:bytes
mov al,ah
call outhex
mov ax,word ptr cs:bytes
call outhex
mov ah,9
mov dx,offset counte
int 21h
pop dx
mainlp:mov al,byte ptr finished_flag
cmp al,128
je mainen
mov al,byte ptr cs:state
cmp byte ptr cs:stat,al
je mainlp
mov byte ptr cs:stat,al
push dx
mov ah,9
mov dx,offset countb
int 21h
mov ax,word ptr cs:bytes
mov al,ah
call outhex
mov ax,word ptr cs:bytes
call outhex
mov ah,9
mov dx,offset counte
int 21h
mov dx,word ptr bytes
inc dx
mov word ptr bytes,dx
pop dx
push ds
mov bx,40h
mov ds,bx
mov bx,17h
mov al,byte ptr ds:[bx]
pop ds
and al,3h
jz mainlp
mov dx,offset messageend
jmp exit
mainen:mov dx,offset messagefin
exit: mov ah,9
int 21h
call restore_sbirq
mov bl,0D3h
call dsp_write
mov bl,0D0h
call dsp_write
mov bl,0DAh
call dsp_write
mov bl,0D0h
call dsp_write
int 20h
ret
;Переменные
old_sbirq dd ?
finished_flag db 0
filename db FILESPEC,0
bytes dw 0
stat db 0
countb db 0Dh, "Воспроизведение блока номер $"
counte db "H.$"
messagestrt db "Воспроизведение. Для остановки нажмите любой SHIFT."
db 0Dh, 0Ah, '$'
messageend db 0Dh, 0Ah, "Прервано пользователем.", 0Dh, 0Ah, '$'
messagefin db 0Dh, 0Ah, "Кончилось.", 0Dh, 0Ah, '$'
;Обработчик прерывания звуковой карты
;Устанавливает флаг finished_flag в 128 если кончился файл
sbirq_handler proc far
pusha
mov al,20h
out 20h,al
mov dx,SBPORT+0Eh
in al,dx
mov ax,word ptr cs:file
mov bx,ax
mov ah,3Fh
mov cx,4000h
push ds
mov dx,ds
and dx,0F000h
mov al,byte ptr cs:state
or al,al
jnz second
first: add dx,1000h
mov ds,dx
mov dx,0
int 21h
pop ds
jc close
cmp ax,0
je close
mov byte ptr cs:state,255
popa
iret
second:add dx,1400h
mov ds,dx
mov dx,0
int 21h
pop ds
jc close
cmp ax,0
je close
mov byte ptr cs:state,0
popa
iret
close: mov byte ptr cs:finished_flag,128
popa
iret
state db 0
file dw 0
sbirq_handler endp
;Процедура outhex
;Выводит al в HEX виде
outhex proc near
push ax
shr al,4
and al,15
cmp al,10
jc out0
add al,7
out0: add al,48
mov byte ptr txt,al
pop ax
and al,15
cmp al,10
jc out1
add al,7
out1: add al,48
mov byte ptr txt+1,al
push dx
mov ah,9
mov dx,offset txt
int 21h
pop dx
ret
txt db 0,0,'$'
outhex endp
;Процедура dsp_reset
;Сброс и инициализация DSP
dsp_reset proc near
mov dx,SBPORT+6
mov al,1
out dx,al
mov cx,40
dsp_loop: in al,dx
loop dsp_loop
mov al,0
out dx,al
add dx,8
mov cx,100
check_port:in al,dx
and al,80h
jz not_ready
sub dx,4
in al,dx
add dx,4
cmp al,0AAh
je good_reset
not_ready: loop check_port
stc
ret
good_reset:clc
ret
dsp_reset endp
;Процедура dsp_write
;Посылает байт из BL в DSP
dsp_write proc near
mov dx,SBPORT+0Ch
write_loop:in al,dx
and al,80h
jnz write_loop
mov al,bl
out dx,al
ret
dsp_write endp
;Процедура hook_sbirq
;Перехватывает прерывание звуковой карты и разрешает его
hook_sbirq proc near
mov ax,3508h+SBIRQ
int 21h
mov word ptr old_sbirq,bx
mov word ptr old_sbirq+2,es
mov ax,2508h+SBIRQ
mov dx,offset sbirq_handler
int 21h
mov cl,1
shl cl,SBIRQ
not cl
in al,21h
and al,cl
out 21h,al
ret
hook_sbirq endp
;Процедура restore_sbirq
;Восстанавливает обработчик и запрещает прерывание
restore_sbirq proc near
mov ax,3508h+SBIRQ
lds dx,dword ptr old_sbirq
int 21h
mov cl,1
shl cl,SBIRQ
in al,21h
or al,cl
out 21h,al
ret
restore_sbirq endp
;Процедура open_file
;Открывает файл и заполняет буфер
open_file proc near
mov ax,3D00h
mov dx,offset filename
int 21h
jc error_exit
mov word ptr cs:file,ax
mov bx,ax
mov ax,4200h
mov cx,0
mov dx,38h
int 21h
mov ah,3Fh
mov cx,8000h
push ds
mov dx,ds
and dx,0F000h
add dx,1000h
mov ds,dx
mov dx,0
int 21h
pop ds
ret
error_exit:
mov ah,9
mov dx,offset not_open_msg
int 21h
int 20h
;Сообщение об ошибке
not_open_msg db "Ошибка при открытии файла",0Dh,0Ah,'$'
open_file endp
;Процедура program_dma
;Настраивает 1 канал DMA
program_dma proc near
mov al,5
out 0Ah,al
xor al,al
out 0Ch,al
mov al,59h ;Для авто = 59h
out 0Bh,al
push cs
pop dx
and dh,0F0h
add dh,10h
xor ax,ax
out 02h,al
out 02h,al
mov al,dh
shr al,4
out 83h,al
mov ax,8000h
dec ax
out 03h,al
mov al,ah
out 03h,al
mov al,1
out 0Ah,al
mov bl,48h
call dsp_write
mov bx,4000h
dec bx
call dsp_write
mov bl,bh
call dsp_write
mov bl,01Ch
call dsp_write
ret
program_dma endp
end start
--- Конец кода ---
Файл - непожатая WAVка.
Навигация
Перейти к полной версии