SAM VERDE: Oi, todo mundo. Bem-vindo ao nosso seminário. O meu nome é Sam. HUGH ZABRISKIE: Eu sou Hugh. SAM VERDE: E nós estamos indo falar hoje sobre a API JavaScript e Web Audio. Só para começar, este é um esboço da nossa agenda para o seminário. Vamos começar falando sobre por que você deve estar interessado na Web API de áudio, por que é JavaScript o idioma que você precisa para isso, e, em seguida, falar sobre o JavaScript essentials-- assim como, orientá-lo através de alguns conceitos básicos da linguagem, e, em seguida, falar sobre o API de áudio a um nível elevado. Então, Hugh vai falar sobre alguns das fases de produção de áudio e, em seguida, esta demonstração impressionante sequenciador projeto que ele construiu e mostrar-lhe o código. E então, nós vamos ter tempo para perguntas no final para as pessoas que estão aqui vivem. HUGH ZABRISKIE: Cool. SAM VERDE: Cool. HUGH ZABRISKIE: Cool. Vou fazer o backup. SAM VERDE: Então, as primeiras coisas primeiro. Portanto, uma das grandes coisas sobre a API de áudio Web é que não há nenhuma configuração necessária. Ele vem embutido para a maioria dos navegadores modernos, incluindo Chrome, Edge, um todo bando de outros- todos os que grandes porções de as pessoas estão usando hoje. Portanto, há nenhum configurado, além de apenas começando um servidor web vai, por você começar a trabalhar em seu projeto, o que é ótimo. Recomendamos bonita fortemente que você considere usando Chrome para JavaScript desenvolvimento web, só porque seu desenvolvedor ferramentas são realmente fortes. Como um exemplo de apenas o que queremos dizer dizendo abrir o seu JavaScript console-- se você entrar em Chrome e você olhar para qualquer página da web, e você clique esquerdo Inspect Element, e, em seguida, você vai para esta pequena drop-down aqui e você clicar em Console, você verá o que abre parece um muito parecido com um prompt de comando que você pode ver no seu Mac, ou no ID. E assim, nós podemos Tipo de comandos aqui, como Limpar, e outros comandos como esse. Nós podemos criar variáveis, como vamos ver mais tarde em JavaScript. E então qualquer coisa que podemos fazer em JavaScript, o que podemos fazer com o console, e isso é uma maneira super útil para começar a brincar com APIs e ficar confortável com JavaScript direita fora do bastão. Nenhuma configuração necessária, que é muito bom. Frio. Fantástica. Então, só mais uma coisa a acrescentar. Se você tiver qualquer perguntas-- existem muitos de vocês que não estão aqui vivem, sinta-se livre para e-mail US-- estes são nossos endereços de e-mail. Se você tiver dúvidas você não quer perguntar-nos, como, oh Eu tenho um bug no meu código, ou algo assim isso é um pouco mais específico, Talvez o Google primeiro. Há um monte de grandes recursos sobre a Áudio API Web lá fora. É realmente bem documentado e está sendo usado por uma tonelada de pessoas em da indústria, e as pessoas que estão apenas construção de coisas divertidas para si próprios. Então, não deve haver uma grande quantidade de recursos lá fora. Fantástica. Cool, então por que a API de áudio Web? Este diagrama é um pouco de uma evolução da maneira som na web tem crescido ao longo do tempo. Bgsound era como o tag HTML original que o Internet Explorer utilizada para apoiar. É permitido somente para sons bastante básicas, a funcionalidade não foi muito robusta, e você não poderia fazer sequenciação complicado, ou quando o som começou a controlar e parou muito robusta. Assim, não foi particularmente bem desenvolvido. Em seguida, depois disso, o Flash along-- veio que, Tenho certeza de que vocês são todos familiarizados com Flash-- talvez não como ele funciona, mas você certamente já viu. Você tem que atualizar o seu Flash Plug-in, todo esse tipo de coisa, e que certamente ampliou a gama de funcionalidade que estava disponível. Mas fazer o usuário instale um plug-in é definitivamente uma desvantagem para o Flash, incluindo na sua aplicação, certo? Porque então você é dependente do usuário e vai encontrar este plug-in, e, provavelmente, a ser transformado fora por este passo extra eles têm que tomar para usar a sua aplicação. E, em seguida, poderia haver uma atualização que vai quebrar toda a sua aplicação, e ele acaba sendo um pesadelo para o desenvolvedor também. Então isso foi uma barricada. E então, depois que veio junto, a tag HTML de áudio, o que é uma característica da HTML-- mais moderno que certamente permitido para muito mais coisas, mas mesmo as coisas que você poderia fazer lá foram um pouco limitado apenas como resultado de as coisas HTML que era capaz. Assim, quando o JavaScript API, a API de áudio da Web, tornou-se um padrão praticar em todos os navegadores, que realmente ampliaram o conjunto de oportunidades para desenvolvedores para realmente entrar no edifício material legal para a web. Durante muito tempo não tinha sido ferramentas realmente robustos para aplicações de áudio nativo, como-- todos sabem GarageBand, e então, obviamente, existem mais aplicações de áudio profissional, misturando e esse tipo de coisa. Mas não havia uma realmente bom não Cloud-- Nuvem, sim, eu acho Plataforma baseada na web Cloud-- que permitiria aos desenvolvedores construir aplicações para as pessoas fazer mixagem de áudio. E como ele irá mostrar-lhe depois, o API Audio Web permite realmente poderoso coisas para acontecer realmente simplesmente, que é muito legal. Então essa é a instrução que motivo você deve ver o resto do seminário, basicamente. E agora, eu estou indo para falar sobre alguns elementos básicos apenas JavaScript-- da língua, de modo que que pode ser na mesma página quando falamos sobre o API um pouco mais tarde. Frio. Então, este é um resumo. Esqueci-me que isto estava aqui. Sim. HUGH ZABRISKIE: Há dois slides aqui. SAM VERDE: Este é o resumo de algumas das limitações dos outros, métodos antigos de ligação. E então agora, nós temos essas coisas. Frio. Fantástica. Então, fundamentos de JavaScript. Primeiro de tudo, há uma diferença bastante significativo em JavaScript em um contra linguagem como C, na forma que as variáveis ​​são criados. Assim, em C, que está acostumado a ter digitar as nossas variáveis, certo? E eu não quero dizer tipo como digitá-los, quero dizer Tipo como atribuir-lhes um significado type-- como, um int, float, um char. Em C, nós estávamos realmente usado para ter que criar uma variável e, em seguida, ficar com esse tipo para o tempo inteiro que nós usamos essa variável. E isso não é necessariamente pior, mas é provavelmente mais difícil de usar. Um dos recursos interessantes de JavaScript que as variáveis ​​são o que é chamado "tipagem dinâmica", que significa que eu posso criar uma variável com que a sintaxe, varX é igual a 5, por exemplo. Que originalmente cria um inteiro variable-- à direita sob o capa somewhere-- mas eu pode mudar essa variável para se referir a uma cadeia sem fazer nada como criando uma nova variável. Eu não precisa se preocupar sobre o tipo de mudança. JavaScript sabe que o tipo de alterada, e isso acontece de forma dinâmica. Então, há benefícios e desvantagens para que, como qualquer um que trabalhou em JavaScript por algum tempo poderia saber. Há momentos em que Você pode acidentalmente alterar o tipo de uma variável e não lidar com esse tipo de mudança, e, em seguida, o seu JavaScript pode crash-- ou uma exceção ser jogado, porque você vai ter a Tipo de errado quando você espera um tipo. Frio. Então, scoping-- que é como, se nós lembre-se as primeiras semanas do curso, refere-se a uma variável como visível é e em que área do código. Tudo isso parece muito semelhante à maneira como ele olha em C. Assim, as variáveis ​​são escopo geral dentro de chaves dentro de uma função, e depois há também variáveis ​​globais de escopo que é-- se você escrever uma variável fora de uma função, será visível em todo o texto. Uma diferença entre JavaScript e C, em particular, é que se você declarar um mundial em qualquer lugar variável em um arquivo de texto é visível em qualquer função dentro desse arquivo de texto. Isso é correto, certo? HUGH ZABRISKIE: Yep. SAM VERDE: Assim que é também um pouco pouco descolados em comparação com C, onde sempre tivemos a nossa as definições das variáveis ​​acima dos lugares eles foram usados. Isso não é uma regra que é aplicada mais, portanto, um pouco diferente. E novamente apenas para enfatizar, mundial contra variables-- locais muito semelhante ao C. Você poderia ter duas variáveis ​​com o mesmo nome, e ter um dos seus nomes ser sombreada por uma variável local, se um deles era global. Assim tipo, semelhante de problemas que alguns de vocês pode ter executado em alguns do seu problema define até agora. Legal, de modo que é variáveis. Fluxo de controle, ou seja, como, se-else-- stuff-- lógico e loops. Então, para começar, isso é o que if-else declarações olhar como em JavaScript. A colocação das várias coisas sobre as linhas não é importante. Esta é apenas uma das convenções para o caminho de código estrutura de nós. Assim como em C, temos um "se", uma declaração parênteses. Isso não é o que eu quis fazer. Eu fiz de novo. HUGH ZABRISKIE: Tentando sair? SAM VERDE: Não, eu sou apenas tentando fazer zoom. Não importa. Então, nós temos um "if" e nós temos uma condição dentro dele que é avaliada como verdadeira ou falsa, e que determina se ou não nós entrar nesse bloco de código. E da mesma forma, temos um else-se e uma pessoa, assim como nós estamos acostumados a nos C. Você também deve ser bastante confortável logo de cara com loops, porque eles também olhar muito parecido com C parece. Mas você vai notar mais uma vez que nós ter, em vez de int initializations, temos initializations var. E eu acho que você tem ter cuidado para fazer certeza que você não alterar o valor de I a partir de um int para uma cadeia, por exemplo, porque isso vai causar um comportamento estranho talvez não esperar. Mas isso deve olhar bem familiar, bem. Então é aqui que as coisas começam a ficar um pouco louco em JavaScript para alguém que está indo de um fundo de C. Há funções em JavaScript, e não há uma maneira para declarar uma função que procura tipo de semelhante a C, e então há um outro que olha o tipo de diferente. A primeira versão, que podemos ver aqui, é uma espécie de C-like, onde podemos dizer, esta é uma função, dar-lhe um nome, dê- o número de argumentos, e, em seguida, o conteúdo da função ir para dentro dessas chaves. Vamos ver um exemplo de argumentos em apenas um segundo. Considerando que na próxima linha, vemos, oh, aqui está uma variável chamada "myFunction" e igualar a esta genérico function-- coisa-- que não parece ter nada acontecendo. A razão que é diferente que C é que o JavaScript é o que se chama uma linguagem funcional, ou tem elementos funcionais, o que significa funções que são, na verdade, valores. E isso significa que podemos definir uma variável para igualar uma função e depois passar essa função ao redor, passá-lo como um argumento, fazer todos os tipos de coisas assim com as funções. Uma outra coisa a note-- funções são escritos com um certo número de argumentos. Vamos ver um exemplo de uma função com um argumento no próximo slide. Mas JavaScript não vai gritar com você se você tentar usar uma função com a número errado de argumentos. Só vai fazer o seu melhor para fazer fazer, o que significa que se você passar, você chamar uma função que espera um discussão com nenhum argumento, tudo o que vai acontecer é que vai fazer o seu melhor para tentar executar esse código, e se, eventualmente, é executado em uma exceção ou um erro, ele vai lançar essa exceção e manter apenas going-- que é apenas uma das maneiras que JavaScript funciona. Sim. AUDIÊNCIA: O que acontece se há muitos argumentos? SAM VERDE: Então, a pergunta era: o que acontece se existem muitos argumentos? E a resposta é que JavaScript terá apenas ignorar os que estão depois os que espera. Ele vai tentar executar a função chamar como se fosse apenas os dois primeiros. Certo? HUGH ZABRISKIE: É verdade, sim. De igual modo, se houver são muito poucos argumentos, ele só tipo de dá nulo para todo o argumentos que não tem quaisquer valores para. SAM VERDE: o que pode na verdade, ser útil, se você quero escrever uma função que leva argumentos número variável. Você pode definir valores padrão no a definição da função, e pode ignorar o fato de que a entrada não está lá. Então, eu quero falar um pouco mais sobre esta última bala ponto, que é funções são valores. Este é um exemplo que é um pouco alucinante se você apenas lê-lo, e não acho que sobre o que está acontecendo por um segundo. Então, vamos olhar apenas no a primeira linha aqui. Nós temos essa variável, f1, que dizemos é uma função que faz esta coisa. E o conteúdo da função são console.log ('Olá'). Você pode pensar em como o console.log JavaScript equivalente de printf. Então, o que vai acontecer é, se nós executar este código no nosso navegador, ele vai imprimir uma string. Eu posso demonstrar isso. AUDIÊNCIA: por log, porém, é que isso significa que ele está sendo gravado em algum lugar? SAM VERDE: Yeah. Então eu vou lhe mostrar o que vai acontecer. Então, a pergunta era: o que é que quer dizer log? HUGH ZABRISKIE: Então console.log é como printf para C. SAM VERDE: Então console.log é como printf, por isso, se eu tenho esse console.log ('Olá'), e eu chamo isso, a string "Olá" será impresso para o console. Este é o console. É como printf, onde ele imprime para fora padrão. E vamos ver em um minuto, mas esta é realmente referindo-se ao objeto console, e chamar um método no objeto. Isso vai fazer mais sentido em um minuto quando começa a falar objetos em JavaScript, mas eu pensei que eu só iria mencionar isso. HUGH ZABRISKIE: Nós somos usado no C, direita-- costumamos escrever um grande programa no principal para fazer qualquer coisa. Mas o que é legal em JavaScript você é ter esse tipo de interpretador que executado em tempo real, por isso leva apenas linha por linha, ele pode apenas interpretar que na hora. E ele mantém o controle de coisas que foram executados antes, por isso, é uma ferramenta muito útil usar console.log, ou o console, geralmente, para apenas brincando ao redor com JavaScript. SAM VERDE: Então vai voltar a este example-- a segunda linha de código aqui é bastante incompreensível na minha cabeça. A primeira vez que li isso, como era, o que está acontecendo? Então, o que está acontecendo é, neste declaração de função diz: Eu tenho uma função chamada f2 que está esperando um argumento, f, e, em seguida, ele chama a função, f, que foi passado para ele como um argumento sem argumentos si. Então, isso poderia ter sido confuso. Se entendermos isso como F2 leva f1 como um argumento, e, em seguida, dentro de F2, f recebe called-- que meios que esta linha de código, Depois destas duas linhas de código, resulta em "Olá" sendo impresso para o console. O fato de que podemos passar funções ao redor como valores acaba sendo um dos mais poderosos recursos de JavaScript como uma linguagem de programação. Do lado de fora de todo o coisas impressionantes que pode fazer, assim como uma característica do língua, em termos da maneira que torna as coisas fáceis para programar e permite para as coisas que não são particularmente bem adequada para a web, programação funcional e funcional aspectos de programação de JavaScript é um dos mais conceitos que poderosos existe em JavaScript-- se você me perguntar. Frio. Então, a próxima coisa. Além de ser funcional, também existem elementos de JavaScript que são orientada a objetos, que é um dos muito palavras de zumbido populares em ciência da computação. Programação orientada a objeto é uma coisa realmente popular. JavaScript tem uma versão do que, onde eu acredito que cada valor é também um objeto, o que significa que cada objeto envolve em conjunto um certo número de valores. Assim, para valores que são simples, como um número inteiro, como varX é igual a 5, esse objeto apenas que envolve um valor. Mas também podemos imaginar uma situação where-- podemos pensar em situações em C onde queríamos fazer algo com estruturas, por exemplo, que envolve várias valores juntos e marcas realmente fácil de passar as coisas ao redor. Isso é quando um objeto está em JavaScript. É importante lembrar quando eu digo que os objetos embrulhados um certo número de valores em conjunto, que são também funções valores, o que significa que as funções podem também estar dentro de um objeto JavaScript. E a razão que é importante é que, ao passo que, muitas vezes, pensar em chamar um método em um objeto que é de um termo popular de outros linguagens orientadas a objetos populares, Uma das diferenças aqui é que tudo o que um método está em JavaScript é um valor guardado dentro de um objeto que realiza algumas Action-- possivelmente usando os outros valores que estão dentro desse objeto, mas não necessariamente. Então você pode imaginar uma situação, eu acho que em um pouco de uma maneira louca, onde um método chamado de um objeto em outro objeto, por exemplo. Então, é um pouco descolados dessa forma. E você também pode alterar os métodos que estão associados com um objecto através da atribuição de um método que nova função, que é também muito diferente de outros linguagens orientadas a objetos, onde uma vez que declarar um objeto e instanciá-lo, não podemos mudar os métodos que são associado a esse objeto mais. Então isso é muito diferente. Frio. Então, aqui está um exemplo, em primeiro lugar, de um objeto em ação. Isto é o que é chamado um objeto genérico, que significa que ele não tem qualquer nomeadamente nome, não tem uma classe, é apenas algum envolvimento de valores. E a maneira que parece é que temos este par exterior de encaracolado cintas aqui indicam que a JavaScript e dizer, este é um objeto. Os valores dentro da mesma são, cada um dentro de valores do objecto que deve ser enrolado. E dentro desse objeto, temos então pares de valores-chave, onde a chave refere-se ao nome do valor dentro do objecto, e o outro side-- oposto a aqui- cólon é o valor real que deve ser armazenado. Então você vê aqui que temos uma chave chamada fn com valor sam, seguido por uma vírgula, dizendo para a próxima entrada. Em seguida, uma chave chamada LN, com um valor de verde, seguido por uma vírgula, seguido de "print" que vai ter um valor de função que vai fazer esta linha de código. Vamos dar um passo para trás e descompactar o que está acontecendo aqui. Então, isso é um pouco complicado, e nós estamos vendo algo novo pela primeira vez. O "isto" palavra-chave é a coisa nova nós estamos vendo aqui, e que isso faz é, refere-se a corrente objeto no espaço, certo? Assim, quando dizemos, este aponta o caminho de volta a toda esta object-- quando fazemos this.fn, nós estamos indo para percorrer todo o caminho de volta a este objeto, vá para o valor fn e obter sam, puxe-o todo o caminho para trás, colá-la aqui, e, em seguida, seguir em frente. AUDIÊNCIA: Assim, com a recuperação, é isso feito por causa do parâmetro definição? SAM VERDE: Então, a pergunta era: é o recuperação feito por causa do parâmetro definição? Sim, absolutamente. O que vai acontecer aqui é, este ponto diz ao JavaScript, OK, eu estou recebendo algum valor a partir desse objeto de mim mesmo. E então ele vai olhar para uma entrada chamado fn, e se encontra, ele vai voltar que value-- assim, é sam. Mas eu também poderia ter digitado algo que não foi definido aqui, e, em seguida, que seria apenas undefined-- que voltar é uma coisa que pode JavaScript fazer, o que pode ter benefícios, mas é Também-- se você cometer um erro de digitação, que pode resultar em erros estranhos. Por isso, vou apenas tentar encontrar o que quer que você diga a ele para encontrar e ele não está indo para reclamar se não encontrá-lo. Só vai dizer que eu não fiz encontrá-lo, e, em seguida, seguir em frente. Por isso, seria indefinida, acrescido em branco, além de sobrenome. Sim. E então podemos ver que se nós poderia, então, descer e access-- e chamamos tf.print () com parênteses. Vai chamar isso de impressão função sem argumentos, certo? Mas se nós apenas disse tf.print () ponto e vírgula, sem os parênteses, tudo o que teria feito é puxar a função do valor, mas na verdade não o chamou. Frio. HUGH ZABRISKIE: Devem fazemos um objeto? SAM VERDE: Claro, vamos fazer isso. Então, eu posso mover este exemplo para o console. Podemos imaginar que eu tenho um objeto. Portanto, este é um objeto simples. Este é um objecto que contém dois valores com duas chaves, dois valor de chave pares. Para que eu possa, em seguida, acessar o valor armazenado dentro deste objeto, fazendo x.x1, por exemplo, e eu recebo uma volta. Da mesma forma, x.x2, obter esse valor de volta. E agora a coisa é muito legal, eu posso realmente acrescentar algo a este objeto depois que eu criei. Então você pode imaginar, vamos dizem que eu tenho uma função. HUGH ZABRISKIE: Você tem que fazer Shift-Enter. SAM VERDE: Ah, isso é irritante. O que ele não gosta? Oh. Aqui vamos nós. Frio. Então, eu criei apenas Esta função, f, que está indo para ir para a corrente objeto e impressão this.x1. Então, se eu apenas chamar por f em si, nada está acontecendo a acontecer, né, porque não há x1 campo no objeto que ele está se referindo. Mas, se eu digo, x.f = f, e então eu chamar x.f (), eu vou voltar 1. Essa função f é agora associado com o objeto x, que tem uma chave chamada x1 associada com o valor de 1, por isso, quando nós chamamos this.x1, é vai encontrar o que está procurando e ser capaz de imprimir um valor fora. Então, isso é apenas um exemplo do tipo das coisas loucas você pode fazer com objetos em JavaScript. Então, essa versão foi a versão genérica, significado que criamos um objeto usando este parênteses notação cinta notation--, rather-- e isso é calhar se nós só queremos uma instância de um objeto específico, mas E se nós queremos ter mais do que um do mesmo tipo? E a resposta para isso pergunta é, há coisas chamadas classes em JavaScript também. Nós podemos criar uma função que faz algum tipo de inicialização para um objeto estranho, e nós diríamos, como, minha class-- por isso o nome do object-- reutilizável é igual a função que define-lo. Então, o que isso seria equivalente a está criando um objeto que seria apenas como, chaveta, str, cólon, esta é uma cadeia, ponto e vírgula, chaveta. Isso seria o genérico objeto que inicializar, com a única diferença sendo a linhas seguintes, criamos um protótipo, que significa que é uma chave padrão que nós adicionamos ao nosso objeto que tem o valor listado aqui. O que significa que, quando eu criar um novo instância deste objeto MyClass, ele vai ter pré-construído dentro de ele um valor chamado str e outro valor myPrint chamado, que é vai ser uma função. Fantástica. Ótimo. Então a última coisa a dizer sobre JavaScript é que é realmente útil para o que são chamadas operações assíncronas. Meios que é assíncrona pode esperar por alguma operação para completar antes de avançarmos em campo, mas seguir em frente, enquanto esperamos e, em seguida, ter algo acontecer mais tarde. E o que quero dizer com isso é que você pode imaginar uma situação em que você envia uma solicitação para algum servidor web em algum lugar, e ele vai mandar você de volta algum pedaço grande de dados, certo? E o usuário poderia esperar no Entretanto para que isso aconteça, e nada poderia ser acontecendo naquele momento. Mas isso não é um grande projeto, certo? Você não quer que a página da web para congelar. E se o usuário quiser clicar em um menu drop-down? Não é um grande padrão de design. Em vez disso, basicamente o que O JavaScript é diz, OK, fazer esta operação de forma assíncrona. Assim como, esperar no fundo, e em seguida, quando a operação é efectuada, chamar o callback function-- chamar alguma função, que alguns Action-- para sinalizar que o operação estávamos à espera de terminar acabou. E a razão que é super poderoso é, nós podemos fazer alguma coisa, passar um argumento, fazer alguma coisa, e depois esperar para que algo aconteça. Então, uma vez que algo conclui, podemos chamar um callback. Isso é realmente útil porque permite nós fazemos as coisas com Web API de áudio, por exemplo, como uma carga arquivo de áudio a partir de um servidor remoto sem ter que esperar para o Toda ficheiro de áudio a ser carregado, o que seria realmente ruim para a experiência do usuário. Frio. Última casal notas sobre depuração, uma vez que este é uma coisa que você vai ter que fazer como parte de seu projeto, garantido. Eu mencionei o console JavaScript. É um recurso super útil de todos os navegadores modernos, E nós realmente incentivá-lo a obter confortável usando seu console, se você quiser ficar bom em JavaScript. É super prático para depuração, mas também é realmente útil para descobrir como usar uma API. Ele permite realmente experimentação fácil sem ter que digitar alguns código, e, em seguida, compilá-lo. Você não tem que fazer todas essas etapas. Você pode apenas escrever algum código em uma linha, e, em seguida, obter um feedback imediato sobre se ou não essa linha de código worked-- muito útil. E também, apenas um note-- técnico o console JavaScript é um exemplo de um modo que é REPL-- R-E-P-L, REPL, que está para ler, avaliar, loop de impressão. Você está indo para escrever algumas coisas em, ele vai ler o que você digitou, ele vai avaliá-lo, e ele vai imprimir o saída, e então ele vai começar de novo. Isso permite que você vá rapidamente em círculos iteração, o que é muito legal. Eu acho que esta verdadeira última note-- é a última nota real, sim. Como é que vamos realmente usar JavaScript? Então, primeiro, podemos importar -lo usando uma tag de script na parte superior ou inferior de um HTML file-- em qualquer lugar dentro de um arquivo HTML, realmente. E dentro de uma tag de script, há dois sub-modos de importação de JavaScript. O primeiro é através de um arquivo JavaScript separado que nós importamos em sua totalidade, ou por ter uma área de código como roteiro para começar, e, em seguida, script de barra invertida ao fim. E então nós apenas escrever JavaScript dentro do arquivo HTML. Essas são as duas maneiras. Você não pode tê-lo dentro de HTML. AUDIÊNCIA: É um melhor que o outro? SAM VERDE: A pergunta era: Um é melhor que o outro. Então, sim, como uma prática de estilo de codificação, e também é como uma prática de design. Existem duas razões por que ele pode ser melhor. O primeiro é, ele faz o seu código de um muito mais legível se todo o seu HTML é em um lugar, todo o seu CSS está em outro lugar, todo o seu JavaScript está em um terceiro lugar. Certo? Acho que já deveria ter falado sobre isso em sections-- como o que CSS-- que é-- e vai muitas vezes em outro arquivo. Assim, mesmo tipo de conceito aqui. Você também pode imaginar que o JavaScript seria reutilizada em mais de um A página HTML, ou talvez um grande número de páginas HTML, e ter que JavaScript reformulado em um arquivo que você pode importar em mais de um lugar permite que o código seja maneira mais sustentável. Você pode imaginar fazendo um mudar para o JavaScript e ter que alterá-lo 100 em ficheiros diferentes. E em vez disso, pode simplesmente mudá-lo em um, que é muito mais poderoso. Será que eu responder a sua pergunta? Frio. Nós também pode digitar no console, como já mencionei antes. E, novamente, uma última note-- Web Audio é construído em, você não precisa carregar nada. Frio. Há alguma pergunta, você tem qualquer mais perguntas sobre JavaScript, antes de seguir em frente? AUDIÊNCIA: [inaudível] SAM VERDE: Tudo bem, legal. Então, agora ele vai falar sobre a API. HUGH ZABRISKIE: Cool. Obrigado, Sam. SAM VERDE: Claro. HUGH ZABRISKIE: Awesome, de modo nós vamos passar de JavaScript. Então, nós já conversamos sobre alguns dos os fundamentos de JavaScript, e essas são as variáveis, funções, objetos, funciona como variáveis, carregamento assíncrono. Estas são todas as coisas que você vai veja como você usa o Web Audio. Então, nós apenas estamos indo para falar sobre isso primeiro em um nível elevado. É uma API, por isso é algo que é construído, como Sam disse, para a direita no JavaScript que você usa no console. E é realmente apenas como código C ++ que é realmente construído no Chrome e Firefox, e todos esses navegadores. Assim, a idéia principal com Web Áudio é que você tem este tipo de encanamento de áudio, certo? Assim, seus dados de áudio vem em de alguma forma. Existem três tipos de forms-- principal você tem o oscilador, que cria uma onda senoidal, onda cosseno, vamos ver como isso funciona. Outro muito comum, é claro, é um leitor de MP3. Então, talvez você comece com uma canção, e então você quer fazer alguma filtragem e que a saída isso-- que poderia ser uma fonte possível. E, em seguida, um muito legal um é o microfone. Assim você pode usar algumas muito chamadas básicas em JavaScript para obter acesso ao microfone, e por isso, se você queria fazer uma app como um detector de campo, por exemplo, que leva em sua voz e descobre a maneira muito fácil pitch-- a isso. Você pode apenas tipo de lê-lo em, descobrir a freqüência, e, em seguida, um número de saída. Então, vamos ver como isso funciona, também. O destino é basicamente onde os dados de áudio é emitido. Assim, em geral, que é como os alto-falantes portáteis. Outras opções são como um ScriptProcessorNode-- nós vamos chegar a nós em um second-- mas basicamente, ou você está colocando para fora som através do seu computador por meio de alto-falantes, ou você está tipo de gravação, por isso você está armazenando-o como dados de áudio. Então, talvez se alguém cria música no seu aplicativo e, em seguida, que pretende gravar isso e talvez como exportá-lo para SoundCloud, por example-- que seria uma maneira de fazer isso. Todas as coisas divertidas, que nós vamos falar sobre, acontece entre estes dois pontos, onde nós carregamos na música e, em seguida, que a saída. Então, eu estou indo para falar sobre os cinco estágios de produção de áudio em um segundo. Nós temos essa coisa chamada um AudioContext, que é este pequeno invólucro que vemos aqui. Basicamente o que AudioContext é-- se vá para o console JavaScript agora, podemos criar um agora. Apenas um exemplo de REPL, certo? Estamos lendo, avaliação e imprime. AudioContext é um estado global. É uma estrutura, que é um objeto aqui, e mantém informações sobre as coisas que estão acontecendo no ecrã relacionado a áudio. Um exemplo é a hora atual. Isto diz-lhe o número de segundos, com muita precisão, desde que a página web carregado. Portanto, este é um muito útil pouco propriedade que você pode usar. É ler only-- Eu acho que, na verdade, você pode tentar definir um valor. Ele vai dizer-lhe configurá-lo, e então se você imprimi-lo novamente-- isso não aconteceu realmente muito trabalho. Portanto, há somente leitura propriedades em JavaScript. Isto é realmente útil se você está tipo de sincronização um monte de diferente informação, quando você está tipo de reprodução de sons diferentes. Outra realmente útil é o destino contexto. Definitivamente, se você estiver interessado, ser tentar isso em seu próprio direito consola agora. Portanto, este é um AudioDestinationNode. Basicamente o que isto diz é: onde está a saída indo? Portanto, há duas opções reais aqui. Normalmente, o padrão é apenas os alto-falantes, assim AudioDestinationNode basicamente, apenas diz há zero saídas para o som chegando, enviado para o alto-falante. Assim, em geral, você não tem que jogar com isso. Se você estiver interessado em realmente usando o ScriptProcessorNode para a gravação, definitivamente atirar-me um e-mail mais tarde porque é isso um pouco mais complicado. Mas, geralmente, você é apenas um tipo de saída de som de alguma forma. Tão legal, vamos pular de volta aqui. AUDIÊNCIA: Eu sinto muito. HUGH ZABRISKIE: Yeah. AUDIÊNCIA: Eu sei que você disse para falar com você mais tarde sobre a gravação. Você pode fazer interface que com o Pro Tools? HUGH ZABRISKIE: Com o Pro Tools? Vamos ver. Acho que não. Então, indo entre o cliente, que é o JavaScript console, e seu real computador, é geralmente algo que é meio de fora dos limites, se você vai, tipo pela natureza do as-- é um tipo de coisa design, mas você tenta manter o navegador separado de computador real do usuário. Geralmente, a única coisa que você é capaz de acesso é o microfone ou a câmera. Você não é capaz de, I Não acho, utilize o Pro Tools. No entanto, se você criou uma faixa em Pro Tools, exportado isso, você pode carregar esse aqui, filtrá-lo, por exemplo, processo que, e gravar isso em um Áudio Destination-- ou, Não-- uma Esfera Nó processador. E, em seguida, a partir daí, você poderia exportar isso para SoundCloud, você poderia enviá-lo por e-mail, ou o que quer que você gosta de lá. Mas há uma espécie de barreira ligeira entre fazer música em seu computador e fazer música online. SAM VERDE: E isso é não exclusivo para esta API. É uma característica do Chrome segurança, e Eu acho que todos os outros navegadores modernos. O navegador é auto-suficiente. Assim, por exemplo, uma página web não pode usar JavaScript para desligar o som em seus alto-falantes, por exemplo. Ou ele não pode desligar o computador. E não há nenhum ponto intermediário entre essas duas coisas, né, por isso ou você tem um completa abstração, ou você abrir o falha de deixar de segurança um programador com más intenções fazer o que quiser com o seu laptop. E é por isso Chrome é auto-suficiente. HUGH ZABRISKIE: Yeah. Isso faz sentido? Legal legal. Eu estava apenas indo para mostram um exemplo de um. Isso é muito bonito como medida em que você começa, em termos de acessar o computador do usuário. Se você tiver um teclado USB conectado, você pode usar algo chamado de Web MIDI API, que não vamos realmente falar aqui, mas esta é uma outra API que é construída em pelo menos Chrome-- novamente, é por isso que nós amamos Chrome-- Eu acho que o Firefox ou o Safari, isso é uma coisa fácil de navegadores diferentes têm google-- suporte diferente para o qual APIs eles implementaram. Mas se você quiser conectar um teclado e trabalhar com essa informação, tipo de enviar o teclado informações sobre para o computador e depois usar essa linha, essa API é onde você estaria trabalhando isso. Frio. ESTÁ BEM. Assim, movendo-se rapidamente em aqui. Como estamos nos saindo na hora certa? COLUNA 1: Cerca de 15. HUGH ZABRISKIE: 15 minutos deixou? OK legal. Então, vamos correr à frente aqui. Então, basicamente, o principal ponto de pensar nisso como um oleoduto é que cada passo na calha é uma série de nós de áudio. Nossa fonte, digamos, é um oscilador. Precisamos criar um nó de oscilador. E isso é apenas um tipo do pequeno function-- e eles estão todos baseados fora do contexto aqui áudio. AUDIÊNCIA: Quando ele disse oscilador, isso significa é, na verdade, literalmente, indo de dois pólos diferentes e para trás? HUGH ZABRISKIE: Não, é como uma representação digital. É realmente implementado em C ++. Na verdade, eu não sei as especificações de como é realmente implementado, mas tudo isso está funcionando como dados binários. Na verdade, sim. Isso seria dizer, eu poderia na verdade, se você estiver interessado, Eu poderia enviar-lhe um pouco mais informações sobre como formas de onda são mantidos tendo um formato digital. OK legal. Então, nós estamos gerando um tom como um sine acenar ou algo assim, talvez 440 Hertz. Criamos um oscilador. Se queremos definir o volume, nós conecte nada a um GainNode, que poderia fazer com .creategain. Que define o seu volume. Você pode passar que em qualquer de outro opções-- bem, assim uma fonte de buffer de áudio nó é o lugar onde você pode armazenar um arquivo MP3 que você tenha carregado no. Filtro para filtragem é Biquad se você quer tirar toda a base para fora de uma música, ou algo parecido. Deus me livre você quer tomar a base de uma canção. E nó AudioDestination é, novamente, como onde nossa finalização é. Se você está sempre interessado em ver todas as diferentes opções possíveis, basta ir à guia e deixá a completa auto-vir para cima. E se você criar, você vai ver todas as coisas diferentes que você pode criar. Você pode criar dinâmica processadores de script, Eu nem sequer sei o que isso é, para a mistura de fusões de canal e divisores de canal e tudo isso. Frio. Portanto, esta é apenas uma exemplo de um gasoduto. Portanto, temos três fontes entrando. Talvez estas são formas de onda, talvez estes são MP3s. Um está passando por um filtro, outro de ficando distorcida outro um de panning esquerda e direita. Você pode fazer todo tipo de coisas e todos eles se misturam em torno juntos, e, em seguida, sai do áudio no final, como destino. Este é um exemplo do que mais complicado código de Áudio Web parece. Você está criando todos estes objetos diferentes direito aqui-- Eu não tenho certeza disso. Não, ele não aumentar o zoom. ESTÁ BEM. SAM VERDE: Você faz de controle, Scroll-Up. HUGH ZABRISKIE: Controle Scroll-- SAM VERDE: Não, não. Ao controle-- HUGH ZABRISKIE: Oh, controle, vá? Oh, gotcha. Sim. Wow, não, não tinha. ESTÁ BEM. Eu não vou fazer isso. Então, sim, neste primeiro seção aqui, você vê estamos criando todas estas diferentes nodos fora do contexto. Nós apenas estamos unindo- juntos na segunda parte por essa função chamado Conectar. Isso é realmente uma chave função em Web Audio. Significa apenas que uma vez que você fez algo com o som de um nó, passá-lo para o próximo nó. Portanto, temos a fonte, ele liga-se ao analisador, o analisador faz algo com ele, ele vai para a distorção, e assim por diante, e para o destino na parte inferior direita aqui. Frio. OK, por isso vamos continuar seguindo em frente. O pipeline-- novamente, estes são as condutas mais comuns, portanto, falar sobre todas essas coisas como distorção, panning, todas essas coisas. Se você estiver realmente interessado no uso de coisas Pro Tools, aqueles provavelmente lhe interessar. Se não, talvez você só quer reproduzir o som, ou talvez você só quer definir o volume do som. Esses são os dois tipo mais comum de gasodutos na produção de áudio. Mais uma vez, as maneiras que você pode levá-lo em como uma oscillator-- assim, vamos fazer uma demonstração de que aqui. Então vamos criar um simples contexto áudio aqui, e de que vamos para criar o nosso oscilador. Então, isto é, de novo, nós somos apenas vai chamar Criar oscilador. Nós vamos definir uma frequência de que, 440 Hertz, favorito de todos. Em seguida, ligar para o destino que ponto-- que é o alto-falante, portanto, o destino contexto. Por fim, apenas dizer, começar de zero segundos a partir de agora, e não temos o som? [TOQUE] HUGH ZABRISKIE: Aqui vamos nós. É apenas uma onda senoidal. OK legal. E então nós vamos parar com isso. AUDIÊNCIA: Onde fiz que o feedback vem? HUGH ZABRISKIE: O feedback? Oh, provavelmente nossos microfones. Então, sim, isso é como fazê-lo. E, na verdade, se eu tivesse manteve-o em execução, poderia ter a frequência valor como ele está correndo, de modo que é uma coisa divertida para brincar. Frio. Isso é sempre um adorável para apresentar. SAM VERDE: Nós não pensar sobre isso, nós fizemos? HUGH ZABRISKIE: Sim, Essa é uma pergunta desagradável. Então, buffer loading-- eu vou lhe mostrar uma exemplo de que no final. Isso é carregar um MP3. E microfone, você usa apenas uma função chamado Navigator.getUserMedia () para solicitar o acesso ao usuário do microfone para essa informação. Aqui está filtrando, eu vou apenas manter em movimento a partir deste. Isso é muito alto nível, mas os filtros apenas permitem que você [BIPE] Filtragem também permite que você para criar coisas como rosa ruído, o ruído marrom, ruído branco. Se você deseja criar ruído puro, que algumas pessoas gostam de mexer com, você pode usar o Web Audio filtragem de fazer isso. Áudio Panning-- então imagine se você estiver escrevendo um jogo e você deseja que o som soar como ele está vindo, como, atirando em toda a tela, você pode utilizar a filtração do áudio para criar este tipo de cone, como-- que é bastante mathy, mas é realmente muito legal se você obtê-lo trabalhar, e há algumas boas tutoriais sobre ele eu posso enviar-lhe. Basicamente, você pode tipo de criar o som de alguma coisa acontecendo por de uma forma 3D. E se você tem um interesse DJ, você pode começar a misturar e atravessar canções desvanecimento. Este é apenas alguns muito básico código, basicamente o que eu fiz antes. Isso define o volume do oscilador, por isso nós criamos nosso oscilador que cria a forma de onda. Nós criamos o nosso GainNode, definir nossa freqüência, e depois ligar o oscilador para o GainNode, que, em seguida, basicamente muda quanta sinal é permitido passar. Mas, realmente, é um Digital coisa, por isso é mais apenas-- sim. Isso não é o que está realmente acontecendo, mas é o que acontece na vida real com um ganho. AUDIÊNCIA: --quantization do parâmetro de volume? HUGH ZABRISKIE: Desculpe? AUDIÊNCIA: É um parâmetro de volume quantificado? HUGH ZABRISKIE: Yeah. E isso é uma coisa que eu sou realmente deficiente no meu conhecimento, como ganho trabalha em um nível digital. Eu sei que com real sinais, é basicamente controlar o quanto você está amplificar o sinal. Então sim. Vou enviar-lhe mais informações sobre isso, porque eu estaria curioso, na verdade, para saber mais sobre isso. Mas, basicamente, os parâmetros são, um é o fold-- o signal-- mais alto e zero não é nenhuma sinalizar, ou você não vai ouvir nenhum som. Vamos pular tempo demo para que, por causa é basicamente o que eu fiz antes. E, novamente, o Context.Destination é o nó-destino de áudio. Awesome, OK. Então, eu vou fazer um rápido dois demos. Como estamos nos saindo na hora certa? COLUNA 1: Cerca de 10 minutos. HUGH ZABRISKIE: 10 minutos? Ótimo! Fantástica. Assim, o primeiro que eu vou Não, ele é chamado My Favorite Song. Portanto, esta é apenas uma pouco HTML JavaScript. Nós vamos ter dois botões na página de jogar minha música favorita e parar a minha canção favorita. Eu vou mudar isso. AUDIÊNCIA: Cubra seu microfone. HUGH ZABRISKIE: Yeah. E eu tenho carregado aqui um script que basically-- e isso é realmente útil para carregar um MP3, de modo que este só faz carregar MP3s caminho mais rápido. É basicamente apenas um invólucro. Ela só faz o processo de carregando no MP3 muito mais rápido, caso contrário, você está usando solicitação HTTP, tipo de como o que estávamos fazendo na peça atual conjunto com Server. É realmente feia, você Não quero fazê-lo. Então esse cara, Boris PME, escreveu um realmente ferramenta pouco útil chamado BufferLoader. Tudo que você faz é simplesmente passá-lo a contexto, você passá-lo um lista-- ou, sim, é uma lista em JavaScript? SAM VERDE: Uma matriz. HUGH ZABRISKIE: Oh, é uma matriz, isso é certo. É uma matriz de caminhos para diferentes ficheiros. E então você passar uma função. Este é o retorno que nós estávamos falando sobre com carregamento assíncrono. Que será chamado uma vez que os arquivos carregados. E essa função que é chamada quando o arquivo é carregado toma como um perímetro uma série de tampões carregados. Assim que ocorre aqui. Basicamente, é BufferList vai ser um value-- ou ele vai ser uma matriz de um comprimento, que tem em si no índice zerar todo o arquivo carregado do MP3. Então, o que eu faço quando eu terminar carregamento é, eu simplesmente criar uma fonte de memória intermédia, que é um nó de origem do buffer de áudio. O próximo passo é carregar no I source.buffer como o tampão carregado completa do BufferList-- é um monte de buffers-- e, em seguida, você se conectar que o áudio tampão para o destino. Então, o que ele vai fazer é simplesmente colocar o MP3 direto para a saída, e iniciá-lo imediatamente ao chegar esta chamada. Legal, então vamos ver isso acontecer em ação. Meu [inaudível] aqui, vamos ver. Então, eu estou indo só para iniciar um servidor de base. Isso é algo que você precisa fazer se você estiver fazer pedidos de carregamento de arquivos. Eu estou indo para iniciar um servidor de base. Este é basicamente todo o seu PSET agora em uma linha, mas está apenas começando um servidor na porta 80/80. Então vamos para cá, nós indo para carregar 80/80, nós estamos indo para ir para a minha música favorita. Então, se eu bater "Play my canção favorita "agora, ele vai carregar o meu canção favorita e jogar ele-- [MÚSICA - The Eagles, "VIDA NO RÁPIDO  FAIXA"] --que passa a ser "Life in Fast Lane ", dos Eagles. Agora, eu poderia bater "Pare meu canção favorita "e reproduzi-lo. [MÚSICA - The Eagles, "VIDA NO RÁPIDO  FAIXA"] E se eu passar por cima de consolar, porque Eu usei uma variável global aqui para acompanhar esse valor, ele, na verdade, vai agora ser reconhecido no console. Por isso, auto-cria para mim. Então, isso é o que está jogando agora, e eu posso simplesmente chamar source.stop () naquilo. Bem, você sabe o quê? Só para vocês ouviram esta song-- você pode reconhecer essa música. [MUSIC - Rick Astley, "Never Gonna Give  VOCÊ UP "] [MÚSICA - The Eagles, "VIDA NO RÁPIDO  FAIXA"] Temos agora de ser rickrolled. OK, ótimo, seguir em frente. Frio. Portanto, este é basicamente um exemplo de apenas como você poderia carregar um MP3 file-- [MÚSICA - The Eagles, "VIDA NO RÁPIDO  FAIXA"] --e jogá-lo, e parar e iniciá-lo. Eu poderia ter feito muito mais [inaudível] O último que eu vou fazer é, Eu vou lhe mostrar um [inaudível]. [Música tocando] É como se, ogg.wave.mp3. Eu acho que, se bem me lembro, Eu correr em alguns problemas com m4a, mas eu não tenho certeza sobre isso. Acho mp3.wave-- [MUSIC - Rick Astley, "Never Gonna Give  VOCÊ UP "] OK ótimo. Eu não deveria ter dito isso. De qualquer forma, Olá. Então nós temos esta aberta. Portanto, agora tudo que eu faço é, eu basicamente criado a sintaxe básica para a criação de música. Então, se eu fizer algo como, adicione g4 em 1 de 2, o que isso significa é que, adicionar a nota piano, G4, que constitui a quarta L -se no piano do fundo. Portanto, este é tipo de MIDI fale, então para aqueles que são a música baseada, este é apenas notas MIDI. AUDIÊNCIA: Esse é o G do Médio C, certo? HANS ZABRISKIE: Este é o G acima Oriente C, isso é certo. AUDIÊNCIA: Acima Oriente C. HUGH ZABRISKIE: Yeah. Na verdade sim. Eu acho que eu realmente fiz é um [inaudível], então isso pode ser uma oitava acima disso. Então vamos ver. Se eu acertar Play-- [PIANO NOTA REPETITIVO] --we're vai ouvir isso. A idéia é que ela opera assim como uma linha de comando seria, por isso, se eu subir e descer no meu teclado, você pode voltar ao anterior comandos, o que é bastante útil. E abaixo é a minha lista de faixas, que são todos rodando em loop. AUDIÊNCIA: Você estava assumindo o Teclado de 88 teclas em que, certo? HUGH ZABRISKIE: A pergunta era: Eu estou assumindo um teclado de 88 teclas, e sim, eu sou. O que eu fiz é que eu basicamente, levou 88 amostras do piano, um para cada nota. E assim cada vez que você ouvir uma nota de agora em diante, que é efectivamente um circuito que parece como-- Isso está ficando jogado em loop, Assim, para cada nota, este está em execução. O que acontece é que eu criar um tampão novamente, Eu criar um nó de ganho para ajustar o volume. Isso só realmente um maneira complicada de dizer que armazenar o tampão em uma source.buffer. Dou-lhe o ganho, eu conecte-o ao ganho, o ganho é ligado ao saída, e então eu jogá-lo. Assim que é uma espécie de processo de tomar em uma fonte de buffer. AUDIÊNCIA: Você pode realmente ter que som seco e torná-lo molhado [inaudível]? HUGH ZABRISKIE: É possível, sim. Há re-verbo, há delay, distorção. Basicamente você pode colocar qualquer coisa em entre nesse sanduíche de-- bem, pipeline é uma metáfora melhor, mas você pode adicionar qualquer coisa em que. Frio. Então, eu vou terminar a demo aqui para dar-lhe um sentido de apenas o grande número de vezes que você pode executar essa função de uma só vez. Então, eu estou indo para remover isto. Eu estou indo para criar um gerador isso-- basicamente o que does-- isso é realmente tipo de syntax-- complicado, mas é vai gerar notas em tempo real, e apenas começar a jogar -los, uma vez que as avalia. [PIANO interpondo] Assim, podemos apenas fazer um pouco de música aqui. [PIANO interpondo] Então, o que este comando faz, por exemplo, é que leva essas três notas para o piano e, em seguida, coloca-los em B3. Esta sintaxe pode fazer um pouco mais de sentido para aqueles que têm um música de fundo aqui. Eu posso adicionar um bumbo. Eu posso-- [Interpondo INSTRUMENTS] --a apenas brincar com isso. Assim, você pode make-- [Interpondo INSTRUMENTS] Aquele é um pouco mais chato. [Interpondo INSTRUMENTS] Assim que adiciona aleatoriamente um prato seco em cada nota 16, com um 16% [INAUDÍVEL]. [Interpondo INSTRUMENTS] Sim, então a forma como este works-- é sempre em 4: 4. [Interpondo INSTRUMENTS] Sim, então os quatro trimestres, e 16/8. [Interpondo INSTRUMENTS] Assim, em média, você tem 60% de bate nas 16 notas. De qualquer forma, esta foi apenas tipo de mostrar fora algumas das coisas que você poderia construir com a API de áudio Web. É realmente poderoso, ele é muito rápido, e você pode fazer um monte de coisas legais com isso. Então, novamente, todas as perguntas que você tem, email myself-- Hugh-- ou Sam, e honestamente, o Google tem uma tonelada de bons recursos. Alguma última pergunta? Sim. AUDIÊNCIA: Então você pode acessar o microfone embutido. E se você queria usar um microfone melhor? HUGH ZABRISKIE: Se você queria usar melhor microfone? Então, novamente, isso é parte do abstração entre Chrome e no resto do seu computador. A não ser que ele esteja disponível através uma API, como Web API MIDI, você poderia provavelmente encontrar alguns hacks, mas geralmente não é tão viável. SAM VERDE: Você pode Também-- tudo o cromo sabe é o que o seu microfone padrão é, e que ele acessa. Então, se você tinha um microfone você poderia definir como microfone padrão do computador, você pode acessá-lo desse jeito e ele provavelmente iria funcionar. HUGH ZABRISKIE: Isso é um bom ponto. Eu nunca tentei isso, mas você pode ser capaz de tipo de-- se você redirecionar o alto-falante de entrada, você pode ser capaz de fazer isso, sim. Alguma última pergunta? Frio. Bem, obrigado caras tanto para assistir. Eu sou Hugh. SAM VERDE: Eu sou Sam. HUGH ZABRISKIE: E este é CS50.