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

User Tag List

Страница 7 из 8 ПерваяПервая ... 345678 ПоследняяПоследняя
Показано с 61 по 70 из 71

Тема: TurboSound на Windows Mobile

  1. #61
    Guru Аватар для newart
    Регистрация
    19.01.2005
    Адрес
    Санкт-Петербург
    Сообщений
    11,441
    Спасибо Благодарностей отдано 
    192
    Спасибо Благодарностей получено 
    145
    Поблагодарили
    61 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SMT Посмотреть сообщение
    ... а может быь и нет. может, newart-у нужен "живой" AY. чтобы DLL сама крутила цикл в отдельном потоке, сама постоянно выводила звук, а код трекера в реальном времени писал в регистры и не заморачивался с буферами и звукокартами
    Зависит от задачи:

    1. если делаем аналог Vortex, то достаточно AY эмулятора, который все делает сам, единсвенное что делаю я это устанавливаю регистры AY раз в 1/50с через callback функцию либы.

    2. Если хочется возможность смешивать звук с Beeper (а ведь хочется), то нужна еще одна callback функция, в которой я накладывал бы семпл Beeper'a (генерируя его сам) на семпл AY сгеренрированый либой и она бы уже все это выводила в карту.

    3. Beeper'a мало, хочется из 3-х AY каналов иметь хотя бы один цифровой. Тогда вариант со смешиванием семплов уже не подходит. Нужна видимо вот такая функция "функция out_reg(t, num_reg, value), которая симулирует вывод в регистр на точно заданной микросекунде (все t должны неубывать. в идеале - строго возрастать)" вместе с функционалом первого варианта. Если либа знает что такое Beeper, то возможно второй вариант по уму надо реализовывать через out_reg(beeper).

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

  3. #62
    Veteran Аватар для SMT
    Регистрация
    16.01.2005
    Адрес
    Бобруйск
    Сообщений
    1,267
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от newart Посмотреть сообщение
    Зависит от задачи:

    2. Если хочется возможность смешивать звук с Beeper (а ведь хочется), то нужна еще одна callback функция, в которой я накладывал бы семпл Beeper'a (генерируя его сам) на семпл AY сгеренрированый либой и она бы уже все это выводила в карту.
    а вот это может обернуться проблемами. "сэмпл бипера", сделанный отдельно, без синхронизации всех генераторов звука, может не совпадать с длиной семпла AY. или погрешности окрулений кол-ва семплов в пересчёте на тики Z80/AY будет набегать и щёлкать периодически. можно не ставить себе цель микшировать всё в один буфер, а выводить несколько звуков одновременно, отдав микширование на откуп венде

    Цитата Сообщение от newart Посмотреть сообщение
    3. Beeper'a мало, хочется из 3-х AY каналов иметь хотя бы один цифровой. Тогда вариант со смешиванием семплов уже не подходит. Нужна видимо вот такая функция "функция out_reg(t, num_reg, value), которая симулирует вывод в регистр на точно заданной микросекунде (все t должны неубывать. в идеале - строго возрастать)" вместе с функционалом первого варианта. Если либа знает что такое Beeper, то возможно второй вариант по уму надо реализовывать через out_reg(beeper).
    именно так я и сделал
    например, вывод в sound_drive:
    update(t, left_vol, right_vol)

    причём эмулятор AY - на выходе тот же sound_drive. он говорит звуковому движку, на каком такте AY поменялись регистры ЦАПов и всё

    самое вкусное - если выводить с частотой 200KHz, либа сама красиво переведёт в 44.1/48/96 или сколько ей сказали при старте
    Последний раз редактировалось SMT; 11.08.2010 в 22:39.

  4. #63
    Guru Аватар для newart
    Регистрация
    19.01.2005
    Адрес
    Санкт-Петербург
    Сообщений
    11,441
    Спасибо Благодарностей отдано 
    192
    Спасибо Благодарностей получено 
    145
    Поблагодарили
    61 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SMT Посмотреть сообщение
    именно так я и сделал
    например, вывод в sound_drive:
    update(t, left_vol, right_vol)

    причём эмулятор AY - на выходе тот же sound_drive. он говорит звуковому движку, на каком такте AY поменялись регистры ЦАПов и всё

    самое вкусное - если выводить с частотой 200KHz, либа сама красиво переведёт в 44.1/48/96 или сколько ей сказали при старте
    Здорово.
    Но посолько либы нет, остается только облизываться и смотреть как буржуи клепают очередной ретро[*****]трекер.

  5. #64
    Veteran Аватар для SMT
    Регистрация
    16.01.2005
    Адрес
    Бобруйск
    Сообщений
    1,267
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от newart Посмотреть сообщение
    Здорово.
    Но посолько либы нет, остается только облизываться и смотреть как буржуи клепают очередной ретро[*****]трекер.
    это потому что задача неразрешимая в рамках имеющихся либ. с одной стороны, ты хочешь потактовую точность, а с другой стороны, не хочешь возиться со звуковыми буферами, а чтобы само играло

    если играет само, асинхронно, то и точность плюс-минус лапоть. единственный выход - трекерное АПИ аля BASS. ты точно задаёшь параметры семпла (например, для бипера - амплитуду, скважность и т.п. для цифрового AY-семпла - сами данные семпла и частоту дискретизации), а потом, когда захочешь, ставишь семпл в канал. но такой подход потребует существенного дописывания библиотек

    ---------- Post added at 23:42 ---------- Previous post was at 23:35 ----------

    хотя... не нужно делать метод "получить буффер", а нужно сделать метод "проиграть то, что накопилось в буфере". метод сделать синхронным: пока не доиграет - не возвращается. чтобы сами звуковые данные к тебе не приходили

    если есть желание этим пользоваться, могу на выходных попробовать завернуть в DLL

  6. #65
    Guru Аватар для newart
    Регистрация
    19.01.2005
    Адрес
    Санкт-Петербург
    Сообщений
    11,441
    Спасибо Благодарностей отдано 
    192
    Спасибо Благодарностей получено 
    145
    Поблагодарили
    61 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SMT Посмотреть сообщение
    хотя... не нужно делать метод "получить буффер", а нужно сделать метод "проиграть то, что накопилось в буфере". метод сделать синхронным: пока не доиграет - не возвращается. чтобы сами звуковые данные к тебе не приходили
    C моей стороны это как будет выглядеть?

  7. #66
    Veteran Аватар для SMT
    Регистрация
    16.01.2005
    Адрес
    Бобруйск
    Сообщений
    1,267
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от newart Посмотреть сообщение
    C моей стороны это как будет выглядеть?
    как-то так:
    Код:
    hMixer = create_mixer(44100, 100000 /* размер буфера в семплах */);
    
    hBeeper = create_render(hMixer, 3500000 /* тактовая частота, в которой меряется beeper_tick */ );
    beeper_tick = 0;
    
    hAY = create_ay(hMixer, 3500000);
    ay_tick = 0;
    
    // зададим какой-нибудь тон и пусть играет. больше регистры трогать не будем
    set_reg(hAY, 1, 10);
    set_reg(hAY, 8, 15);
    set_reg(hAY, 7, 254);
    
    begin:
    // на бипере будем играть прерывистые гудки
    
    // пошёл гудок
    x=0
    for i=0 to 1000000 step 500 
      update(hBeeper, beeper_tick);
      set_volume(hBeeper, x, x); // ставим x в левый и правый канал
      x = 5000-x; // инвертируем бит на бипере
      beeper_tick = beeper_tick + 500; // 500 тактов между фронтами = 3.5khz
    next i
    
    // пошла пауза
    beeper_tick = beeper_tick + 1000000
    update(hBeeper, beeper_tick);
    
    play(hMixer); // здесь play ничего не проиграет, потому что к миксеру привязано два устройства, а вывод прошёл только в одно (play играет семплы до минимального из update-тиков всех устройств на миксере)
    
    // теперь играем AY
    // поскольку мы договорились, что он будет играть ровный тон,
    // пусть всё делает сам - регистры не трогаем
    ay_tick = ay_tick + 2000000; // важно: со времененм не должно сильно отставать или убегать от beeper_tick
    update(hAY, ay_tick);
    
    play(hMixer); // выводим, сколько накопилось. в принципе, можно вызывать вообще после любого update() - хуже не будет
    
    goto begin; // зацикливаем
    beeper_tick и ay_tick - это 64-битные переменные. бейсик это поддерживает?

    для использования в трекере тебе всё-таки придётся писать BASS-оподобный движок )) чтобы он сам крутился в цикле и делал нужные update() на девайсах, анализируя, какие семплы в каких каналах сейчас играют. всё это ещё должно быть интерактивным, играть от кнопок юзера. не пугает?
    Последний раз редактировалось SMT; 12.08.2010 в 00:58.

  8. #67
    Guru Аватар для newart
    Регистрация
    19.01.2005
    Адрес
    Санкт-Петербург
    Сообщений
    11,441
    Спасибо Благодарностей отдано 
    192
    Спасибо Благодарностей получено 
    145
    Поблагодарили
    61 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SMT Посмотреть сообщение
    set_volume(hBeeper, x, x); // ставим x в левый и правый канал
    Откуда у 1-битного бипера левый и правый канал?

    ---------- Post added at 01:08 ---------- Previous post was at 01:07 ----------

    Цитата Сообщение от SMT Посмотреть сообщение
    beeper_tick и ay_tick - это 64-битные переменные. бейсик это поддерживает?
    Конечно.

  9. #68
    Veteran Аватар для SMT
    Регистрация
    16.01.2005
    Адрес
    Бобруйск
    Сообщений
    1,267
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от newart Посмотреть сообщение
    Откуда у 1-битного бипера левый и правый канал?
    универсальная функция, для эмуляции любых девайсов с ЦАПами от бипера до стерео-ковокса, саунд-драйва и т.д.. для бипера L и R надо ставить одинаковые

  10. #69
    Guru Аватар для newart
    Регистрация
    19.01.2005
    Адрес
    Санкт-Петербург
    Сообщений
    11,441
    Спасибо Благодарностей отдано 
    192
    Спасибо Благодарностей получено 
    145
    Поблагодарили
    61 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А что физически делают функции update и play?

  11. #70
    Veteran Аватар для SMT
    Регистрация
    16.01.2005
    Адрес
    Бобруйск
    Сообщений
    1,267
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от newart Посмотреть сообщение
    А что физически делают функции update и play?
    update(hDevice, t) эмулирует устройство от предыдущего такта t0 до текушего t. у каждого девайса есть свой указатель записи в буфер миксера. все семплы, сгенерированные за период от t0 до t записываются (точнее, выполняется операция сложения) в буфер миксера.

    play(hMixer) смотрит указатели записи всех девайсов на миксере, выбирает из них минимальный. у миксера есть указатель чтения из буфера. в буфере проссумированы и готовы к выводу семплы всех устройств от указателя чтения до минимального из указателей записи. этот фрагмент извлекается из буфера и ставится в очередь WAV-плеера. указатель чтения увеличивается на число семплов, переданных плееру.

    можно для удобства разделить play на 2 функции:
    get_ready_samples(hMixer) - чтобы узнать, сколько семплов в буфере готовы и play_samples(hMixer, n), чтобы передать из буфера миксера в плеер n семплов начиная от позиции чтения и увеличить позицию чтения на n
    Последний раз редактировалось SMT; 12.08.2010 в 07:31.

Страница 7 из 8 ПерваяПервая ... 345678 ПоследняяПоследняя

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

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

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

Похожие темы

  1. Zx Windows :-)
    от flydream в разделе Оси
    Ответов: 84
    Последнее: 06.03.2007, 22:49
  2. Turbosound ver.2
    от Mike в разделе Звук
    Ответов: 30
    Последнее: 14.04.2006, 10:20
  3. Процедура детекта TurboSound.
    от Shiru в разделе Программирование
    Ответов: 21
    Последнее: 27.05.2005, 18:45

Ваши права

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