VERDE SAM: Hola, todo el mundo. Bienvenido a nuestro seminario. Me llamo Sam. HUGH ZABRISKIE: Soy Hugh. VERDE SAM: Y vamos a hablar hoy acerca de JavaScript y la API de Web Audio. Sólo para empezar, este es un esquema de nuestra agenda para el seminario. Vamos a comenzar hablando de por las que debe estar interesado en la Web API Audio, ¿por qué es JavaScript el idioma que necesita para ello, y luego hablar de JavaScript essentials-- así como, Puedes caminar a través de algunos fundamentos de la lengua, y luego hablar de la API de audio a un nivel alto. Entonces, Hugh hablará sobre algunos de las etapas de producción de audio y luego una demostración de este impresionante secuenciador proyecto que construyó y le mostrará el código. Y luego, vamos a tener tiempo para preguntas al final de la gente que están aquí vivir. HUGH ZABRISKIE: Cool. VERDE SAM: Cool. HUGH ZABRISKIE: Cool. Voy a realizar copias de seguridad. SAM VERDE: Así que, primero lo primero. Así que una de las grandes cosas sobre la Web API Audio es que no hay puesta en marcha es necesario. Viene integrado en la mayoría de los navegadores modernos, incluyendo Chrome, Edge, en su conjunto manojo de otros-- todos los que grandes porciones de la gente está utilizando hoy en día. Así que no se ha configurado, aparte de conseguir justo un servidor web en marcha, para usted pueda empezar a trabajar en su proyecto, lo cual es genial. Le recomendamos bastante en gran medida de que se tiene en cuenta utilizando Chrome para Desarrollo web JavaScript, sólo porque su desarrollador herramientas son muy fuertes. Como ejemplo de justo lo que queremos decir diciendo abre tu JavaScript console-- si vas en Chrome y nos fijamos en cualquier página web, y te fuiste clic Inspeccionar elemento, y luego ir a este pequeño desplegable aquí y hace clic en la consola, verás lo que abre ve una muy parecido a un símbolo del sistema que podría ver en tu Mac, o en la ID. Y así, podemos Tipo manda aquí, como Claro, y otros comandos por el estilo. Podemos crear variables, como veremos más adelante en JavaScript. Y así que cualquier cosa que podemos hacer en JavaScript, podemos hacerlo con la consola, y eso es una forma súper práctico para empezar a jugar con las API y sentirse cómodo con JavaScript derecha del palo. Sin puesta en marcha requiere, que es realmente agradable. Guay. Impresionante. Así que sólo una cosa más para agregar. Si usted tiene alguna preguntas-- existen muchos de ustedes que no están aquí viven, no dude en enviar por correo electrónico nosotros-- éstos son nuestras direcciones de correo electrónico. Si tienes preguntas usted no quiere pedirnos, como, oh Tengo un error en mi código, o algo eso es un poco más específico, quizá en Google en primer lugar. Hay un montón de grandes recursos acerca de la API de audio web por ahí. Es realmente bien documentado y está siendo utilizado por un montón de gente en la industria y las personas que son simplemente la construcción de cosas divertidas para ellos mismos. Así que debe haber un montón de los recursos que hay. Impresionante. Fresco, así que por qué la Web API de audio? Este diagrama es un poco de una evolución de la forma sonido en la web ha crecido con el tiempo. Bgsound era como la etiqueta HTML original que Internet Explorer utiliza para apoyar. Sólo se permitió sonidos bastante básicas, la funcionalidad no era muy robusta, y no se podía hacer secuenciación complicado, o controlar cuando el sonido comenzó y se detuvo muy robusta. Por lo tanto, no era particularmente bien desarrollado. Luego, después de que, Flash llegó along-- que, Estoy seguro de que ustedes están familiarizados con Flash-- quizá no cómo funciona, pero usted ha visto sin duda. Tienes que actualizar flash Plug-in, todo ese tipo de cosas, y que sin duda amplió la gama de funcionalidad que estaba disponible. Pero lo que el usuario instale un plug-in es, sin duda Un inconveniente de incluyendo Flash en su aplicación, ¿no? Porque entonces usted es dependiente de la usuario ir y encontrar este plug-in, y probablemente se encienda apagado por este paso adicional que tienen que tomar para usar la aplicación. Y entonces podría haber una actualización que voy a romper toda la aplicación, y que termina siendo una pesadilla para el desarrollador, también. Así que fue una barricada. Y luego, después de eso vino a lo largo, la etiqueta de audio HTML, que es una característica de más moderno que HTML-- sin duda permitió muchas más cosas, pero incluso las cosas que podrían hacer Había un poco limitado solo como resultado de las cosas que HTML era capaz. Así que cuando el código JavaScript API, la API Web Audio, se convirtió en un estándar practicar en todos los navegadores, que realmente ampliado el conjunto de las oportunidades para los desarrolladores para conseguir realmente en el edificio cosas interesantes para la web. Durante mucho tiempo no tenían sido herramientas muy robustas para aplicaciones de audio nativo, como-- todo el mundo sabe GarageBand, y luego, obviamente, hay más audio mezclando aplicaciones profesionales, y ese tipo de cosas. Pero no había un muy bueno Cloud-- no Nube, sí, supongo Plataforma web Cloud-- que permitiría a los desarrolladores a construir aplicaciones para las personas hacer la mezcla de audio. Y como él le mostrará más adelante, la Web API Audio permite realmente de gran alcance cosas suceda realmente, simplemente, lo cual es muy bueno. Así que esa es la instrucción de por qué debería ver el resto del seminario, básicamente. Y ahora, voy a hablar de algunos elementos básicos simplemente JavaScript-- de la lengua, de modo que podemos estar en la misma página cuando hablamos de la API un poco más tarde. Guay. Por lo tanto, este es un resumen. Olvidé que estaba aquí. Sí. HUGH ZABRISKIE: Hay dos toboganes aquí. VERDE SAM: Este es el resumen de algunas de las limitaciones de los otros métodos de unión, de edad. Y entonces ahora, tenemos estas cosas. Guay. Impresionante. Por lo tanto, elementos esenciales de JavaScript. Lo primero es lo primero, hay una diferencia bastante significativa en JavaScript frente en una lenguaje como C, en la forma que se crean variables. Así que en C, que estamos acostumbrados a tener para escribir nuestras variables, ¿verdad? Y no me refiero a tipo como escriba en ellos, quiero decir el tipo como ellos asignar un significado type-- como, un int, float, un char. En C, estábamos muy acostumbrados a tener que crear una variable y luego se adhieren a ese tipo para el tiempo entero que usamos esa variable. Y eso no es necesariamente peor, pero es probablemente más difícil de usar. Una de las características interesantes de JavaScript es que las variables son lo que se llama "dinámicamente mecanografiado", que significa que yo puedo crear una variable que la sintaxis, varX es igual a 5, por ejemplo. Eso crea originalmente un número entero variable-- justo debajo de la campana somewhere-- pero puede cambiar esa variable para referirse a una cadena sin hacer nada por el estilo crear una nueva variable. No necesito que preocuparse sobre el tipo de cambio. JavaScript sabe que el tipo de cambiado, y eso ocurre de forma dinámica. Por lo tanto, hay beneficios y desventajas a que, como cualquier persona que ha trabajado en JavaScript durante un tiempo podría saber. Hay momentos en que usted puede ser accidental cambiar el tipo de una variable y No maneje ese tipo de cambio, y entonces tu JavaScript puede crash-- o una excepción ser echado, ya que tendrá la tipo incorrecto cuando se espera un tipo. Guay. Así, scoping-- que es como, si recordar las primeras semanas en el curso, hace referencia a una variable de forma visible es y en qué área del código. Todo eso se ve muy similar a la forma en que se ve en C. Así que las variables están en el ámbito general dentro de llaves dentro de una función, y luego también hay las variables a nivel global con ámbito que trate: si escribes una variable fuera de una función, será visible en todo el texto. Una diferencia entre JavaScript y C, en particular, es que si se declara un mundial cualquier variable en un archivo de texto es visible en cualquier función dentro de ese archivo de texto. Eso es correcto, ¿no? HUGH ZABRISKIE: Sí. VERDE SAM: ¿Así que es también un poco poco raro en comparación con C, donde siempre tenía que tener nuestra definiciones de variables por encima de los lugares que se utilizaron. Eso no es una regla que se aplica más, así, un poco diferente. Y de nuevo sólo para enfatizar, global frente variables-- locales muy similar a C. Usted podría tener dos variables con el mismo nombre, y tienen uno de sus nombres se remeden por una variable local si uno de ellos era global. Así tipo, similar de problemas que algunos de ustedes pueden haber topado en alguna de su problema establece hasta el momento. Fresco, así que eso es variables. Control de flujo, es decir, como, -si else-- stuff-- lógico y bucles. Así que para empezar, esto es lo que if-else declaraciones parecen en JavaScript. La colocación de las diversas cosas en las líneas no es importante. Esta es sólo una de las convenciones por la forma en código de estructura que. Al igual que en C, tenemos una "si," una declaración paréntesis. Eso no es lo que quería hacer. Lo hice otra vez. HUGH ZABRISKIE: Tratando de salir? SAM VERDE: No, estoy tratando de acercar la imagen. No importa. Así pues, tenemos una declaración "if" y tenemos una condición dentro de ella que evalúa a verdadero o falso, y que determina si o no entramos en ese bloque de código. Y del mismo modo, tenemos una cosa, si y una persona, al igual que estamos acostumbrados en C. También debe ser bastante cómodo la derecha del palo con bucles, porque también se ven muy parecido a C parece. Pero te darás cuenta de nuevo que tienen, en lugar de int inicializaciones, tenemos inicializaciones var. Y supongo que tienes tener cuidado de hacer Seguro de que no cambie el valor de I a partir de un int a una cadena, por ejemplo, debido a que va a provocar un comportamiento extraño puede que no esperar. Pero esto debe ser bastante familiar, también. Así que aquí es donde las cosas empiezan a conseguir un poco loco en JavaScript para alguien que va desde un fondo de C. Hay funciones en JavaScript, y no hay una manera para declarar una función que se ve tipo de similar a C, y luego hay otro que se ve un poco diferente. La primera versión, que podemos ver aquí, es una especie de C-como, en su decimos, esta es una función, darle un nombre, dar el número de argumentos, y luego el contenido de la función ir dentro de esas llaves. Vamos a ver un ejemplo de argumentos en sólo un segundo. Mientras que en la línea siguiente, vemos, oh, aquí está una variable llamada "myFunction" y somos iguales a este function-- cosa-- genérico que no parece tener nada que hacer. La razón por la que es diferente que C es que JavaScript es lo que se llama un lenguaje funcional, o tiene elementos funcionales, lo que significa que las funciones son en realidad valores. Y eso significa que podemos establecer una variable para igualar una función y luego pasar esa función alrededor, pasarlo como argumento, hacer todo tipo de cosas así con las funciones. Otra cosa a note-- funciones se escriben con un cierto número de argumentos. Vamos a ver un ejemplo de una función con un argumento en la siguiente diapositiva. Pero JavaScript no lo hará gritarte si intenta utilizar una función con el número incorrecto de argumentos. Simplemente va a hacer su mejor esfuerzo para hacer hacer, lo que significa que si se pasa, se llama a una función que espera un discusión con ningún argumento, todo lo que va a pasar es que va a hacer su mejor momento para tratar de ejecutar ese código, y si se ejecuta con el tiempo en una excepción o un error, que va a lanzar esa excepción y sólo seguir going-- que es sólo una de las formas que funciona JavaScript. Sí. AUDIENCIA: ¿Qué sucede si hay demasiados argumentos? VERDE Carter: Así que la pregunta era, ¿qué sucede si hay demasiados argumentos? Y la respuesta es que JavaScript será justo ignorar los que están después de los que espera. Se tratará de ejecutar la función llamar como si era sólo los dos primeros. ¿Correcto? HUGH ZABRISKIE: Eso es correcto, sí. Del mismo modo, si hay son muy pocos argumentos, sólo tipo de da nula a todos los argumentos que no tiene ningún valor para. SAM VERDE: ¿Qué se puede ser realmente útil, si quiero escribir una función que toma unos argumentos numéricos variables. Puede establecer valores por defecto en la definición de la función, y se puede ignorar el hecho de que la entrada no está allí. Así que quiero hablar un poco más sobre esta última bala punto, que es las funciones son valores. Este es un ejemplo que es un alucinante poco si usted acaba de leer, y no cree acerca de lo que está pasando por un segundo. Por lo tanto, echemos un vistazo justo en la primera línea aquí. Tenemos esta variable, f1, que decimos es una función que hace esto. Y el contenido de la función se console.log ('hola'). Usted puede pensar en console.log como el Equivalente JavaScript de printf. Entonces, ¿qué va a pasar es que, si nos ejecutar este código en nuestro navegador, que va a imprimir una cadena. Puedo demostrar que. AUDIENCIA: Por registro, sin embargo, hace que significa que sea que se está grabando en alguna parte? VERDE SAM: Sí. Así que te voy a mostrar lo que va a suceder. Así que la pregunta era, ¿qué significa log? HUGH ZABRISKIE: Así console.log es como printf de C. SAM VERDE: Así console.log es como printf, por lo que si tengo este console.log ('hola'), y yo llamo a eso, la cadena "hola" se imprime en la consola. Esta es la consola. Es como printf, donde imprime a cabo estándar. Y veremos en un minuto, pero esto es en realidad se hace referencia al objeto de la consola, y llamar a un método en ese objeto. Eso va a hacer más sentido en un minuto cuando nos llegar a hablar de objetos en JavaScript, pero yo pensaba que iba a mencionar eso. HUGH ZABRISKIE: Estamos utilizado en el C, derecha- escribimos generalmente un gran programa en principal para hacer cualquier cosa. Pero lo que es fresco en JavaScript que es tener este tipo de intérprete que carreras en tiempo real, por lo que toma simplemente línea por línea, que sólo puede interpretar que en el acto. Y no pierde de vista las cosas que se han ejecutado antes, por lo que es una herramienta muy útil para utilizar console.log, o la consola, en general, por sólo jugar alrededor con JavaScript. VERDE Carter: Así que volver a este ejemplo-- la segunda línea de código aquí es bastante alucinante en mi cabeza. La primera vez que leo esto, era como, ¿qué está pasando? Así que lo que está sucediendo es decir, este declaración de la función, dice, Tengo una función llamada f2 que está esperando un argumento, f, y luego se llama a eso función, f, que se le pasa como argumento ni por sí mismo con argumentos. Por lo tanto, que podría haber sido confuso. Si entendemos esto como f2 f1 toma como argumento, y luego dentro de f2, f consigue called-- cuyos medios que esta línea de código, después de estas dos líneas de código, da como resultado "hola" que se está imprimiendo a la consola. El hecho de que podemos pasar funciones alrededor como valores termina siendo uno de los más potentes funciones de JavaScript como un lenguaje de programación. Fuera de toda la cosas increíbles que puede hacer, así como una característica de la lengua en términos de la forma que hace las cosas fáciles programar y permite por las cosas que no son particularmente bien adaptado a la web, programación funcional y funcional aspectos de programación de JavaScript es uno de los más conceptos de gran alcance que existe en JavaScript-- si usted me pregunta. Guay. Por lo tanto, lo siguiente. Además de ser funcional, también hay elementos de JavaScript que son orientada a objetos, que es uno de los muy palabras de moda populares en ciencias de la computación. Programación orientada a objetos es un dato popular. JavaScript tiene una versión de que, donde creo que todo valor es también un objeto, lo que significa que todos los objetos envuelve a algunos número de valores. Así que para valores que son simples, como un número entero, como varX es igual a 5, ese objeto simplemente envuelve que un valor. Pero también podemos imaginar una situación where-- podemos pensar en situaciones en C donde queríamos hacer algo con estructuras, por ejemplo, que envuelve varios valores juntos y marcas Es realmente fácil de pasar las cosas. Fue entonces cuando un objeto está en JavaScript. Es importante recordar cuando digo que los objetos envueltos algunos número de valores juntos, que las funciones son también valores, lo que significa que las funciones pueden También estar dentro de un objeto de JavaScript. Y la razón por la que es importante es que, mientras que a menudo pensar en llamar a un método en un objeto que es de un término popular de otros lenguajes orientados a objetos populares, Una de las diferencias es que aquí todo lo que es un método en JavaScript es un valor almacenado en el interior de un objeto que realiza alguna Action-- posiblemente usando los otros valores que están dentro de de ese objeto, pero no necesariamente. Así que usted puede imaginar una situación, Supongo que en un poco de una manera loca, donde llamó un método de una objeto en otro objeto, por ejemplo. Así que es un poco cobarde de esa manera. Y también se puede cambiar los métodos que están asociados con un objeto mediante la asignación de un método que nueva función, que es también bastante diferente de otros lenguajes orientados a objetos, donde una vez que declaramos un objeto y crear instancias de ella, no podemos cambiar los métodos que son asociado con ese objeto más. Así que eso es bastante diferente. Guay. Así que aquí está un ejemplo, en primer lugar, de un objeto en la acción. Esto es lo que se llama un objeto genérico, que significa que no tiene ningún en particular nombre, no tiene una clase, que es sólo un poco de envoltura de valores. Y la forma en que se ve es que tenemos este par exterior de rizado se prepara aquí que indicar a JavaScript y decir, se trata de un objeto. Los valores dentro de ella son cada uno de los valores en el interior del objeto que debe ser envuelto juntos. Y dentro de ese objeto, entonces tenemos pares de valores clave, donde la clave se refiere al nombre del valor en el interior del objeto, y el otro side-- frente a la aquí-- de colon es el valor real que deben ser almacenados. Así que ver aquí que tenemos una clave llamada fn con valor sam, seguido de una coma, diciendo a la siguiente entrada. A continuación, una clave llamada ln, con un valor de verde, seguido de una coma, seguido de "imprimir" que va a tener un valor de la función que va a hacer esta línea de código. Vamos a dar un paso atrás y desempacar lo que está pasando aquí. Así que esto es un poco complicado, y estamos viendo algo nuevo por primera vez. La palabra "this" es lo nuevo que estamos viendo aquí, y lo que esto hace es decir, se refiere a la actual objetar en su alcance, ¿no? Así que cuando decimos, esto señala el final de nuevo a todo este objeto-- cuando hacemos this.fn, vamos a ir todo el camino de regreso a este objeto, vaya al valor fn y obtener sam, tire de él hasta el final espalda, pegarlo aquí, y luego seguir adelante. AUDIENCIA: Así que con la recuperación, es que hecho por el parámetro ¿definición? VERDE Carter: Así que la pregunta era, es el recuperación de hecho porque del parámetro ¿definición? Sí, absolutamente. ¿Qué va a pasar aquí es, este punto dice que el código JavaScript, OK, me estoy poniendo un poco de valor de este objeto de mí mismo. Y entonces va a buscar una entrada llamada fn, y si lo encuentra, que va a volver que value-- así, es sam. Pero también podría haber escrito algo que no se define aquí, y luego lo haría solo volver undefined-- que es una cosa que puede JavaScript hacer, que puede tener beneficios, pero es También-- si usted comete un error tipográfico, puede dar lugar a errores extraños. Así que sólo voy a tratar de encontrar lo que le dices a encontrar y no va a quejarse si no lo encuentra. Simplemente va a decir, no lo hice encontrarlo, y luego seguir adelante. Por lo que sería indefinido, más blanco, más el apellido. Sí. Y entonces podemos ver que si entonces podría bajar y access-- y llamamos tf.print () con paréntesis. Se va a llamar a esa impresión función sin argumentos, ¿no? Pero si acabamos de decir tf.print () punto y coma, sin los paréntesis, todo lo que habría hecho es tirar la función del valor, pero en realidad no lo llamó. Guay. HUGH ZABRISKIE: En caso de hacemos un objeto? VERDE SAM: Claro, vamos a hacer eso. Así que me puedo mover este ejemplo a la consola. Podemos imaginar que tengo un objeto. Así que esto es un simple objeto. Este es un objeto que contiene dos valores con dos llaves, dos valores clave pares. Así que entonces puedo acceder al valor almacenado dentro de este objeto haciendo x.x1, por ejemplo, y me da 1 vuelta. Del mismo modo, x.x2, conseguir ese valor de nuevo. Y ahora lo realmente interesante es, que pueda realmente añadir algo a este objeto después de que yo he creado. Así que usted puede imaginar, vamos decir que tengo una función. HUGH ZABRISKIE: Usted tener que hacer Shift-Enter. VERDE SAM: Oh, eso es molesto. ¿Qué no le gusta? Oh. Aquí vamos. Guay. Así que he creado esta función, f, que va a ir a la corriente objeto y this.x1 impresión. Así que si me llamo por f sí, nada va a suceder, ¿verdad, porque no hay x1 campo en el objeto que se está refiriendo a. Pero, si yo digo, x.f = f, y luego me llamar x.f (), me voy a volver 1. Esa función f es ahora asociado con el objeto x, que tiene una clave llamada x1 asociado con el valor 1, así que cuando nos llamamos this.x1, es va a encontrar lo que está buscando y ser capaz de imprimir un valor fuera. Así que eso es sólo un ejemplo del tipo de las cosas locas que puede hacer con los objetos en JavaScript. Así que fue la versión versión genérica, significado que hemos creado un objeto utilizando este paréntesis notación corsé notation--, rather-- y eso es muy útil si sólo queremos una instancia de un objeto en particular, pero ¿y si queremos tener más de un de la misma clase? Y la respuesta a esa pregunta es, hay cosas llamado clases en JavaScript también. Podemos crear una función que hace algún tipo de inicialización para un objeto extraño, y diríamos, como, mi class-- lo que el nombre del objeto-- reutilizable es igual a la función que lo configura. Así que lo que esto sería equivalente que es la creación de un objeto que sería como, corchete, str, colon, esto es una cadena, punto y coma, corchete. Ese sería el genérico objeto inicializamos, con la única diferencia de estar en el siguientes líneas creamos un prototipo, que significa que es una clave por defecto que añadimos a nuestro objeto de que tiene el valor indicado aquí. Lo que significa que, cuando creo un nuevo instancia de este objeto MiClase, que va a haber pre-construido en el interior de es un valor llamado str y otro valor myPrint llamada, que es va a ser una función. Impresionante. Excelente. Así que lo último que se decir de JavaScript es que es muy útil para lo se denominan operaciones asincrónicas. Medios asíncrona es que nosotros puede esperar a que alguna operación para completar antes de pasar , pero seguir adelante mientras esperamos y luego hacer que algo suceda en el futuro. Y lo que quiero decir con esto es que usted puede imaginar una situación en la que envía una solicitud a algún servidor web en cualquier sitio, y que va a que le envíe de vuelta alguna gran parte de los datos, ¿no? Y el usuario podría esperar en el Mientras tanto para que eso suceda, y nada podría ser pasando en ese momento. Pero eso no es un gran diseño, ¿no? Usted no quiere que la página web se congele. ¿Qué pasa si el usuario desea haga clic en un menú desplegable? No es un gran patrón de diseño. En cambio, en el fondo lo que JavaScript no se dice, OK, realizar esta operación de forma asíncrona. Así como, esperar en el fondo, y luego, cuando se realiza la operación, llame a la devolución de llamada function-- llamar a alguna función, Haga un poco de Action-- para señalar que el operación que estábamos esperando para terminar se acabó. Y la razón de que es súper poderosa es, podemos hacer algo, pasar un argumento, hacer algo, y luego esperar para que algo suceda. Luego, una vez que algo completa, podemos llamar a una devolución de llamada. Eso es muy útil, ya que permite nosotros hacemos las cosas con Web API Audio, por ejemplo, como una carga archivo de audio desde un servidor remoto sin tener que esperar a que el archivo de audio que va a cargar, lo cual sería realmente malo para la experiencia del usuario. Guay. Última pareja observa sobre depuración, ya que este es una cosa que vas a tener que hacer como parte de su proyecto, garantizado. Mencioné la consola JavaScript. Es una característica muy útil de todos los navegadores modernos, Y realmente invitamos a obtener cómodo usando la consola, si quieres ser bueno en JavaScript. Es súper útil para depuración, pero también es muy útil para calcular cómo utilizar una API. Permite la realidad fácil experimentación sin tener que escribir alguna código y, a continuación, compilarlo. Usted no tiene que hacer todos esos pasos. Usted puede escribir algo de código en una línea, y luego obtener información inmediata sobre si esa línea de código worked-- muy práctico. Y también, sólo una note-- técnica la consola de JavaScript es un ejemplo de un REPL-- así que eso es R-E-P-L, REPL, que significa leer, evaluar, lazo de impresión. Vas a escribir algunas cosas en, va a leer lo que ha escrito en, que va a evaluar, y que va a imprimir el de salida, y luego se va a empezar de nuevo. Eso le permite ir rápidamente en círculos iteración, que es realmente genial. Supongo última verdadera note-- este es la verdadera última nota, sí. ¿Cómo podemos realmente utilizamos JavaScript? Así que primero, podemos importar usando una etiqueta de script en la parte superior o inferior de un HTML file-- en cualquier lugar dentro de un archivo HTML, De Verdad. Y dentro de una etiqueta de script, hay dos sub-modos de importación JavaScript. El primero es por tener una archivo JavaScript independiente que importamos en su totalidad, o por tener un área de código como guión para empezar, y luego script de barra invertida a fin. Y entonces sólo escribimos JavaScript dentro del archivo HTML. Esas son las dos maneras. No se puede tener dentro de HTML. AUDIENCIA: ¿Es uno mejor que el otro? VERDE SAM: La pregunta era, Es uno mejor que el otro. Así que, sí, como una práctica estilo de codificación, y también es como una práctica de diseño. Hay dos razones por qué podría ser mejor. La primera es, que hace que su código de una mucho más legible si todo el código HTML está en un solo lugar, todos los de su CSS está en otro lugar, todo tu JavaScript se encuentra en un tercer lugar. ¿Correcto? Creo que ya deberíamos haber hablado al respecto en las Categorías-- como CSS-- lo que es-- y va a menudo en otro archivo. Así, el mismo tipo de concepto aquí. También puede imaginar que JavaScript sería ser reutilizado en más de una Página HTML, o tal vez una gran número de páginas HTML, y que tiene que JavaScript refactorizado en uno archivo que se puede importar en más de un lugar permite que el código sea manera más fácil de mantener. Se puede imaginar hacer uno cambiar el JavaScript y tener que cambiarlo en 100 archivos diferentes. Y en vez podemos simplemente cambiarlo en uno, que es mucho más potente. ¿He respondido a su pregunta? Guay. También podemos escribir en la consola, como hemos mencionado antes. Y una vez más, una última note-- Web Audio está construido, usted no tiene que cargar nada. Guay. ¿Hay alguna pregunta, ¿tiene cualquier más preguntas acerca de JavaScript, antes de seguir adelante? AUDIENCIA: [inaudible] VERDE SAM: Muy bien, fresco. Así que ahora él va a hablar de la API. HUGH ZABRISKIE: Cool. Gracias, Sam. VERDE SAM: Claro. HUGH ZABRISKIE: impresionante, por lo que vamos a pasar de JavaScript. Así que hemos hablado de algunos de lo esencial de JavaScript, y esas son las variables, funciones, objetos, funciones como variables, carga asíncrona. Estas son todas las cosas que usted va a ver como se utiliza la Web Audio. Así que sólo vamos a hablar acerca de lo primero en un nivel alto. Es una API, así que es algo que se construye, como dijo Sam, a la derecha en el código JavaScript que se utiliza en la consola. Y en realidad es como código C ++ lo que realmente se construyeron en Chrome y Firefox, y todos estos navegadores. Así que la idea principal con la Web Audio es que tienes este tipo de tubería de audio, ¿verdad? Así sus datos de audio viene en alguna forma. Hay clase de de tres forms-- principal usted tiene el oscilador, que crea una onda sinusoidal, onda coseno, vamos a ver cómo funciona. Otro muy común, por supuesto, es un MP3. Así que tal vez usted comienza con una canción, y luego querer hacer algún tipo de filtrado a eso y de salida que- que podría ser una posible fuente. Y luego un muy cool uno es el micrófono. Así que usted puede utilizar algunos muy llamadas básicas en JavaScript para obtener acceso a la micrófono, por lo que si usted quería hacer una aplicación como un detector de tono, por ejemplo, que lleva en su voz y datos fuera el pitch-- manera muy fácil de eso. Puede sólo tipo de leerlo en, averiguar la frecuencia, y entonces la salida un número. Así que vamos a ver cómo funciona, también. El destino es básicamente donde los datos de audio se emite. Así que en general, eso es como los altavoces portátiles. Otras opciones son como un ScriptProcessorNode-- vamos a llegar a los nodos de un second-- pero básicamente, ya sea que usted está poniendo sonido a cabo a través de su ordenador a través de altavoces, o si buscas tipo de grabación, por lo estás almacenarla como datos de audio. Así que tal vez si alguien crea la música en su aplicación y después que desea grabar eso y tal vez como exportarlo a SoundCloud, por ejemplo-- eso sería una manera de hacer eso. Todas las cosas divertidas, que hablaremos, que ocurre entre estos dos puntos, donde cargamos en la música y luego salida de la misma. Así que voy a hablar de los cinco etapas de producción de audio en un segundo. Tenemos esta cosa llamada un AudioContext, que es este pequeño envoltorio que vemos aquí. Básicamente lo AudioContext es-- si ir a la consola de JavaScript en este momento, podemos crear uno ahora mismo. Sólo un ejemplo de REPL, ¿verdad? Estaban leyendo, evaluar y que imprime. AudioContext es un estado global. Es una estructura, es un objeto aquí, y mantiene la información acerca de las cosas que están pasando en la pantalla relacionados con el audio. Un ejemplo es la hora actual. Esto le indica el número de segundo, con mucha precisión, desde la página web cargada. Así que esta es una muy útil pequeña propiedad que puede utilizar. Ha leído only-- creo que en realidad se puede tratar de establecer un valor. Se dirá que establezca, y luego, si lo imprima nuevo-- no fue así en realidad bastante trabajo. Así que no son de sólo lectura propiedades en JavaScript. Esto es realmente útil si estás tipo de sincronización una gran cantidad de diferentes información, cuando estás tipo de tocar diferentes sonidos. Otra muy útil es el destino contexto. En definitiva, si te interesa, ya sea intentar esto en su propio derecho de la consola ahora. Así que este es un AudioDestinationNode. Básicamente lo que dice es, ¿Hacia dónde va la salida? Así que hay dos opciones reales aquí. Por lo general, el valor por defecto es sólo de los altavoces, así AudioDestinationNode básicamente dice hay cero salidas al sonido entrando, enviado al altavoz. Así que en general, no lo hace tienes que jugar con eso. Si usted está interesado en utilizar realmente la ScriptProcessorNode para la grabación, Definitivamente me an disparar correo electrónico más tarde porque eso es un poco más complicado. Pero, en general, usted es sólo un poco de la salida de sonido en alguna forma. Tan guay, vamos a saltar de nuevo aquí. AUDIENCIA: Lo siento. HUGH ZABRISKIE: Sí. AUDIENCIA: Sé que usted dijo que hablar a usted más tarde acerca de la grabación. ¿Puedes interfaz que con Pro Tools? HUGH ZABRISKIE: Con Pro Tools? Veamos. No lo creo. Así que va entre el cliente, que es el JavaScript consola, y su real computadora, es generalmente algo que es una especie de fuera de los límites, si voluntad, tipo por la naturaleza de el-- es una especie de cosa diseño, pero intenta mantener el explorador independiente desde el ordenador real del usuario. Por lo general, lo único que es capaz de de acceso es el micrófono o la cámara. No eres capaz de hacerlo, me no creo, utilice Pro Tools. Sin embargo, si ha creado una pista en Pro Tools, exportado que, usted podría cargar ese aquí, filtrarla, por ejemplo, proceso que, y registrar que en un Audio Destination-- o no-- una Esfera Nodo procesador. Y a continuación, a partir de ahí, se podía exportar que a SoundCloud, que podría enviar en un correo electrónico, o lo que quiera a partir de ahí. Pero hay una especie de pequeña barrera entre hacer música en su computadora y hacer música en línea. SAM VERDE: Y eso es no es exclusivo de esta API. Es una característica de seguridad de Chrome, y Creo que cualquier otro navegador moderno. El navegador es autónomo. Así, por ejemplo, una página web no puede utilizar JavaScript para activar el sonido en los altavoces, por ejemplo. O no puede apagar la computadora. Y no hay punto intermedio entre esas dos cosas, a la derecha, así que o tienes una completa abstracción, o se abre la falla de seguridad de dejar un programador con malas intenciones hacer lo que quieran con su computadora portátil. Y es por eso Chrome es autónomo. HUGH ZABRISKIE: Sí. Tiene sentido? Guay guay. Yo sólo iba a mostrar un ejemplo de uno. Esto es más o menos como la medida de lo que se obtiene, en términos de acceder a la computadora del usuario. Si tiene un teclado USB conectado, puede utilizar algo que se llama la Web API MIDI, que no lo haremos realmente hablar aquí, pero esto es otra API que es incorporada en al menos Chrome-- de nuevo, es por eso que nos encanta Chrome-- Creo que Firefox o Safari, esto es una cosa fácil de google-- navegadores diferentes tienen diferente de soporte para los cuales APIs que han implementado. Pero si usted quiere conectar un teclado y trabajar con esa información, tipo de enviar el teclado la información a la computadora y luego utilizar esa línea, esta API es el lugar donde quiere estar trabajando eso. Guay. OKAY. Así, moviéndose rápidamente de aquí. ¿Cómo vamos a tiempo? ALTAVOZ 1: Sobre 15. HUGH ZABRISKIE: 15 minutos para el final? Vale, guay. Así que vamos a carrera por delante aquí. Así que, básicamente, el principal punto de pensar en esto como una tubería es que cada paso en la tubería es una serie de nodos de audio. Nuestra fuente, digamos, es un oscilador. Tenemos que crear un nodo de oscilador. Y eso es sólo un poco de la pequeña function-- y están todos basados ​​cabo del contexto audio aquí. AUDIENCIA: Cuando se dijo oscilador, ¿significa que en realidad es, literalmente, al pasar de dos polos diferentes de ida y vuelta? HUGH ZABRISKIE: No, es como una representación digital. Se aplica realmente en C ++. En realidad no sé las especificaciones de cómo se llevan a la práctica, pero todo esto está funcionando como datos binarios. En realidad, sí. Eso estaría diciendo, que pude En realidad, si te interesa, Yo podría enviar un poco más información sobre cómo las formas de onda se mantienen con un formato digital. Vale, guay. Así que estamos generando un tono como un sine onda o algo así, tal vez 440 Hertz. Creamos un oscilador. Si queremos ajustar el volumen, nos conecte nada a un GainNode, que podríamos ver con .creategain. Que establece su volumen. Puede pasar que en cualquier del otro options-- así, por lo que una fuente de búfer de audio nodo es donde usted puede ser almacenar un MP3 que usted ha cargado en. Biquad filtro es para el filtrado si usted quiere tomar toda la base fuera de una canción, o algo así. Dios no lo quiera usted quiere tomar la base de una canción. Y el nodo AudioDestination es, de nuevo, al igual que nuestra conclusión es. Si alguna vez interesado en ver todas las diferentes opciones posibles, sólo tiene que ir a la pestaña y dejar la auto-completar subir. Y si usted no cree, usted verá todo el diferentes cosas que se pueden crear. Puede crear dinámica procesadores de secuencia de comandos, Ni siquiera sé lo que es decir, para la mezcla de fusiones de canal y divisores de canal y todo eso. Guay. Así que esto es sólo una ejemplo de una tubería. Así que tenemos tres fuentes entrando. Tal vez estos son formas de onda, tal vez se trata de archivos MP3. Uno va a través de un filtro, de otra siendo distorsionada otra la propia paneo de izquierda y derecha. Usted puede hacer todo tipo de cosas y todos ellos se mezclan todo junto, y luego sale el audio al final, como destino. Este es un ejemplo de lo más complicada Web código de audio se parece. Usted está creando todos estos diferentes objetos derecho aquí-- No estoy seguro de esto. No, no tiene zoom. OKAY. VERDE SAM: Haces de control, Scroll-Up. HUGH ZABRISKIE: Control Scroll-- VERDE SAM: No, no. Controlar-- HUGH ZABRISKIE: Oh, control, desplácese? Oh, te pillé. Sí. Vaya, pues no, pues no. OKAY. No haré eso. Así que sí, en esta primera sección aquí, ves estamos creando todas estas diferentes nodos fuera del contexto. Estamos formando con ellas juntos en la segunda parte por esta función llamada Connect. Esa es una realidad clave función en Web Audio. Simplemente significa que una vez que has hecho algo con el sonido en un nodo, pasarlo a la siguiente nodo. Así que tenemos la fuente, conecta al analizador, el analizador hace algo con él, que va a la distorsión, y así sucesivamente, y al destino abajo a la derecha aquí. Guay. OK, así que vamos a seguir avanzando. El pipeline-- de nuevo, éstos son las tuberías más comunes, así que hablamos de todas estas cosas como distorsión, paneo, todas estas cosas. Si usted está realmente interesado en el uso de las cosas de Pro Tools, quienes probablemente le interesen. Si no es así, tal vez sólo quiero jugar el sonido, o tal vez lo que desea es ajustar el volumen del sonido. Esos son los dos tipo más común de gasoductos en la producción de audio. Una vez más, las formas en que pueden tomarlo en como oscillator-- así, vamos a hacer la demostración de que aquí. Así que vamos a crear un contexto de audio sencillo aquí, y de que vamos crear nuestro oscilador. Así que esto es, de nuevo, sólo estamos va a llamar Crear oscilador. Vamos a establecer una frecuencia de que, 440 Hertz, de todos favorito. Entonces nos conectamos que al destino point-- que es el altavoz, por lo el destino contexto. Por último, nos limitamos a decir, empezar de cero segundo a partir de ahora, y qué nos suena? [ZUMBIDO] HUGH ZABRISKIE: Aquí vamos. Es sólo una onda sinusoidal. Vale, guay. Y luego nos detendremos eso. AUDIENCIA: ¿De dónde que la retroalimentación viene? HUGH ZABRISKIE: La retroalimentación? Oh, probablemente nuestros micrófonos. Así que sí, así es como lo haces. Y de hecho, si tuviera mantenido en funcionamiento, podría tener la frecuencia valor que se está ejecutando, así que eso es una cosa divertida de jugar. Guay. Eso es siempre una encantadora una a presentar. VERDE SAM: No lo hizo pensamos en eso, hicimos? HUGH ZABRISKIE: Sí, eso es una desagradable. Así, tampón loading-- voy a mostrar un ejemplo de ello en el final. Eso es cargar un MP3. Y el micrófono, se utiliza sólo una función llamado Navigator.getUserMedia () para solicitar el acceso al usuario de micrófono para esa información. Aquí está filtrando, voy a simplemente mantenerse en movimiento de este. Esto es muy alto nivel, pero los filtros sólo le permiten [SONIDO] Filtrado también le permite para crear cosas como el rosa el ruido, el ruido marrón, ruido blanco. Si desea crear ruido puro, que algunas personas les encanta perder el tiempo con, puede utilizar Web Audio filtrado para hacer eso. Audio Panning-- así que imagina si usted está escribiendo un juego y desea que el sonido suena como si viniera, como, disparar a través de la pantalla, puede usar el paneo del audio para crear este tipo de cono, que como-- es bastante mathy, pero en realidad es muy fresco si consigues que funcione, y hay algunas buenas tutoriales sobre lo que se puede enviar. Básicamente, usted puede clase de crear el sonido de que algo salga por una forma 3D. Y si usted tiene un interés de DJ, puede empezar a mezclar y cruzar canciones desvanecimiento. Este es sólo un muy básico código, básicamente lo que hice antes. Ajusta el volumen de la oscilador, así que creamos nuestro oscilador que crea la forma de onda. Creamos nuestra GainNode, establecer nuestra frecuencia, y luego conectar el oscilador a la GainNode, que luego cambia básicamente la cantidad de señal se permite a través. Pero, en realidad, es una cámara digital cosa, por lo que es más sólo-- sí. Eso no es lo que está sucediendo realmente, pero eso es lo que sucede en la vida real con una ganancia. AUDIENCIA: --quantization del parámetro de volumen? HUGH ZABRISKIE: Lo siento? AUDIENCIA: ¿Es una parámetro de volumen cuantificado? HUGH ZABRISKIE: Sí. Y esto es una cosa que estoy muy deficiente en mi conocimiento, cómo funciona la ganancia a nivel digital. Sé que con real señales, es básicamente la cantidad de control que eres amplificar la señal. Así que sí. Te voy a enviar más información sobre eso, porque tengo curiosidad realidad saber más sobre eso. Pero básicamente los parámetros son, uno es el fold-- el signal-- más fuerte y el cero no es señal, o no se oye ningún sonido. Nos saltaremos tiempo de demostración de que, debido a que es básicamente lo que hice antes. Y de nuevo, la Context.Destination es el nodo de destino audio. Impresionante, OK. Así que me voy a hacer un rápido dos demos. ¿Cómo vamos a tiempo? ALTAVOZ 1: Cerca de 10 minutos. HUGH ZABRISKIE: 10 minutos? ¡Excelente! Impresionante. Así que lo primero que yo voy a do, se llama mi canción favorita. Así que esto es sólo una poco de HTML JavaScript. Vamos a tener dos botones en la página de jugar mi canción favorita y detener mi canción favorita. Voy a cambiar esto. AUDIENCIA: Cubra su micrófono. HUGH ZABRISKIE: Sí. Y yo he cargado aquí un guión que basically-- y esto es realmente útil para cargar un MP3, así que esto sólo hace cargar manera MP3s más rápido. Es básicamente una envoltura. Simplemente hace que el proceso de loading MP3s mucho más rápido, de lo contrario estás usando petición HTTP, algo así como lo que estábamos haciendo en la pieza actual establecido con el servidor. Es muy feo, que no quieren hacerlo. Así que este chico, Boris Smus, escribió una realidad pequeña herramienta útil llamada BufferLoader. Todo lo que hacemos es simplemente pasarlo al contexto, se pasa un películas-- o, sí, es una lista en JavaScript? SAM VERDE: Una matriz. HUGH ZABRISKIE: Oh, es una matriz, que sea adecuado. Es un conjunto de caminos a diferentes archivos. Y luego se le pasa una función. Se trata de la devolución de llamada hablábamos acerca de con la carga asíncrona. Eso se llama Una vez que los archivos cargados. Y esa función que se llama cuando el archivo de carga toma como un perímetro una serie de amortiguadores cargados. Así que se produce aquí. Básicamente, es BufferList va a ser uno value-- o que va a ser una serie de longitud uno, que tiene en ella en el índice cero el archivo cargado entera del MP3. Así que lo que hago cuando termino carga es, simplemente crear una fuente de tampón, que es un nodo de origen búfer de audio. El siguiente paso es que se carga en el source.buffer como tampón de carga completa Del BufferList-- que es un montón de buffers-- y luego conectar ese audio amortiguar al destino. Entonces, ¿qué se va a hacer es simplemente poner el MP3 directamente a través de la salida, y comenzar inmediatamente al llegar a esta llamada. Fresco, así que vamos a ver esto sucede en la acción. Mi [inaudible] aquí, vamos a ver. Así que sólo voy a iniciar un servidor básico. Eso es algo que que tiene que hacer si estás hacer peticiones de archivos de carga. Voy a iniciar un servidor básico. Esto es básicamente su totalidad PSET ahora mismo en una línea, pero se acaba de empezar un servidor en el puerto 80/80. Así que vamos por aquí, nos va a cargar 80/80, vamos a ir a mi canción favorita. Así que si me golpeó "Jugar mi canción favorita "en este momento, que va a cargar mi canción favorita y jugar it-- [MÚSICA - The Eagles, "LA VIDA EN EL RÁPIDO  CARRIL"] -que pasa a ser "La vida en el carril rápido "de The Eagles. Ahora, yo podría golpear "Deja de mi canción favorita "y reproducirlo. [MÚSICA - The Eagles, "LA VIDA EN EL RÁPIDO  CARRIL"] Y si me voy a consolar, porque He utilizado una variable global por aquí hacer un seguimiento de este valor, que en realidad ahora será reconocido en la consola. Por lo tanto, auto-crea para mí. Así que eso es lo que está sonando en este momento, y yo simplemente puedo llamar source.stop () en eso. Bueno, ¿sabes qué? Sólo para que ustedes han oído esto song-- es posible reconocer esta canción. [MÚSICA - Rick Astley, "Never Gonna DAR  USTED UP "] [MÚSICA - The Eagles, "LA VIDA EN EL RÁPIDO  CARRIL"] Hemos ahora todos han rickrolled. OK, genial, de seguir adelante. Guay. Así que esto es básicamente un ejemplo de lo que podría cargar un MP3 file-- [MÚSICA - The Eagles, "LA VIDA EN EL RÁPIDO  CARRIL"] --y jugarlo, y detener y comenzar a ella. Yo podría haber hecho mucho más [inaudible] El último que voy a hacer es, Te voy a mostrar un [inaudible]. [REPRODUCCIÓN DE MÚSICA] Es como, ogg.wave.mp3. Creo que, si no recuerdo mal, Me he topado con algunos problemas con .m4a, pero no estoy seguro de eso. Creo mp3.wave-- [MÚSICA - Rick Astley, "Never Gonna DAR  USTED UP "] Vale genial. No debería haber dicho eso. De todos modos, hola. Así que tenemos esta abierta. Así que ahora todo lo que hago es, básicamente creado una sintaxis básica para crear música. Así que si no hago algo así, agregue g4 el 1 de 2, lo que eso significa es que, añadir la nota piano, G4, que es la cuarta G arriba en el piano de la parte inferior. Así que esto es una especie de MIDI hablar, así que para aquellos que se basan la música, esto es simplemente notas MIDI. AUDIENCIA: Esa es la G del Medio C, ¿verdad? HUGH ZABRISKIE: Esta es la G por encima de Medio C, es cierto. AUDIENCIA: Sobre Medio C. HUGH ZABRISKIE: Sí. Actualmente, si. Creo que en realidad hice nos [inaudible], por lo que esta podría ser una octava por encima de eso. Así que vamos a ver. Si me golpeó Play-- [PIANO REPETITIVOS NOTA] --we're va a oír eso. La idea es que opera al igual que una línea de comandos sería, así que si me voy arriba y abajo en mi teclado, puede volver a la anterior comandos, lo cual es bastante útil. Y a continuación es mi lista de pistas, que están todos funcionando en bucle. AUDIENCIA: Usted fue asumiendo la 88 teclas del teclado en eso, ¿verdad? HUGH ZABRISKIE: La pregunta era, estoy asumiendo un teclado de 88 teclas, y sí, lo soy. Lo que hice es que básicamente tomó 88 muestras del piano, uno para cada nota. Y así, cada vez que escuchar una nota de ahora en adelante, que en realidad es un bucle que se parece como-- Esto se está poniendo reproducir en bucle, por lo que para cada nota, esto se está ejecutando. Lo que pasa es que yo crear un tampón de nuevo, Puedo crear un nodo de ganancia para ajustar el volumen. Esto sólo una realidad complicada manera de decir que almacenar el tampón en un source.buffer. Le doy la ganancia, yo conectarlo a la ganancia, la ganancia está conectado a la de salida, y luego la toco. Así que es una especie de proceso de tomar en una fuente de búfer. AUDIENCIA: ¿Puede usted realmente tomar ese sonido seco y que sea húmeda [inaudible]? HUGH ZABRISKIE: Puede, sí. Hay re-verbo, hay retardo, distorsión. Básicamente, puede poner cualquier cosa en entre en ese sándwich de-- así, tubería es una metáfora mejor, pero usted puede añadir nada a eso. Guay. Así que voy a terminar la demo aquí para darle un sentido apenas de la gran cantidad de veces que se puede ejecutar esa función a la vez. Así que me voy a quitar esto. Voy a crear un generador que-- básicamente lo does-- esto es realmente una especie de syntax-- complicado pero es va a generar notas sobre la marcha, y acaba de empezar a jugar ellos ya que les evalúa. [PIANO interponiendo] Así que sólo podemos hacer un poco de música aquí. [PIANO interponiendo] Así que lo que este comando hace, por ejemplo, es que toma esas tres notas para el piano y luego los pone en B3. Esta sintaxis puede hacer un poco más de sentido para aquellos que tienen un música de fondo aquí. Puedo añadir un bombo. Yo puedo-- [Interponiendo INSTRUMENTOS] --sólo jugar con eso. Así que usted puede make-- [Interponiendo INSTRUMENTOS] Que uno es un poco más molesto. [Interponiendo INSTRUMENTOS] Así que se suma al azar címbalo seca en cada nota 16a, con un 16% [INAUDIBLE]. [Interponiendo INSTRUMENTOS] Sí, por lo que la forma en que esta works-- siempre en 4: 4. [Interponiendo INSTRUMENTOS] Sí, por lo que los cuatro trimestres, y 16/8. [Interponiendo INSTRUMENTOS] Así que, en promedio, se obtiene el 60% de accesos a las notas 16. De todas formas, esto era sólo tipo de mostrarse algunas de las cosas que podría construir con la Web API Audio. Es muy potente, es muy rápido, y usted puede hacer un montón de cosas interesantes con ello. Así que de nuevo, cualquier pregunta que tenga, email myself-- Hugh-- o Sam, y honestamente, Google tiene un montón de buenos recursos. Alguna última pregunta? Sí. AUDIENCIA: Así que usted puede acceder a el micrófono incorporado. ¿Qué pasa si usted quiere utilizar un micrófono mejor? HUGH ZABRISKIE: Si querías para utilizar mejor micrófono? Así que de nuevo, esto es parte de la abstracción entre Cromo y el resto de su equipo. A menos que sea disponible a través de una API, como API Web MIDI, que probablemente podría encontrar algunos hacks, pero generalmente no es tan viable. VERDE SAM: Puede También-- todo el cromo sabe es lo que el micrófono predeterminado es, y tiene acceso a eso. Así que si usted tenía un micrófono pudieras establecer como micrófono predeterminado del equipo, usted puede acceder a él de esa manera y probablemente trabajar. HUGH ZABRISKIE: Ese es un buen punto. Nunca lo he intentado, pero usted podría ser capaz de clase de-- si redirige el altavoz de entrada, usted podría ser capaz de hacer eso, sí. Alguna última pregunta? Guay. Bueno, gracias chicos tanto por su atención. Estoy Hugh. VERDE SAM: Soy Sam. HUGH ZABRISKIE: Y esto es CS50.