Programación General > Visual Basic 6.0 e inferiores
duda con Qbasic
adrianes:
hola nebire mm oie una duda muy grande mira pues yo tengo principios de programaciion en mi escuela de trabajo final ya me pideron unos programas pero mira dejo unos cuantos programas pero 2 de ellos no les entiendo osea ya ise mi codigo y todo y no me corren te pido ayuda a ti por q mi maestro nunk nos explico como hacer y pues como sabes en mexico uvo un virus de influenza y nos paso a fregar a todos y perdimos mucho tiempo de clase me gusta mucho programar pero tiempo ya no hay por eso recurro a tu ayuda aca te van mis programas y me corriges en caso de star mal
ahah xD el lenguaje es q basic
1.-que la computadora lea un texto y vaya diciendolo por la bocina del cpu(speaker)(ingeniosa)
10 OPEN "A" , #1, "C:borra.txt"
20 INPUT "Nombre ", n$
30 INPUT "Edad ", e$
40 WRITE #1, n$, e$
50 CLOSE #1
55 OPEN "I", #1, "C:borra.txt"
60 FOR n = 1 TO 20
70 IF EOF(1) GOTO 200
80 INPUT #1, a$, b$
90 PRINT a$, b$
100 NEXT n
200 CLOSE #1
210 END
ya lee el archivo pero no lo reproduce el sonido y no se como hacerle
2.- hacer control de cobranza e inventario ese no le entiendo nada porfavor te pido tu orientacion yo se q nadie sta para hacer tareas pero solo ocupo una orientadita de antemanio gracias pero respuesta
Nebire:
Antes de atender a tus preguntas, quería hacerte algunas aclaraciones.
1º QBasic es un QuickBasic venido a menos, es decir es una versión simplificada de la versión Quickbasic 4.5 . QBasic sólo tiene un mérito y es que se entregaba con el S.O. win-98, win-200 win-ME y no recuerdo si venía también con el win-95. Esto se hizo a raíz de que cuando cesó el desarrollo de QuickBasic se inició la versión 1 de Visual Basic (bueno no exactamente, pero los detalles no importan tanto).
Entonces si ni ya el quickbasic precisaba numerar sus instrucciones allá por el año 90 (año arriba, año abajo), significa que tampoco lo necesita QBasic que apareció algunos años después(quizás en el 95, no recuerdo ya la fecha exacta), si has leído los mensajes anteriores. La numeración son etiquetas y si bien las etiquetas son muy útiles las etiquetas basada en número lo son menos, especialmente si se etiqueta cada línea. Supongamos que tienes un código con 1000 líneas vas dejando saltos de 10 en 10 (tal como muestras en el ejemplo), bien supongamos ahora que quieres modificar parte del código sobre la linea 100 el resultado es que se añaden 80 líneas de código, bien pués eso supone que tienes que alterar las etiquetas de líneas de código que simplemente no has tocado.
Más aún si tienes algo como goto 1140 y está líneas ha sido 'absorbida' en el código añadido, entonces deberás etiquetarla a la línea que realmente hace referencia, pero si olvidaste hacerlo en el momento adecuado, puede ocurrir que ahora tengas bastante trabajo para buscar que línea era la que recibía el 'salto', por eso utilizar etiquetas de texto es bastante más útil. decir goto ContarUnidades no requiere tener que cambiar la etiqueta si añades líneas...
Para los que no lo sepan, decirles que en VB 6.0 podemos utilizar igualmente las etiquetas y numerar así cada línea del código... pero espero que a nadie se le ocurra hacerlo a no ser que sea sólo por probar...
2º qué edad tiene tu profesor y vosotros ?. No me imagino que razones lleva a un profesor a enseñar a sus alumnos QBasic, después de todo es un lenguaje de 16 bits, por lo menos Visual Basic 6 es un lenguaje de 32 bits, y es lo menos que se debería enseñar, en fin me gustaría conocer las razones... sabiendo edades quizás pueda hacerme alguna idea...
Bueno, pasando a tus cuestiones...
El altavoz del computador requiere mucho código para producir un código que permite 'hablar texto', de hecho yo lo desestimo. La voz humana es un conglomerado de frecuencias donde se intermezclan el tono, el timbre, el tempo etc...
Puedes intentar algo que permita ser 'reconocido' como voz pero con bastante trabajo. En cualquier caso necesitarás muchos conocimientos sobre el lenguaje, QBasic no tiene todos las intrucciones que tiene QuickBasic, por lo que para empezar creo que algunas instrucciones que luego te expondré posiblemente no las reconozca.
Un modo en que podrías acercarte a ello sería grabar tu voz en el computador, por ejemplo utilizando la grabadora de windows, grabando cada letra y luego analizarla desde un programa de edición y/o retoque de música, viendo el espectro en WAV, puedes ver que frecuencias utiliza cada letra, su tempo, etc... Ahora bien excepto las vocales el único modo de grabar otras letrás será dentro de una palabra y cortarlas juiciosamente. Una alternativa más cómoda pero probablemente menos viable es grabar todas las sílabas que tiene el español y analizando el espectro descomponer y obtener el patrón para cada una de ellas, el probelma es que si bien las letras son un puñado, las sílabas posibles son miles, por lo que el trabajo sería enorme. Tratar de implementar funciones que pronuncien una sola letra cada vez será laborioso (pero posible), sin embargo concatenar los sonidos de una y otra letra después resulta más pobre que si se hiciera sobre sílabas...
QBasic utiliza la instrucción Sound para producir sonidos por el altavoz, su uso es equivalente a la API BEEP del VB 6.0 es decir
Sound frecuencia, duracion
frecuencia es un valor entre 37 y 32767 . Las frecuencias menores de 37 interaccionan con la electricidad de los mensajes del cerebro y por tanto están prohibidas y en la práctica frecuencias por encima de 12000-15000 son inaudibles para el ser humano (he observado muchas veces que las frecuencias entre 15000 y 20000 producen molestias a los gatos y perros)
La duración hay que interpretarla. la base de tiempo se estableción en 18'2 tics por segundo, por tanto debes hacer una regla de 3 para que la duración sea la esperada. (el beep de VB usa duración en milisegundos y la frecuencia tiene las mismas consideraciones que aquí)
Sin embargo con sound no vas a hacer mucho, se utilizó masivamente para producir sonidos en los juegos (el resto de programas era prácticamente mudo), hasta que empezaron a aparecer tarjetas de sonido.
Para lograr algo, necesitas utilizar la instrucción Play, ahora mismo no recuerdo si QBasic la incluye. De hecho yo te propondría que si realmente quieres hacer el programa te busques e instales una copia de QuickBasic 4.5 Creo que es abandonware, por lo que por emule seguro que encuentras alguna copia.
Mañana que encuentre un hueco, preparo un sencillo código que puedas usar como ejemplo y tomarlo como punto de partida si te apetece....
Ahora sólo te ofrezco un código equivalente a lo que tienes pero eliminado idioteces... del mismo.
--- Código: Visual Basic --- DIM n AS STRING DIM e AS INTEGER OPEN "A", #1, "C:borra.txt" INPUT "Nombre del sujeto: ", n INPUT "Edad del sujeto: ", e WRITE #1, n, e CLOSE #1 OPEN "I", #1, "C:borra.txt" CLS ' borra la pantalla DO WHILE NOT EOF(1) INPUT #1, n, e PRINT n, e LOOP CLOSE #1 END Nota: las cadenas en el fichero se escriben entrecomilladas, si describimos la edad como entero el resultado es muy parecido pero no está entrecomillado. cuando se escribe a fichero usando Write, separa cada campo mediante comas. esto es así incluso en vb 6.0
adrianes:
mm si muchas gracias nebire ahora volviendo a esto mi profesor tiene mm como 65 años el nos dijo q para ser buen programador se comienza desde 0 y nos dijo q si aprendiamos a usar q basic era la base para comenzar a programar en c++
y con respecto alas etiquetas pues no me habia dado cuanta en cuanto a los comandos y las atiquetas el profe me dijo = q olvidara lo de 10 20 30 por q despues en programas mas complejos se podria venir un catastrofe y seria mejor repetir el programa q arreglarlo en cuanto al sonido el profe no nos quizo decir como nos dijo algo de q usaramos una tabla y usaramos el comando sound 2000,2 pero aun sigo sin saver q onda y pues me gustaria saber ya que tengo unos proyectos
que quiero terminar
de ante mano gracias y spero una respuesta..
Nebire:
--- Cita de: "adrianes" ---mm si muchas gracias nebire ahora volviendo a esto mi profesor tiene mm como 65 años el nos dijo q para ser buen programador se comienza desde 0 y nos dijo q si aprendiamos a usar q basic era la base para comenzar a programar en c++
y con respecto alas etiquetas pues no me habia dado cuanta en cuanto a los comandos y las atiquetas el profe me dijo = q olvidara lo de 10 20 30 por q despues en programas mas complejos se podria venir un catastrofe y seria mejor repetir el programa q arreglarlo en cuanto al sonido el profe no nos quizo decir como nos dijo algo de q usaramos una tabla y usaramos el comando sound 2000,2 pero aun sigo sin saver q onda y pues me gustaria saber ya que tengo unos proyectos
que quiero terminar
de ante mano gracias y spero una respuesta..
--- Fin de la cita ---
Aprovechando que he ido al baño y que me he desvelado... te coloco un par de códigos. Ahora bien, después de la explicación que me has dado acerca del profesor, creo que se conformará con algo bastante, bastante, bastante más sencillo especialmente si te especifica que uses el comado sound, cualquier parecido con la realidad requiere mucha imaginación para que sea tomado como voz...
Primero vamos a hacer que suene algo, te explico que significa cada cosa de las que usamos, in situ.
--- Código: Visual Basic --- ' para empezar algo sencillo ' definimos una 'cadena' de sonido:dim p as string p = "ACDAEFAEGABCD" ' las notas musicales Do,Re,Mi,Fa... están asociados a las letras que van de la A a la G, ' para no tener que calcular escribe en un papel las notas y debajo de cada una la letra equivalente, así traducir es muy fácil... como hago aquí ' esto es : DO RE MI FA SOL LA SI ' A B C D E F G ''por tanto esta cadena es nuestra partitura: Do Mi Fa Do sol La DO SOL SI DO RE MI FA , que produce un sonido como de 'espera'... PLAY "O0 L12" ' SELECCIONAMOS UNA OCTAVA (Octave 0 cero) Y LA DURACIÓN (Length 12) DE LAS NOTAS CLS : LOCATE 1, 1: PRINT "Pulsa s para salir." DO PLAY "X" + VARPTR$(P) ' aquí le damos la orden de tocar (eXecute) las notas definidas en la direccion de meoria que le corresponde a la variable p PLAY "P4" ' hacemos una pausa (Pause de 4) LOOP WHILE INKEY$ <> "s" ' repetimos hasta que se pulse la tecla s (minúscula) END ' finaliza el programa Si quitas los comentarios verás que el código es en realidad muy breve
Ahora que ya conoces la ´correspondencia de notas - letras voy a localizar alguna pequeña partitura por google y 'traducirla' al comando play (lo que vamos a buscar es algo así como 'Cancones para faluta' o cadenas específicas como 'Re Mi Sol'
Misión imposible: mi mi sol la mi mi _ re re mi mi sol la _ mi mi re MI habrá que jugar con el tempo y pausas para que se parezca lo más posible
m = "CCEFCC BBCCEF CCDC" No suena muy bien porque con faluta tu vas dejando los tiempos y duración de nota precisos, es es lo que falta añadir al comando. Como no soy músico te lo dejo ligeramente modificado, para que te ilustre en el proceso de como debe hacerse:
M = "L10 O0 CP32 CP32 L12 EFP32 L10 o0 Cp32Cp20 BBCCEFp20 CCDC"
como ves sólo he añadido metacomandos que ya conoces Ln On y Pn
para probarlo copia la cadena dentro del ejemplo anterior y sustituye en ' + Varptr$(p) por + Varptr$(m)
si previamente has probado con 'm = "CCEFCC BBCCEF CCDC"' verás que ya ha ganado un poco más para que suene como lo reconocemos...
Ahora te pongo un ejemplo para usar de modo asíncrono el play de modo y te comento in situ el código...
--- Código: Visual Basic --- ' definimos un evento play, al caso le estamos indicando que cuando queden 3-1 notas en el buffer vaya a la etiqueta indicada ON PLAY(4) GOSUB SuenaSeleccionA'Ahora activamos la caza del evento (on play... es una declaración de evento)PLAY ON ' cuando queramos podemos hacer un play off y un play stop dim Elisa as string' nuestra partitura 'Para Elisa', las notas musicales son las letras: EDEDBCA Elisa = "o3 L8 E D+ E D+ E o2 B o3 D C L2 o2 A" ' el + ó si fuera el - indica que esa nota se usa con una octava mayor que la actual pero sin cambiar de octava (sólo para esa nota). PLAY "MB X" + VARPTR$(Elisa$) CLS: LOCATE 1, 5: PRINT "Cuando pulses una tecla paramos.";DO WHILE INKEY$ = "" : LOOPEND ' rutina que se ejecuta cuando salta el evento. en cualquier momento podemos alterar el valor de ElisaSuenaSeleccionA: PLAY "MB X" + VARPTR$(Elisa) ' MB es un comando para definir que se ejecute asincronamente, (Music Background) ' para ejecutarlo sobre cóodigo se usa MF (Music Foreground) si no se especifica nada se supone MF por defecto.RETURN
Detrás de VARPTR$(Elisa) puedes poner más cosas, por ejemplo una pausa de 4 :
PLAY "MB X" + VARPTR$(Elisa) + "P4"
o mejor aún otra línea de comando,
PLAY "MB X" + VARPTR$(Elisa) + "P4" + Varptr$(Ponpon)
recuerda que las variables pueden cambiar su valor cuando quieras:
--- Código: Visual Basic ---Elisa1= "lo que sea"Elisa2="otra cosa"DO WHILE INKEY$ = "" k= (k +1) mod 32767 if k mod 3=0 then Elisa=elisa2 else Elisa=elisa1 end if LOOPEND
Lo ilustramos haciendo los cambios pertienentes:
--- Código: Visual Basic --- │ON PLAY(4) GOSUB SuenaSeleccionA│PLAY ON││DIM Elisa AS STRING│DIM Elisa1 AS STRING│DIM Elisa2 AS STRING│DIM k AS INTEGER │ Elisa1 = "o3 L8 E D+ E D+ E o2 B o3 D C L2 o2 A"│ Elisa2 = "o2 L7 F E- F E- F o1 C o2 E D L2 o1 B"│ Elisa = Elisa2││ PLAY "MB X" + VARPTR$(Elisa)│ CLS : LOCATE 1, 5: PRINT "Cuando pulses una tecla paramos.";││ DO WHILE INKEY$ = ""│ k = (k + 1) MOD 32767│ ' PLAY OFF│ IF k MOD 3 = 0 THEN│ Elisa = Elisa2│ ELSE│ Elisa = Elisa1│ END IF│ ' PLAY ON│ ' PLAY "MB X" + VARPTR$(Elisa)│ LOOP│END│SuenaSeleccionA:│ PLAY "MB X" + VARPTR$(Elisa) + "p4"│RETURN
Para una descripción completa del comando play consulta la ayuda, en el hipotético caso de que la ayuda que venga con QBasic no lo incluyera o feura ineficaz me lo señalas y te explico cada opción..
Nota: la partitura puede ser en minúsculas mayúsculas indistintamente y puede haber espacios donde quieras, incluídos en medio de cada metacomando por ejemplo: "O4AB-CDDAC" puede ser espaciado así: "O4 A B- C D D A C", ó así: "O4A B- CDDAC" e incluso"O 4..." 4 es una opción de Octava, pero lo lógico es que las separaciones sean porque te ayuden a localizar o entenderlo mejor...
Ahora vamos con sound, como no tiene misterios basta el código (nota que he incluído pausas donde me ha parecido para que diferencies donde acaba un sonido y empieza el de otro bucle:
--- Código: Visual Basic --- ││DIM k AS INTEGER, d AS INTEGER│ CLS : LOCATE 1, 5: PRINT "Cuando pulses la tecla 's' paramos el bucle de 'ambulancia'...";│FOR k = 800 TO 900 STEP ((k MOD 5) + 1)│ d = k MOD 4│ SOUND k, d│NEXT │DO│ FOR k = 440 TO 1000 STEP 5│ SOUND k, k / 1000│ NEXT│ FOR k = 1000 TO 440 STEP -5│ SOUND k, k / 1000│ NEXT│ PLAY "p4"│LOOP WHILE INKEY$ <> "s" │ FOR k = 1000 TO 980 STEP -5│ SOUND k - 40, k / 1000│ SOUND k, k / 1000│ SOUND k + 100, k / 1000│ SOUND k + 20, k / ((k * 2) / 4)│ NEXT│ PLAY "p5" │ FOR k = 300 TO 100 STEP -5│ SOUND k - 40, k / 1000│ SOUND k, k / 1000│ SOUND k + 100, k / 1000│ NEXT│ PLAY "p8" │ FOR k = 100 TO 37 STEP -5│ SOUND k, (k * (k / (1 / 100 + 20))) / 100│ NEXT Para lograr con sound algo parecido a voz, tienes que hacer como te indicaba arriba, identificar por lo menos 3 o 4 frecuencias para cada letra, su tempo y tono . Descomponer en un bucle las palabras y hacer llamadas a subrutinas (gosub etiqueta) que tiene las instrucciones sound que puedan asemejarse a sonidos de letras tal como tu puedas apreciar... Para la identificación tendrías que grabar tu voz en WAV (con la misma grabadora de sonidos de windows) y luego con un editor de sonido WAV ver el muestreo de cada letra y sacar conclusiones que puedas traducir a sound, típicamente serán varias frecuencias con una duración muy breve y/o quizás que se repitan en un bucle un determinado nº de veces (por ejemplo para la r)... las rutinas del ejemplo de sound las he seleccionado a propósito para ilustrarte detalles (magnificados en el tiempo) para detalles en principio no posibles con sound pero que puedan asemejar a ecos, reverberación, etc... como hablamos de tiempos muy cortos sería difícil apreciar en los ejemplos, por eso están magnificados en la cantidad de frecuencias y en la duración de las notas.
Ya nos pondrás algún cóodigo de tu progreso.
p.d.: he olvidado quitar las rayitas de los 2 últimos códigos, si coias y pegas el texto deberás eliminarlas manualmente. Si lo transcribes manualmente simplmenete ignora esas rayitas...
Navegación
[*] Página Anterior
Ir a la versión completa