Pacote Use-Sound: Efeitos sonoros em aplicativos React

Talvez o fato seja que eu estava profissionalmente envolvido em som, mas quero que a Web seja mais alta.

Eu sei que muitos não vão me apoiar nesse desejo. E não sem razão! Historicamente, os sons na Internet eram usados ​​de maneira extremamente malsucedida e feia:

  • Nos primeiros dias da web, algumas páginas tocavam música MIDI de fundo.
  • Os golpistas pop-up usam sons para atingir seus objetivos ruins. Eles, com a ajuda dos sons, procuram atrair a atenção dos usuários e tornar a fraude mais crível.
  • O som está presente nos vídeos iniciados automaticamente (bem, isso é absolutamente um pesadelo).

É verdade que tenho certeza de que abandonar completamente o som é como se uma criança fosse espirrada em água. Os sons podem enfatizar as ações do usuário e melhorar o feedback. O som pode iluminar algumas ações chatas. Se os sons nas páginas da web forem usados ​​com bom gosto, eles podem melhorar a experiência do usuário no projeto, tornando-o mais "tangível" e real. Essa idéia não é nova: em jogos e em aplicativos móveis, os sons são constantemente usados. De fato, a web é uma estranha exceção à tendência geral. A maioria dos produtos digitais que vêm à minha mente usa sons. Não estou falando da resposta tátil usada em aplicativos móveis para aproximá-los da realidade.





No decorrer do trabalho no meu blog, eu queria experimentar o som. Muitos dos elementos de interface do meu blog com os quais os usuários interagem produzem sons curtos e silenciosos. Por exemplo, na parte superior direita da página inicial do blog , existem alguns botões para alternar entre temas e ativar e desativar o som.

Como os sons na web raramente são usados, seu uso pode ter um grande impacto na percepção do site pelos usuários. Esse é um tipo de arma secreta do desenvolvedor, cuja utilização pode levar a um impacto positivo surpreendentemente grande em determinados projetos.

Para simplificar o uso de sons, projetei o gancho usado por mim para trabalhar com sons na forma de um pacote npm independente use-sounde o publiquei. Aqui vou falar sobre os recursos deste gancho e compartilhar dicas sobre o uso de som na web.

Se você está ansioso para ver o código e começar a usar esse gancho - aqui está o repositório do GitHub.

Visão geral


O pacote use-soundé um gancho React que ajuda os desenvolvedores a usar efeitos sonoros. Aqui está um exemplo:

import useSound from 'use-sound';
import boopSfx from '../../sounds/boop.mp3';
const BoopButton = () => {
  const [play] = useSound(boopSfx);
  return <button onClick={play}>Boop!</button>;
};

O uso desse gancho adiciona aproximadamente 1 Kb à compilação do projeto. É verdade que ele, no modo assíncrono, carrega uma dependência de furo de terceiros , cujo tamanho é 10 KB.

O gancho oferece ao desenvolvedor muitos recursos interessantes. Entre eles, quero observar o seguinte:

  • Pare prematuramente a reprodução, bem como pause e retome a reprodução.
  • Baixando algo como uma "folha de sprite" e dividindo-a em sons separados.
  • Definir a velocidade de reprodução com a capacidade de acelerar e diminuir a reprodução de sons.
  • Muitos ouvintes de eventos.
  • Muitos recursos avançados disponíveis graças ao Howler.

Aqui está a documentação do gancho, na qual você pode encontrar um guia detalhado sobre seu uso e referência de API.

Noções básicas sobre o uso do som


▍Instalação


Primeiro você precisa instalar o pacote usando yarn ou npm:

#  yarn
yarn add use-sound
#  NPM
npm install use-sound

▍ Importação


O pacote use-soundexporta o único valor padrão - este é um gancho useSound. Você pode importá-lo assim:

import useSound from 'use-sound';

Além disso, você precisará importar os arquivos de áudio que planeja usar.

Se, ao trabalhar em projetos React, você usar algo como create-react-appGatsby, poderá importar arquivos MP3 da mesma maneira que importa outros recursos, como imagens:

import boopSfx from '../../sounds/boop.mp3';

Se você usar uma configuração auto-escrita do Webpack, precisará usar o carregador do carregador de arquivos para processar arquivos .mp3 .

Além disso, você pode trabalhar com arquivos de som colocados em pastas publicou static. Por exemplo, as demos mostradas neste artigo usam arquivos estáticos localizados em uma pasta pública.

Pesquise e prepare sons


Instalar dependências e escrever código é apenas metade da batalha. Para páginas de pontuação, precisamos selecionar os sons apropriados.

Meu recurso favorito para procurar sons é o freesound.org . Quase todos os sons usados ​​no meu blog, eu encontrei lá. Existem muitos sons licenciados sob o Creative Commons Zero . Para baixar arquivos, você precisa se registrar no recurso. Você pode usar sons de graça.

Esteja preparado para o fato de que, para selecionar o som certo, você deve vasculhar seriamente o conteúdo do freesound.org. O ponto aqui é, por exemplo, que muitos sons são de baixa qualidade. O processo de encontrar o som certo pode ser comparado ao processo de procurar uma agulha no palheiro. E a preparação do som encontrado para uso real se assemelha a uma faceta de diamante não lapidado.

▍Preparação de sons


Muitos sons retirados do freesound.org precisam de algumas melhorias:

  • Sons, como cordas, podem ser enquadrados por espaços vazios. Os fragmentos de silêncio são geralmente cortados, como resultado, o efeito sonoro correspondente é reproduzido imediatamente após a ocorrência do evento sonoro.
  • Ao preparar sons, pode ser necessário ajustar o volume deles, fazendo com que todos os sons usados ​​em um projeto tenham o mesmo volume.
  • O Freesound.org possui sons armazenados em vários formatos de áudio. Você pode muito bem precisar converter os sons que você gosta em MP3.

Você pode usar o Audacity para concluir todas essas edições. Este é um editor de áudio multiplataforma de código aberto gratuito. Aqui não vou falar sobre como usar este editor, mas existem muitos ótimos tutoriais.

Por que estou falando sobre a conversão de sons para MP3? O fato é que antes não havia formato de áudio suportado por todos os navegadores. Portanto, era comum incluir arquivos MP3, AIFF e WAV em projetos e usá-los em ambientes que os suportam.

Em condições modernas, felizmente para nós, o formato MP3 é suportado por todos os principais navegadores, incluindo o IE 9. O som armazenado no formato MP3 também é muito bem compactado. E isso permite que você acesse arquivos muito menores do que usar formatos alternativos que codificam o som sem perda de qualidade.

Som e disponibilidade


Embora eu defenda o uso de sons na web, admito que nem todos os usuários vão gostar. E aqui estamos falando de considerações que vão além do desejo subjetivo de silêncio.

Pessoas com problemas de visão usam leitores de tela para usar páginas da web. Além disso, estamos falando não apenas daqueles que não veem as páginas. Os leitores de tela, por exemplo, são usados ​​por pessoas com dislexia que acham difícil perceber o texto e pessoas com outros problemas semelhantes. Leitores de tela são programas que analisam documentos e leem textos. Se um site contiver muitos efeitos sonoros, eles poderão interferir na operação normal de programas que lêem texto na tela. E isso, por sua vez, impedirá que as pessoas que dependem desses programas trabalhem com o site.

Por esse motivo, é importante que um botão para ativar e desativar o som seja incluído nas páginas do site. Além disso, esse botão deve estar disponível para navegação no teclado (usando a tecla Tab). Idealmente, até que o usuário chegue a esse botão usando a tecla Tab, nenhum som deve ser reproduzido. Além disso, é necessário que o projeto da Web lembre o estado desse botão - para que o usuário não precise constantemente recorrer a ele para silenciar o som.

Por outro lado, os usuários com deficiência auditiva nem sabem que certas interações com as páginas são acompanhadas por som. O mesmo se aplica às pessoas que trabalham na Internet com o som desligado. Por esse motivo, é importante não confiar apenas no som ao executar determinadas ações importantes. Se o som for usado como confirmação de alguma ação do usuário, verifique se uma confirmação visual dessa ação também é exibida na página. Os sites devem permanecer totalmente funcionais e sem som.

Receitas


Dê uma olhada em alguns exemplos (na seção correspondente do original deste artigo, você pode experimentar com eles interativamente e ouvir os sons emitidos por diferentes controles).

▍ caixa de seleção


Eu realmente gosto desta bandeira. Se você usar um mouse, clique nele rapidamente e, em seguida, para que haja uma pequena pausa entre o momento em que você clica e solta o botão do mouse.

function Demo() {
  const [isChecked, setIsChecked] = React.useState(
    false
  );

  const [playActive] = useSound(
    '/sounds/pop-down.mp3',
    { volume: 0.25 }
  );
  const [playOn] = useSound(
    '/sounds/pop-up-on.mp3',
    { volume: 0.25 }
  );
  const [playOff] = useSound(
    '/sounds/pop-up-off.mp3',
    { volume: 0.25 }
  );

  return (
    <Checkbox
      name="demo-checkbox"
      checked={isChecked}
      size={24}
      label="I agree to self-isolate"
      onChange={() => setIsChecked(!isChecked)}
      onMouseDown={playActive}
      onMouseUp={() => {
        isChecked ? playOff() : playOn();
      }}
    />
  );
}

