Важная информация

User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 19

Тема: Эмуляция AY/YM

  1. #1
    Member Аватар для mungo
    Регистрация
    04.10.2006
    Адрес
    Минск
    Сообщений
    89
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Эмуляция AY/YM

    Господа, поделитесь секретом, как съэмулировать сабж?
    Я просто ламер в звуке, я больше по низкому уровню и БД.
    Колупаю чисто для себя проектик, хочу приделать звук, но не понимаю, как из записей в регистры получить "волну", чтобы ее потом выкинуть в поток (хоть на звуковую, хоть в файл).
    Сомневаюсь, и вам советую!

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,254
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    80
    Поблагодарили
    34 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от mungo Посмотреть сообщение
    Колупаю чисто для себя проектик, хочу приделать звук, но не понимаю, как из записей в регистры получить "волну", чтобы ее потом выкинуть в поток (хоть на звуковую, хоть в файл).
    Почитай про внутреннюю структуру чипа. Для начала сэмулируй один тоновый канал.

  4. #3
    Member Аватар для mungo
    Регистрация
    04.10.2006
    Адрес
    Минск
    Сообщений
    89
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А можно ссылочку, что почитать? Пробовал разобраться в исходнике унрила, но слишком там одно за другое зацеплено, сходу не поймешь...
    Сомневаюсь, и вам советую!

  5. #4
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,254
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    80
    Поблагодарили
    34 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от mungo Посмотреть сообщение
    А можно ссылочку, что почитать? Пробовал разобраться в исходнике унрила, но слишком там одно за другое зацеплено, сходу не поймешь...
    http://speccy.info/AY

    Внизу ссылки, в том числе и на разные даташиты.

  6. #5
    Master Аватар для siril
    Регистрация
    01.02.2005
    Адрес
    perm/ru
    Сообщений
    520
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от mungo Посмотреть сообщение
    А можно ссылочку, что почитать? Пробовал разобраться в исходнике унрила, но слишком там одно за другое зацеплено, сходу не поймешь...
    лучше разбираться в исходниках Unreal Speccy Portable, там код относящийся к эмуляции устройств более понятный и менее завязан на всё остальное.
    oisee.

  7. #6
    Member Аватар для mungo
    Регистрация
    04.10.2006
    Адрес
    Минск
    Сообщений
    89
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Стал в ступор с тупой функцией вывода звука: слышу лишь "пуки". Вырезал из программы кусок, чтобы чисто - результат тот же. Никто не подскажет, где я ступил?
    Код:
    #include <windows.h>
    #include <mmsystem.h>
    #include <stdio.h>
    
    HWAVEOUT handle;
    WAVEHDR	whdr;
    
    typedef	unsigned long dword;
    
    union SAMPLE
    {
    	dword sample;
    	struct { short left, right; } ch;
    };
    
    SAMPLE buffer[16384];
    
    int	main()
    {
    int	i;
    WAVEFORMATEX wf;
    wf.cbSize = sizeof(wf);
    wf.wFormatTag = WAVE_FORMAT_PCM;
    wf.nSamplesPerSec = 44100;
    wf.wBitsPerSample = 16;
    wf.nChannels = 2;
    wf.nBlockAlign = 4;
    wf.nAvgBytesPerSec = 176400;
    MMRESULT r = waveOutOpen(&handle, WAVE_MAPPER, &wf, NULL, 0, CALLBACK_NULL);
    if(r != MMSYSERR_NOERROR) printf("Аудио не запустилось!");
    for (int i=0; i<16384; i++) {
    buffer[i].sample=0x3FFF3FFF;
    }
    for (i=0; i<100; i++) {
    whdr.dwBufferLength=882*4;
    whdr.lpData=(char *)buffer;
    whdr.dwFlags=0;
    whdr.dwBytesRecorded = 0;
    whdr.dwUser = 0;
    whdr.dwLoops = 0;
    whdr.lpNext = NULL;
    whdr.reserved = 0;
    MMRESULT r=waveOutPrepareHeader(handle,&whdr,sizeof(whdr));
    if (r==MMSYSERR_NOERROR) waveOutWrite(handle,&whdr,sizeof(whdr));
    while(!(whdr.dwFlags&WHDR_DONE)) Sleep(1);
    waveOutUnprepareHeader(handle,&whdr,sizeof(whdr));
    }
    return 0;
    }
    Сомневаюсь, и вам советую!

  8. #7
    Veteran Аватар для ZXMAK
    Регистрация
    30.01.2006
    Адрес
    Харьков
    Сообщений
    1,405
    Спасибо Благодарностей отдано 
    2
    Спасибо Благодарностей получено 
    20
    Поблагодарили
    14 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Re: Эмуляция AY/YM

    В исходниках zxmak2 посмотри код AY8910, там все просто и завязано только на шину z80. Наружу торчит буфер с текущим фреймом (см интерфейс ISoundRenderer)
    ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
    ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet

  9. #8
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,254
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    80
    Поблагодарили
    34 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Alexander Makeev Посмотреть сообщение
    В исходниках zxmak2 посмотри код AY8910, там все просто и завязано только на шину z80. Наружу торчит буфер с текущим фреймом (см интерфейс ISoundRenderer)
    Как ему это поможет пофиксить код, использующий waveOut API?

  10. #9
    Member Аватар для mungo
    Регистрация
    04.10.2006
    Адрес
    Минск
    Сообщений
    89
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Alexander Makeev, к сожалению с шарпом слабо знаком, мне сложно понять, что да как...
    После серии экспериментов появилось подозрение, что все дело в ожидании, пока проиграется текущий фрагмент. То есть если я правильно понял, то после проигрывания текущего фрагмента звук выключается на какое-то время, после которого идет пауза, формируемая винапи. Пока не придумал, как обойти...
    Сомневаюсь, и вам советую!

  11. #10
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,254
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    80
    Поблагодарили
    34 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от mungo Посмотреть сообщение
    То есть если я правильно понял, то после проигрывания текущего фрагмента звук выключается на какое-то время, после которого идет пауза, формируемая винапи. Пока не придумал, как обойти...
    У тебя просто неправильно сделано ожидание окончания воспроизведения.
    Надо как-то так:

    Код:
    HANDLE event = CreateEvent(0, FALSE, FALSE, 0);//создаем объект события
    waveOutOpen(&Handle, WAVE_MAPPER, &wf, DWORD_PTR(event), 0, CALLBACK_EVENT | WAVE_FORMAT_DIRECT);//открываем устройство и говорим, что надо по окончании воспроизведения буфера выставлять событие
    waveOutPrepareHeader(handle,&whdr,sizeof(whdr));//готовим буфер
    whdr.dwFlags |= WHDR_DONE;//помечаем как свободный
    
    waveOutWrite(...);//пишем
    while (!(whdr.dwFlags & WHDR_DONE))
    {
      WaitForSingleObject(event, INFINITE);
    }
    //дождались окончания- закрываем все
    waveOutUnprepare(...)
    waveOutClose(...);
    CloseHandle(event);

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. [Поиск 1] Эмуляция
    от KingArthur в разделе Поиск
    Ответов: 192
    Последнее: 05.12.2021, 15:48
  2. Эмуляция ПЗУ с помощью МК
    от research в разделе Память
    Ответов: 51
    Последнее: 10.04.2012, 14:35
  3. Эмуляция Sprinter'а
    от breeze в разделе Эмуляторы
    Ответов: 7
    Последнее: 28.03.2008, 23:08
  4. Эмуляция инструкции IM 0/1
    от DZh в разделе Эмуляторы
    Ответов: 1
    Последнее: 09.03.2008, 09:20

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •