Skip to content

Crear Sonidos Personalizados

Preparando el archivo del sonido

Tus archivos de sonido tienen que estar formateados de una manera específica. OGG Vorbis es un formato de contenedor abierto para datos multimedia, como audio, y es usado para los archivos de sonido de Minecraft. Para evitar problemas con la manera en que Minecraft maneja el distanciamiento, tu audio tiene que tener solo un canal (Mono).

Muchos software de DAWs (Estaciones de Trabajo de Audio Digitales) modernos pueden importar y exportar usando este formato de archivo. En el siguiente ejemplo el software gratuito y de fuente abierta "Audacity" será usado para traer el archivo de sonido al formato correcto, aunque cualquier otro DAW debería ser suficiente también.

archivo de sonido sin preparar en Audacity

En este ejemplo, un sonido de un silbido es importado a Audacity. Actualmente está guardado como un archivo ".wav" y tiene dos canales de audio (Stereo). Edita el sonido a tu gusto y asegúrate de eliminar uno de los canales usando el menú desplegable encima del "track head" (cabeza de pista).

dividiendo la pista Estereo

eliminando uno de los canales

Al exportar o renderizar el archivo de audio, asegúrate de elegir el formato de archivo OGG. Algunos DAWs, como REAPER, pueden soportar múltiples capas de audio de OGG. En este caso, OGG Vorbis debería funcionar bien.

exportar como archivo OGG

También ten en cuenta que los archivos de audio pueden aumentar el tamaño de tu mod drásticamente. Si es necesario, comprime el audio cuando lo edites y exportes el archivo para mantener el tamaño de tu producto final a un mínimo.

Cargando El Archivo de Audio

Agrega un nuevo folder resources/assets/<mod id here>/sounds para los sonidos en tu mod, y pon el archivo de audio exportado metal_whistle.ogg ahí.

Continúa creando el archivo resources/assets/<mod id here>/sounds.json si no existe todavía y agrega tu sonido a las entradas de sonido.

json
{
    "metal_whistle": {
      "subtitle": "sound.fabric-docs-reference.metal_whistle",
      "sounds": [
        "fabric-docs-reference:metal_whistle"
      ]
    }
  }

La entrada de subtítulo provee más contexto para el jugador. El nombre del subtítulo es usado en los archivos de lenguaje en el folder de resources/assets/<mod id here>/lang y serán mostrados si la opción de subtítulos en el juego es activada y el sonido personalizado está siendo reproducido.

Registrando el Sonido Personalizado

Para agregar el sonido personalizado al mod, registra un SoundEvent (Evento de Sonido) en la clase que implemente la interfaz ModInitializer.

java
Registry.register(Registries.SOUND_EVENT, new Identifier(MOD_ID, "metal_whistle"),
        SoundEvent.of(new Identifier(MOD_ID, "metal_whistle")));

Limpiando El Desorden

Dependiendo de cuantas entradas de Registro hayan, las cosas pueden enredarse rápidamente. Para evitar eso, podemos hacer uso de una nueva clase ayudante.

Agrega dos nuevos métodos a la nueva clase ayudante creada. Uno, que registre todos los sonidos y uno que es usado para inicializar esta clase en primer lugar. Después de eso, puedes agregar nuevos miembros estáticos de SoundEvent cómodamente como sea necesario.

java
public class CustomSounds {
	private CustomSounds() {
		// private empty constructor to avoid accidental instantiation
	}

	// ITEM_METAL_WHISTLE is the name of the custom sound event
	// and is called in the mod to use the custom sound
	public static final SoundEvent ITEM_METAL_WHISTLE = registerSound("metal_whistle");

	// actual registration of all the custom SoundEvents
	private static SoundEvent registerSound(String id) {
		SoundEvent sound = SoundEvent.of(new Identifier(FabricDocsReferenceSounds.MOD_ID, id));
		return Registry.register(Registries.SOUND_EVENT, new Identifier(FabricDocsReferenceSounds.MOD_ID, id), sound);
	}

	// This static method starts class initialization, which then initializes
	// the static class variables (e.g. ITEM_METAL_WHISTLE).
	public static void initialize() {
		FabricDocsReferenceSounds.LOGGER.info("Registering " + FabricDocsReferenceSounds.MOD_ID + " Sounds");
		// Technically this method can stay empty, but some developers like to notify
		// the console, that certain parts of the mod have been successfully initialized
	}
}

De esta manera, la clase implementadora de ModInitializer solo tiene que implementar una línea para registrar todos los SoundEvents personalizados.

java
public class FabricDocsReferenceSounds implements ModInitializer {
	public static final String MOD_ID = FabricDocsReference.MOD_ID;
	public static final Logger LOGGER = FabricDocsReference.LOGGER;

	@Override
	public void onInitialize() {
		// This is the basic registering. Use a new class for registering sounds
		// instead, to keep the ModInitializer implementing class clean!
		Registry.register(Registries.SOUND_EVENT, new Identifier(MOD_ID, "metal_whistle"),
				SoundEvent.of(new Identifier(MOD_ID, "metal_whistle")));

		// ... the cleaner approach.
		CustomSounds.initialize(); 
		FabricDocsReferenceItems.initialize(); 
	}
}

Usando el SoundEvent Personalizado

Use la clase ayudante para acceder el SoundEvent personalizado. Echa un vistazo a la página de Reproducir SoundEvents (Eventos de Sonido) para aprender a reproducir sonidos.