2010-05-11 2 views
3

У меня есть два звуковых файла:Looping музыка с интро в XNA с использованием Soundeffect

  • Звук А является 18 второй интро предназначены для воспроизведения один раз
  • Sound B является 1 минута перекручивание трек

Я хотел бы воспроизвести Звук A один раз, затем, как только звук A будет выполнен, немедленно воспроизведите Звук B и продолжайте циклический звук B до тех пор, пока я не остановлю его. Предполагается, что это будет циклическая городская музыка в RPG.

Я пробовал делать это в коде, используя только SoundEffect, но есть крошечный, но заметный промежуток между концом звука A и началом звука B. Даже если я поставлю контрольный код, наблюдая за SoundEffectInstance.State Sound A в Функция Update(), я не смог запустить Sound B точно, когда Sound A заканчивается так, чтобы он был бесшовным.

Я бы предпочел использовать SoundEffect, потому что я могу загружать файлы WMA, а не застревать с WAV в XACT.

ответ

2

Возможный второй вариант. Я предполагаю, что разрыв, который вы слышите, вероятно, потому, что второй звук должен быть либо загружен в память, либо инициализирован, либо поток открыт (не уверен в внутренней реализации). Но если это так, то мне интересно, если вы могли бы сделать что-то вроде этого:

  1. нагрузки два звуковых эффектов (а и б)
  2. Начните играть звуковой эффект
  3. сразу же начать играть звуковой эффект B
  4. пауза звуковой эффект B после того, как один кадр
  5. , когда звуковой эффект заканчивает, перезапустите звуковой эффект

Мое предположение, что, поскольку звуковой эф fect B уже инициализирован, он может запускаться быстрее, тем самым уменьшая воспринимаемый разрыв. Хотелось бы услышать, если у вас есть шанс попробовать это, и будет ли это работать :-)

+0

Пробовал, но безрезультатно. Звучит точно так же. Для записи я загружаю и создаю одновременно SoundEffectInstances, в LoadContent(). Не думайте, что проблема связана с загрузкой ресурсов. Вначале я получил дополнительный шум, но я смог остановить это, установив том SoundEffectInstance на 0, прежде чем я нажму Play(). Плюс, оказывается, что мои WMA превращаются в WAV от импортера контента SoundEffect от XNA. Argh. Я не в состоянии решить эту проблему.Я пытаюсь создать RPG, но у меня не может быть 1 ГБ музыки, потому что это все в формате WAV. –

+0

О, ну, эта конкретная проблема на самом деле не проблема :-) см. «Сжатие звука в Xact» http://blogs.msdn.com/mitchw/archive/2007/04/27/audio-compression-using-xact .aspx –

+3

Лучшее решение, которое я мог бы найти: создать один звуковой банк. Перетащите оба WAV из Волнового банка в тот звуковой банк. Каждый из них должен быть отдельной дорожкой. Циклической дорожкой должен быть трек 2. Выберите его на уровне Play Wave, проверьте бесконечный цикл и (в решающей степени) установите его метку времени как точную длину входящей части. Вы можете указать до трех знаков после запятой. Я использовал программу Audacity, чтобы получить точную длину интро-песни. О, и следуйте ссылке сжатия Джоэля. Это уменьшит размер вашего WAV-файла на 3/4. –

2

К сожалению, простота в API SoundEffect оплачивается за счет уменьшения гибкости. Этот тип аудиопрограмм - это то, что XACT превосходит ... если вам требуется сложная композиция, тогда вы, вероятно, захотите исследовать переход на XACT.

+0

Я рассматривал вопрос о многочастности, но это может вызвать у меня проблемы. В частности: как это работает в XACT? Эта программа является абсолютным кошмаром для использования. Мне бы очень понравились точные, щелкнуть-вот-вот-вот инструкции о том, как делать такой звук в XACT, потому что я не могу понять это только по умозаключениям. –

+0

Хех, достаточно справедливое заявление :-) Я лично этого не сделал, но я полагаю, что это будет сделано с помощью функции перехода: http://msdn.microsoft.com/en-us/library/ee415994%28v = VS.85% 29.aspx –

+0

Не видел этот документ раньше. Выглядит многообещающе. Спасибо, Джоэл. –

Смежные вопросы