▍ Interrupção precoce da reprodução do som


Às vezes, você deseja que o som seja reproduzido apenas quando o usuário interage com um determinado controle. Preste atenção à maneira no exemplo a seguir de que o som é reproduzido apenas quando o ponteiro está acima do controle.

function Demo() {
  // ,  ,  'rising-pops' :
  // - fanfare
  // - dun-dun-dun
  // - guitar-loop
  const soundUrl = '/sounds/rising-pops.mp3';

  const [play, { stop }] = useSound(
    soundUrl,
    { volume: 0.5 }
  );

  const [isHovering, setIsHovering] = React.useState(
    false
  );

  return (
    <Button
      onMouseEnter={() => {
        setIsHovering(true);
        play();
      }}
      onMouseLeave={() => {
        setIsHovering(false);
        stop();
      }}
    >
      <ButtonContents isHovering={isHovering}>
        Hover over me!
      </ButtonContents>
    </Button>
  );
}

PitchAumento do passo


E aqui está um exemplo de um efeito interessante. Consiste no fato de que o som reproduzido pelo próximo clique no botão Curtir é superior ao som reproduzido pelo clique anterior:

function Demo() {
  const soundUrl = '/sounds/glug-a.mp3';

  const [playbackRate, setPlaybackRate] = React.useState(0.75);

  const [play] = useSound(soundUrl, {
    playbackRate,
    volume: 0.5,
  });

  const handleClick = () => {
    setPlaybackRate(playbackRate + 0.1);
    play();
  };

  return (
    <Button onClick={handleClick}>
      <span role="img" aria-label="Heart">
      </span>
    </Button>
  );
}

▍ Botão para iniciar e pausar a reprodução


Aqui está o código de implementação para o botão iniciar e pausar o som, o que o ajudará a desenvolver o novo Spotify:

function Demo() {
  const soundUrl = '/sounds/guitar-loop.mp3';

  const [play, { stop, isPlaying }] = useSound(soundUrl);

  return (
    <PlayButton
      active={isPlaying}
      size={60}
      iconColor="var(--color-background)"
      idleBackgroundColor="var(--color-text)"
      activeBackgroundColor="var(--color-primary)"
      play={play}
      stop={stop}
    />
  );
}

OundSom "listas de sprites"


Se você planeja usar muitos sons em seu componente React, pode fazer sentido usar “listas de sprites” de som. A lista de sprites de som é um arquivo que contém muitos sons diferentes. Empacotando-os em um único arquivo, aumentamos a conveniência de trabalhar com eles e evitamos fazer muitas solicitações HTTP paralelas para baixar arquivos individuais (espero que um dia possamos usar a multiplexação HTTP / 2).

Aqui usamos o som "lista de sprites" para criar uma bateria eletrônica. Você pode jogar bobinas virtuais com o mouse ou com as teclas de 1 a 4 no teclado.

function Demo() {
  const soundUrl = '/sounds/909-drums.mp3';

  const [play] = useSound(soundUrl, {
    sprite: {
      kick: [0, 350],
      hihat: [374, 160],
      snare: [666, 290],
      cowbell: [968, 200],
    }
  });

  //  ,   'keydown',
  //    .
  useKeyboardBindings({
    1: () => play({ id: 'kick' }),
    2: () => play({ id: 'hihat' }),
    3: () => play({ id: 'snare' }),
    4: () => play({ id: 'cowbell' }),
  })

  return (
    <>
      <Button
        aria-label="kick"
        onMouseDown={() => play({ id: 'kick' })}
      >
        1
      </Button>
      <Button
        aria-label="hihat"
        onMouseDown={() => play({ id: 'hihat' })}
      >
        2
      </Button>
      <Button
        aria-label="snare"
        onMouseDown={() => play({ id: 'snare' })}
      >
        3
      </Button>
      <Button
        aria-label="cowbell"
        onMouseDown={() => play({ id: 'cowbell' })}
      >
        4
      </Button>
    </>
  );
}

Detalhes sobre o uso de "listas de sprites" no pacote use-soundpodem ser encontrados aqui .

Sumário


Na área do uso de sons no desenvolvimento de sites, estou mais preocupado com o fato de que essa é uma área que foi estudada muito pouco. Estou experimentando sons há algum tempo, mas ainda sinto que estou apenas no início da jornada.

Portanto, agora você tem ferramentas à sua disposição que podem ser usadas para iniciar seus próprios experimentos com som. Sugiro que você faça isso e descubra aonde isso o levará.

Queridos leitores! Como você se sente ao usar sons em páginas da web?


All Articles