Вы находитесь на странице: 1из 280

GUA DEL USUARIO

VERSION 3.0.4

ONTENIDOS

CAPITULO 1

INTRODUCCION

ACERCA DE ESTA GUA............................................................................. 10


Que es FlowStone ?................................................................................... 11
Como Funciona.......................................................................................... 11

CAPITULO 2

2 Interfaz de usuario

13

Caja de herramienta............................................................................. 15
Explorador de Componentes.................................................................................... 51
Panel de Filtros.......................................................................................................61
Botones de Filtro.....................................................................................................61
Cuadro de Busqueda.................................................................................................17
Bsqueda Rapida.......................................................................................................17
Restablecer todos los Filtros......................................................................................81
Favoritos....................................................................................................................18
Escala de Pantalla.............................................................................................18
Caja local de Herramientas................................................................................19

BARRA DE ETIQUETAS................................................................................. 21
EDICION DE ETIQUETAS........................................................................................21
COMPONENTES DE ETIQUETADO............................................................. 22
USO DE ETIQUETAS.............................................................................................23

NAVEGADOR................................................................................................. 24
SALTO...............................................................................................................24
PANORAMICA......................................................................................................25
MARCADORES.................................................................................................... 52

ESQUEMA DE VENTANA................................................................................ 26
ZOOMING............................................................................................................ 62
SCROLLING..........................................................................................................27
PANNING.............................................................................................................27
RESETTING ZOOM AND PAN.....................................................................................27

CAPITULO 3

3 Componentes & Enlaces

28

COMPONENTES............................................................................................. 33
AADIENDO UN COMPONENTE.....................................................................................33
SELECCION y ACCION DELPANEL............................................................................... 73
MOVIENDO COMPONENTES...................................................................................... 73
NOMBRANDO COMPONENTES.................................................................................... 83
QUITANDO COMPONENTES....................................................................................... 93
REDIMENCIONANDO................................................................................................ 93
MULTIPLES SELECCIONES........................................................................................ 04
CONECTOR DE ETIQUETAS.........................................................................................41
CORTAR, COPIAR Y PEGAR........................................................................................41

LINKS (ENLACES).......................................................................................... 42

- ii -

ONTENIDOS

CREANDO UN LINK..................................................................................................42
ALOJANDO LINKS................................................................................................... 34
MOVIENDO UN LINK................................................................................................ 34
QUITANDO UN LINK................................................................................................. 44
LINK ORDEN..........................................................................................................45
FLEXION DE LINKS................................................................................................... 64
AUTO LINKING........................................................................................................47
SMART LINKING...................................................................................................... 84
REMOVIENDO MULTIPLES LINKS...................................................................................49
INTERCAMBIANDO LINKS............................................................................................. 94
WIRELESS LINKS..................................................................................................... 05
SIGUIENDO WIRELESS.............................................................................................. 15

CAPITULO 4

4 Mdulos

54

KEY DIFFERENCES........................................................................................ 56
APARIENCIA........................................................................................................ 65
PANEL FRONTAL...................................................................................................57
PROPIEDADES......................................................................................................75
CAJA DE HERRAMIENTAS..........................................................................................58

OPERACIONES BASICAS.................................................................................. 59
MOVIENDO DENTRO EN EL MODULO.............................................................................59
ENTRADAS Y SALIDAS............................................................................................. 06
CONECCION DE PLANTILLAS......................................................................................61
NOMBRES DE ENTRADAS Y SALIDAS........................................................................... 16
CREANDO UN MODULO........................................................................................... 26
PROPIEDADES...................................................................................................... 26
MODULOS INALAMBRICOS......................................................................................... 36

PANEL FRONTAL................................................................................ 64
HABILITANDO EL PANEL FRONTAL...............................................................................64
EDITANDO EL PANEL FRONTAL.................................................................................. 56
SELECCIONANDO...................................................................................................66
MOVIENDO...........................................................................................................67
DIMENCIONANDO................................................................................................... 76
SALTANDO...........................................................................................................68
DRAW ORDER......................................................................................................69
OUT OF VIEW ITEMS...............................................................................................69
GRUPO DE ITEMS...................................................................................................70
CLIENT AREA.......................................................................................................70
ESCONDIENDO EL PANEL FARONTAL............................................................................ 17
VISIBILIDAD EN EL PARENT MODULE PANELS.................................................................. 17

PROPIEDADES............................................................................................ 73
ABILITANDO LAS PROPIEDADES DE PANEL......................................................................73
AADIENDO PROPIEDADES A ITEMS.............................................................................. 47
CONTROL TYPES.................................................................................................... 57
EDITANDO LAS PROPIEDADES DE PANEL........................................................................ 77
DIMENSIONANDO................................................................................................ 77
CUSTOMIZANDO.......................................................................................................77

SINCRONISANDO.......................................................................................... 79
- iii -

ONTENIDOS

PASTE SYNCHRONISE.............................................................................................79
SYNCHRONISE ALL................................................................................................ 08
SYNCHRONISE PAINTER.......................................................................................... 08
REMOVING SYNCHRONISATION.................................................................................. 18
FINDING SYNCHRONISED MODULES..............................................................................81

FOCUS MODE.............................................................................................. 82
FOCUS ON A MODULE.......................................................................................... 28
FOCUS ON THE PREVIOUS
MODULE............................................................................. 28

CAPITULO 5

5 Data Types & Signal Flow

83

STREAM DATA.............................................................................................. 85
DIGITAL SIGNAL PROCESSING IN A NUTSHELL.................................................................85
MONO................................................................................................................86
POLY..................................................................................................................86
WHEN TO USE POLY OR MONO................................................................................ 68
STREAM CONNECTORS........................................................................................... 88
POLY AND MONO SECTIONS IN AUDIO APPLICATIONS........................................................89
BOOLEAN CONECTOR..............................................................................................90
POLY INT.............................................................................................................90
SSE..................................................................................................................90
MONO 4..............................................................................................................91
PERFORMANCE.................................................................................................... 19

TRIGGERED DATA.......................................................................................... 92
HOW IT WORKS................................................................................................... 29
WHAT ITS USED FOR..............................................................................................93
TRIGGERED DATA TYPES........................................................................................ 39

EVENT DATA................................................................................................ 96
COMO FUNCIONA.................................................................................................. 69
EVENT DATA TYPES.............................................................................................. 79

CONVERTING BETWEEN DATA TYPES................................................................. 98


STRING <> BOOLEAN............................................................................................ 89
INT <> BOOLEAN..................................................................................................99
STRING <> FLOAT <> INT...................................................................................... 99
INT/FLOAT > POLY/MONO.....................................................................................100
MIDI <> STRING...............................................................................................101
STRING SHORTCUTS............................................................................................ 021

CAPITULO 6

6 Exportando

105

CREATING STANDALONE APPLICATIONS............................................................ 106


LIBRARY DEPENDENCIES....................................................................................... 081

CREATING PLUGINS..................................................................................... 109


INPUTS AND OUTPUTS.......................................................................................... 091
CREATE VST/VST I DIALOG................................................................................. 101
STORING VST EXPORT PREFERENCES....................................................................112

- iv -

ONTENIDOS

PRESETS...........................................................................................................112
TIMING INFO...................................................................................................... 131

CHAPITULO 7

7 GUI Edicin Avanzada

114

MODULE GUI............................................................................................ 115


MODULE GUI C OMPONENT................................................................................... 151
MGUI CONNECTORS...........................................................................................116
GUI CONNECTOR TYPES......................................................................................117
COORDINATE SYSTEM...........................................................................................118

DRAWING...................................................................................................119
DRAWING ON A PANEL..........................................................................................119
DRAWING ORDER................................................................................................120
CHAINING GUI C OMPONENTS................................................................................ 211

MOUSE HANDLING....................................................................................... 122


MOUSE AREA.....................................................................................................122
MOUSE CLICKS.................................................................................................. 221
MOUSE DRAGGING..............................................................................................123
MOUSE MOVES.................................................................................................. 241
DRAG ACCUMULATE.............................................................................................124

REDRAWING............................................................................................... 126
REDRAW CONTROL .............................................................................................126
PRECISION REDRAWS...........................................................................................126

CAPITULO 8

8 Ruby Componentes

128

INTRODUCTION............................................................................................ 129
OVERVIEW.........................................................................................................129

INPUTS AND OUTPUTS.................................................................................. 130


ADDING OR REMOVING......................................................................................... 301
CHANGING TYPE.................................................................................................130
INSERTING, DELETING AND MOVING......................................................................... 311
NAMING ...........................................................................................................131

CODE EDITOR BASICS................................................................................. 132


THE OUTPUT PANE............................................................................................. 321
THE RUBYEDIT CLASS.........................................................................................134
INPUT DATA.......................................................................................................134
OUTPUT DATA....................................................................................................135

THE EVENT METHOD.................................................................................... 138


METHOD DEFINITION............................................................................................138
CONNECTOR REFERENCING................................................................................... 391
EFFECT ON CODE EXECUTION................................................................................140

SCHEDULING EVENTS................................................................................... 141


SCHEDULING AN EVENT........................................................................................ 411
SENDING TO AN INPUT.......................................................................................... 421

-v-

ONTENIDOS

CLEARING EVENTS.............................................................................................. 421


CLOCK ACCURACY.............................................................................................. 431

RUBY VALUES............................................................................................ 144


THE RUBY VALUE TYPE....................................................................................... 441
PASSING RUBY VALUES.......................................................................................144

PERSISTENCE............................................................................................. 147
USER STATE MANAGEMENT................................................................................... 471

DEBUGGING............................................................................................... 149
ERROR REPORTING............................................................................................. 491
THE WATCH METHOD........................................................................................... 501

DRAWING.................................................................................................. 151
THE DRAW METHOD............................................................................................ 511
DRAWING CLASSES AND METHODS.......................................................................... 521
PENS, BRUSHES & COLORS..................................................................................152
BASIC SHAPES...................................................................................................153
LINES AND CURVES............................................................................................. 541
GRAPHICS PATHS............................................................................................... 561
TEXT............................................................................................................... 581
BITMAPS...........................................................................................................161
REDRAW...........................................................................................................163
CLIPPING.......................................................................................................... 631
SMOOTHING.......................................................................................................164
VIEW PROPERTIES.............................................................................................. 651

ADVANCED BRUSHES................................................................................... 167


LINEAR GRADIENTS............................................................................................. 671
PATH GRADIENTS................................................................................................171
HATCH BRUSHES................................................................................................ 781
TEXTURE BRUSHES............................................................................................. 801

ADVANCED PENS........................................................................................ 182


PEN ALIGNMENT................................................................................................. 821
LINE JOINS........................................................................................................183
DASHES............................................................................................................185
BRUSHED LINES................................................................................................. 861
LINE CAPS........................................................................................................187

INTERACTION.............................................................................................. 192
OVERVIEW.........................................................................................................192
HANDLING MOUSE EVENTS...................................................................................193
MOUSE CLICKS.................................................................................................. 941
MOUSE CAPTURE & DRAGGING.............................................................................195
KEY MODIFIERS..................................................................................................196
MOUSE MOVE....................................................................................................197
MOUSE CURSOR.................................................................................................198

CONTROLS AND DIALOGS.............................................................................. 200


IN PLACE EDIT CONTROLS.................................................................................... 002
DROP LISTS...................................................................................................... 012
MESSAGE BOXES................................................................................................202

EXTERNAL DLLS........................................................................................204

- vi -

ONTENIDOS

THE WIN32API EXTENSION................................................................................. 042


CREATING A FUNCTION OBJECT........................................................................... 042
MAKING THE CALL............................................................................................... 062

MIDI....................................................................................................... 208
READING MIDI OBJECTS .................................................................................... 082
CREATING MIDI OBJECTS.................................................................................... 102

FRAMES.................................................................................................... 212
MONO TO FRAME................................................................................................212
THE FRAME CLASS............................................................................................. 132
FRAME TO MONO...............................................................................................214
FRAME SYNC.....................................................................................................215
PROCESSING FRAMES IN A DLL............................................................................. 162

RUBY LIMITACIONES....................................................................................... 218


SIMPLE INTERPRETE........................................................................................... 182
RUBY LIBRARIAS STANDARD..................................................................................218
DECLARACION DE ORDEN..................................................................................... 192
DECLARACION DE PERSISTENCIA..............................................................................219
GEMS............................................................................................................. 192

RUBY DLL............................................................................................... 221


CHANGES..........................................................................................................221
BUILDING THE DLL............................................................................................. 222

CAPITULO 9

9 DSP Codigo Componentes

223

DSP CODING............................................................................................ 224


THE DSP CODE COMPONENT............................................................................... 242
INPUTS AND OUTPUTS.......................................................................................... 242
SYNTAX COLOURING............................................................................................ 252
EDITOR.............................................................................................................226
LOCAL VARIABLES............................................................................................... 262
ASSIGNMENTS.................................................................................................... 272
EXPRESSIONS.....................................................................................................229
CONDITIONAL STATEMENTS.................................................................................... 302
COMMENTS........................................................................................................230

ADVANCED FEATURES.................................................................................. 231


ARRAYS............................................................................................................231
HOP................................................................................................................232
LOOP...............................................................................................................232
STAGES............................................................................................................233
DEBUGGING.......................................................................................................235

CAPITULO 10

10 DLL Componentes

237

INTRODUCTION............................................................................................ 238
THE COMPONENT........................................................................................ 239
DEFINING INPUTS

AND

OUTPUTS............................................................................. 392

- vii -

O N T E N I DO S

CONNECTOR TYPES.............................................................................................240

THE DLL................................................................................................. 242


DATA TYPES......................................................................................................242
INTS................................................................................................................ 432
FLOATS............................................................................................................ 442
BOOLEANS........................................................................................................ 442
STRINGS...........................................................................................................244
FLOAT ARRAYS...................................................................................................245
INT ARRAYS.......................................................................................................246
BITMAPS...........................................................................................................248
FRAMES............................................................................................................249
HELPERS.......................................................................................................... 502
EXAMPLE 1 FLOAT ADD.....................................................................................251
EXAMPLE 2 STRING UPPERCASE.........................................................................252
EXAMPLE 3 AUDIO DELAY.................................................................................. 532

CONNECTING.............................................................................................. 254
A NOTE

ABOUT

OUTPUTS...................................................................................... 552

DEBUGGING............................................................................................... 257
DEBUGGING USING VISUAL STUDIO.......................................................................... 572
CODE TEST DEBUG CYCLE............................................................................. 582

SHARING................................................................................................... 260
SHARE THE DLL SEPARATELY...............................................................................260
EMBED THE DLL................................................................................................. 602
PROS AND CONS OF EMBEDDING............................................................................ 612
EXPORTING........................................................................................................261

CAPITULO 11

11 Opciones

262

THE OPTIONS DIALOG................................................................................. 263


APPLICATION......................................................................................................264
NAVIGATOR........................................................................................................266
TOOLBOX..........................................................................................................267
SCHEMATIC........................................................................................................268
MODULES..........................................................................................................269
EXPORT............................................................................................................270
ADVANCED........................................................................................................ 712

- viii -

1 Introduccin
ACERCA DE ESTA GUIA Y SINOPSIS DE SOFTWARE

CHAPTER 1

Acerca de esta Gua


Este manual proporciona una descripcin detallada del software
FlowStone y sus funciones. Su objetivo es
para mostrar cmo funciona el software y lo que sus capacidades son.
Si usted est buscando tutoriales luego ver la seccin de tutoriales de la web DSP Robotics:
http://www.dsprobotics.com/tutorials.html (English)
Para obtener informacin acerca de los componentes individuales que se incluyen con el software, consulte la
Gua de referencia. Estos documentos se pueden encontrar en la seccin de Manuales de nuestro sitio web
en:
http://www.dsprobotics.com/manualsarea.php (English)
Informacin y artculos sobre el software adicional se puede encontrar en Ingles:
http://www.dsprobotics.com /support.html (English)

Si usted tiene algn comentario sobre esta gua, por favor enve un correo electrnico a
info@dsprobotics.com. ( En Ingles )

- 10 -

INTRODUCTION

Que es FlowStone?
FlowStone es un lenguaje de programacin grfica para el rpido desarrollo de software
aplicaciones. Usando el software que tiene una flexibilidad completa para crear exactamente el tipo de
aplicacin que desea.
Puede agregar controles personalizados para modificar los parmetros en tiempo real y el grupo de estos
controles juntos para hacer potentes interfaces de usuario.
Sus creaciones terminadas se pueden exportar como aplicaciones ejecutables completamente
independientes o plugins de audio.
Estas aplicaciones se pueden utilizar en cualquier PC con Microsoft Windows o utilizados en el centro de su
propio sistema embebido.

Cmo funciona?
Conceptualmente, FlowStone es muy simple.
El software proporciona un conjunto de bloques de construccin
llamados componentes. Cada componente realiza una funcin diferente.
Un componente puede tomar los datos de proceso ella, pasa hacia fuera.
Por tanto, un componente puede tener entradas o salidas o ambos.
Las entradas y salidas se llaman conectores. Hay diferentes
tipos de conector para diferentes tipos de datos. Cada conector tiene
un smbolo propio para que pueda identificar fcilmente el tipo de dato..

Los datos se pasan entre los componentes conectndolos entre s con enlaces.
Un enlace inicia en un conector de salida de componentes y termina en un conector de entrada.
En general, los datos pasan a travs de un enlace desde el principio hasta el final (de izquierda a
derecha). Sin embargo, en algunos casos, los datos tambin pueden pasar de derecha a
izquierda
(leer sobre esto ms adelante).

- 11 -

CAPITULO 1

Componentes y enlaces se colocan en un 1024x1024 cuadrcula que llamamos un


esquema. Con el fin de permitir esquemas ms sofisticados que tenemos un tipo
especial de componente llamado mdulo.
Los mdulos son tipos especiales de los componentes en que se definen por su
propio esquema. que contiene otros componentes y mdulos.
Los mdulos tambin pueden tener un panel frontal interactivo con sus propios
controles y grficos personalizados.
Cualquier componente que no es un mdulo lo llamamos un primitivo.

Mediante la combinacin de diferentes primitivas y mdulos puede


crear una amplia gama de diferentes comportamientos y
en ltima instancia, los mdulos que son aplicaciones individuales
en su propio derecho.
Estos luego pueden ser exportados como aplicacin ejecutable
independiente para su uso fuera del software.

- 12 -

INTERFAZ USUARIO

2 Interfaz de
Usuario
A PRIMERA

MIRAR AL REDEDOR

- 13 -

CAPITULO 2

Antes de poder comenzar a utilizar el software, necesita saber un poco acerca de la


interfaz de usuario. Vamos a empezar por echar un vistazo a la ventana principal de la
aplicacin y cmo se presenta.
En la parte superior de la ventana se encuentra la barra de mens. Todas las funciones
de las aplicaciones se puede acceder desde aqu y es el primer lugar al que debe mirar
si usted es nuevo en el software y desea tener una idea de lo que usted puede hacer
con l.
Como el puntero del ratn pasa por encima de los elementos de men de texto de
Tag Bar
Toolbox
Window
ayuda
aparece
en la Navigator
barra de estado en la parteSchematic
inferior de
la ventana de aplicacin..

Usted no va a quedarse con la barra de men por mucho tiempo sin


embargo.
En FlowStone por lo general hay varias maneras de ejecutar la misma
accin por lo que en el tiempo se encontrar con la interaccin
directa, mens contextuales o teclas de acceso directo en lugar.
Corriendo por el lado izquierdo de la aplicacin es la caja de
herramientas, que proporciona todos los componentes para la
construccin de sus esquemas.
A la izquierda de esta se encuentra la barra de etiquetas. Esto le
permite acceder rpidamente a componentes sobre la base de un
conjunto de etiquetas configurables.
En la parte superior de la ventana es el Navegador. Como su nombre
lo indica, este se usa para navegar a travs de su esquema. Usted
encontrar este inestimable una vez que sus esquemas comienzan a
ser ms complejo.
La mayor parte del espacio de trabajo de la aplicacin est ocupada
por la ventana Esquema. Aqu es donde su se crean esquemas.
- 14 -

INTERFAZ DE USUARIO

Caja de
herramienta
La caja de herramientas proporciona los elementos bsicos para
s un esquema los componentes. Ya hay ms de 450 componentes para elegir y que estn
creciendo en nmero todo el tiempo.

Por supuesto, si hay cientos de componentes, entonces usted querr ser capaz
de poner sus manos en el componente que est buscando de forma rpida y
con poco esfuerzo.
Afortunadamente existen varios mecanismos en su lugar para que este sea
excepcionalmente fcil.

Explorador de componentes
Search Box

Explorador

Filter Pane

La parte principal de la caja de herramientas es el navegador componente.


Esto demuestra cada componente y su nombre.
Puede desplazarse a travs de los componentes haciendo clic en
la pgina hacia arriba y hacia abajo.
Page Up/Down Buttons

Tambin puede desplazarse utilizando la rueda del ratn,


pulsando el
RePg y AvPg llaves o con el cursor arriba y abajo para
moverse entre los elementos.

Ayuda Instantnea

Usted puede obtener ayuda para un componente, con solo


pasar el mouse sobre ella.
Una ventana pop-up aparecer dando una breve descripcin
de
la finalidad del el componente.

Component Browser

- 15 -

CAPITULO 2

Panel de Filtro

El panel de filtro aparece en la parte superior de la caja de herramientas.


Esto le permite encontrar lo que ests buscando por mucho ms rpido que
navegar por que le da la capacidad de filtrar los componentes que se
muestran sobre la base de ciertos criterios.
Hay dos partes en el panel de filtros, el cuadro de bsqueda y los botones de
filtro. Hablaremos de esto en las dos secciones siguientes.

Botones de Filtro
Los botones de filtro le permiten localizar el componente buscando con slo
unos clics.
Los Favoritos y los Recientes.
Los dos primeros botones de la fila superior cambian la lista de componentes para
que slo los favoritos o recientes se muestran los componentes usados.

El filtro utilizado recientemente muestra los componentes que se utiliz por ltima
vez.
Se ordenan de tal manera que el utilizado ms recientemente es en la parte superior
El filtro
de favoritos muestra slo los componentes que haya marcado como favorito
de
la lista.
(Leer sobre esto ms adelante),

Categora de
Filtros
Los prximos 3 botones en la fila superior, filtra la lista por categoras.
Cada componente corresponde a una de 3
Categoras:
- Un mdulo con un panel frontal o GUI (ms sobre paneles frontales en el captulo Componentes)
- Un mdulo sin necesidad de un panel frontal o GUI
- Un Primitivo

Al hacer clic en uno de ellos slo ver los componentes que entran en esa
categora.
Es posible ir a la lista o aplicar ms filtros de bsqueda si es necesario para el
hogar en el componente que est buscando.
Puede mantener Mays y haga clic para seleccionar dos de ellas a la vez.
Esto le permite mostrar todos los mdulos con o sin GUI por ejemplo.

- 16 -

INTERFAZ DE USUARIO

Tipo de Filtros
El segundo grupo de botones de filtro son los tipos de filtro. Usted ver un botn para cada tipo de
conector aqu.
Haga clic en uno de estos y la lista de componentes cambiar para mostrar slo los componentes que
tienen un Conector del tipo seleccionado.
Puede aplicar ms de un filtro tipo al mismo tiempo. Para ello, mantenga la tecla CTRL o MAYS mientras
hacer clic. Esto mostrar los componentes que utilizan al menos uno de cada uno de los tipos
seleccionados. As que si usted selecciona Se le aparecen Int y flotar tipos por ejemplo, slo los
componentes que tienen Int. y flotar conectores.
No todos los tipos se muestran de forma predeterminada. Usted puede cambiar esto seleccionando Editar
Tipos de filtro de la Men Herramientas o haciendo clic en el botn '+' que aparece cuando se pasa el
puntero del ratn sobre la filtrar botones de tipo.
Haga clic en los botones de tipo de aadir o eliminarlos continuacin, haga clic de distancia o seleccione el
men Edicin Tipos de filtros elemento para terminar la edicin.

Cuadro de
Bsqueda
El campo de bsqueda aparece en la parte superior de la caja de herramientas
y ofrece una forma rpida de ir directamente a la componente que desee.
Slo tienes que escribir algn texto en la caja y al escribir los componentes
reducirn a mostrar slo los que coinciden.
La bsqueda se ve en el nombre del componente y el texto de ayuda.
Resultados de Bsqueda son priorizados por partido nombre del componente
primero y luego por el texto de ayuda.
Usted puede saltar rpidamente a la caja de bsqueda en cualquier momento
pulsando CTRL + F

Bsqueda
Rpida

Otra forma de localizar rpidamente un componente es utilizar la funcin de


bsqueda rpida. Esto se basa en que usted lo sepa el nombre del
componente, o al menos el principio del nombre.
Basta con mover el cursor del ratn por lo que es el componente de
herramientas del navegador y luego comience a escribir la el nombre del
componente que desee. El componente actualmente seleccionado cambiar a
medida que escribe con el fin para que coincida con el nombre con lo que has
escrito.
Despus de un par de segundos el texto de bsqueda que ha escrito se
borra automticamente y por lo que si usted comete un error simplemente
hacer una pausa por un segundo y empezar a escribir de nuevo.
Esta puede ser una manera muy rpida para localizar los componentes y
puede ser utilizado en conjuncin con los filtros que haya utilizado.
- 17 -

CAPITULO 2

Borrar todos los


Filtros

Para borrar todos los filtros (incluida la bsqueda) usted puede hacer clic
derecho sobre el panel de filtros o pulse el Tecla ESC en su teclado.

Favoritos
Puede crear una lista de componentes favoritos que utiliza con ms frecuencia. Al usar el filtro de los
favoritos en el panel de filtros que tiene una forma muy rpida de conseguir en los componentes que
necesita con el mnimo de esfuerzo.

Para marcar un elemento como favorito, simplemente haga clic en el icono de


la "estrella" en la esquina superior izquierda de la componente tal como
aparece en la caja de herramientas. La estrella ahora aparece resaltada.
Para eliminar un componente de la lista de favoritos todo lo que necesita hacer
es hacer clic en el icono de la 'estrella' de nuevo.
Click to Add as Favourite

Component is in Favourites
Click to remove

Escala de
Visualizacin
Todos
los artculos en la caja de herramientas se muestran a
escala. Esto hace que sea mucho ms fcil de identificar los
componentes de su apariencia.
Puede establecer la escala con el control
deslizante en la parte inferior de la caja de
herramientas.
Tambin puede cambiar la escala en pasos regulares utilizando el cursor
teclas izquierda y derecha en la teclado.
Cambiar la escala a su nivel ms bajo slo mostrar los nombres de los
componentes de la caja de herramientas. es til si usted prefiere la
navegacin por solo texto.

- 18 -

INTERFAZ DE USUARIO

Caja de herramientas
Local

A veces, es posible que prefiera trabajar desde un conjunto ms limitado de componentes.


Esto es a menudo el caso para educadores que no quieren que sus estudiantes sean abrumados
por la gran cantidad de componentes que se ofrecen.
Usted puede hacer esto mediante la creacin de lo que llamamos una caja de herramientas Local.
Una caja de herramientas local es una caja de herramientas reducida que es especfica para un esquema.
Se ahorrar con el esquema y que slo aparecer cuando ese esquema es el que usted est usando.
Cambiar los esquemas de la caja de herramientas, Cambia demasiado.

Creando la Caja local de


herramientas

Hay dos maneras de hacer esto. La primera forma es seleccionar los componentes en el esquema que
desea tener en su caja de herramientas y luego seleccione Create Local Toolbox en el men Schematic, o
presione MAYS + CTRL + T.
La caja de herramientas cambiar por lo que slo contiene los mdulos y primitivas que se han seleccionado. El Bar Tag
se oculta automticamente como componentes en la caja de herramientas Local no tiene etiquetas.

La segunda forma de crear una caja de herramientas locales es


seleccionar un mdulo y luego seleccione Crear Local Caja de
herramientas en el men Esquema, o presione MAYS + CTRL + T. En
esta ocasin el cuadro de herramientas locales contener todos los
componentes que estn dentro del mdulo.
- 19 -

CAPITULO 2

Tenga en cuenta que la caja de herramientas local no tiene dependencia de los componentes de los que
fue creada. Esto significa que se puede crear una caja de herramientas local.
A continuacin, elimine los componentes de la caja que se han hecho.
As, por ejemplo, un profesor puede crear un esquema que quieren los estudiantes construir, hacer un
local de caja de herramientas a partir de ese esquema y luego borrar todo en el esquema.
El estudiante puede tomar el esquema y se les pedir recrear el original de los bloques de
construccin de la caja de herramientas locales.

Removiendo la caja de herramienta


local
Para eliminar una caja de herramientas locales, elija Remove Local Toolbox
en el men Esquema, o presione MAYS + CTRL + T de nuevo.

Restaurar la caja Local de Herramientas


Puede restaurar la ltima caja de herramientas local
seleccionando Restaurar Herramientas local en el men
Esquema o presionando SHIFT + CTRL + T.
Tamao de la caja de herramienta

Una vez ms, le permite cambiar fcilmente entre lo local y la


plena tamao de la caja de herramienta local.

Restauracin de una caja de


herramientas
Local
Puede restaurar la ltima
caja de herramientas local seleccionando Restaurar Herramientas local
en el men Esquema o presionando SHIFT + CTRL + T de nuevo.
Esto le permite cambiar fcilmente entre las cajas de herramientas de tamao completo y locales.

Guardar y cargar una caja de


herramientas
Local
Una caja de herramientas locales se guarda automticamente con su
esquema. As que cuando se abre un esquema nuevo, se restaura cualquier
caja de herramientas locales.
Como hemos dicho anteriormente, puede borrar todo en el esquema y
ahorrar con la caja de herramientas locales.

- 20 -

INTERFAZ DE USUARIO

Tag Bar
La caja de herramientas incorpora un sistema de etiquetas que permite
organizar los componentes sobre la base de algunas caractersticas
compartidas. Se agregan y se muestran Etiquetas en la barra de etiquetas.
A continuacin, puede aplicar etiquetas a componentes individuales y el uso
de la barra de la etiqueta para filtrar al instante la caja de herramientas
basado en una etiqueta en particular o
conjunto de etiquetas.

Editando Etiquetas

Hay algunas etiquetas ya previstos pero se puede cambiar por completo estos si as
lo desea.
Para hacer cualquier tipo de cambio que primero deber desbloquear la barra de
etiquetas para su edicin. Para ello haga clic en el botn Editar, este pondr el Bar
Tag al modoEdit
de tags
edicin.
Adds a tag
Delete the tag

Adicin de
Etiquetas
Para agregar una etiqueta, haga clic en el botn + y uno nuevo
se aadir al final de la lista. Escriba el nombre y la pulse Intro
en el teclado para terminar.

Moviendo Etiquetas
Puede mover las etiquetas alrededor cuando usted est en el modo de
edicin. Basta con hacer clic, mantenga y arrastre hacia arriba o hacia abajo
para cambiar el orden.
- 21 -

CAPITULO 2

Edicin y Supresin de
Etiquetas

Para editar una etiqueta, simplemente haga doble clic en l. Escriba sus
cambios y luego haga clic en eliminar o presione retorno a fin.
Las etiquetas se pueden eliminar haciendo clic en el botn x en el lado
derecho de la etiqueta.
Crear un Separador
Si usted tiene una gran cantidad de etiquetas que usted puede querer separarlos en los bancos.
Para hacer esto usted puede crear un separador para romper cada conjunto. Agregando un
separador es fcil. Slo tiene que aadir una etiqueta de forma normal, pero para el texto utilizar
tres caracteres de signo resta decir '---'. El separador abarcar toda la anchura de la barra
cuando se sale del modo de Edicin

Etiquetando Componentes
Una vez que tenga algunas etiquetas, a continuacin, puede aadir a los
componentes de la caja de herramientas. Para cambiar las etiquetas para
un componente, haga clic en el botn de etiqueta para ese componente.
Esta se encuentra en la esquina inferior derecha de cada componente en la
caja de herramientas.
Tag Button

Un men emergente aparecer con todas las etiquetas en la barra de


etiquetas. Haga clic en una etiqueta para aadirla sin control o un
comprobado etiqueta para eliminarla.

Los componentes pueden tener ms de una etiqueta. Esto significa que


usted no tiene que marcar componentes sobre la base de una
caracterstica particular. Por ejemplo, el componente Abs red de flotadores
podra tener un Variable de matriz y una etiqueta de Matemticas. Las
etiquetas para cada componente se muestran a la izquierda del botn de la
etiqueta.
- 22 -

INTERFAZ DE USUARIO

Using Tags
Ahora que ha configurado su barra de variables y las etiquetas aplicadas a los componentes que usted puede utilizar la
barra de etiquetas para filtrar la caja de herramientas y ayudar a localizar los componentes con mayor rapidez.

Filtering by a Tag
Para filtrar por una sola etiqueta, simplemente haga clic en l. La etiqueta aparecer como seleccionada y la
caja de herramientas filtrar en consecuencia. Las etiquetas se aplican en combinacin con los filtros
establecidos en el panel Filtros.
Si hace clic en una etiqueta diferente a la anterior ser automticamente desactivada. Para filtrar por ms
de una etiqueta, mantenga SHIFT mientras hace clic.
Locking Tags
Puede ser que slo desea trabajar con un determinado conjunto de componentes. En este caso se puede bloquear una
etiqueta en su lugar haciendo doble clic sobre l. La etiqueta permanecer seleccionada hasta que haga clic en l de
nuevo.
Clearing Tags
Puede borrar las etiquetas haciendo clic sobre ellos o usted puede borrar todas las etiquetas de una sola vez con un clic
derecho en cualquier parte de la barra de etiquetas.

Single Tag

Multiple Tags

Locked Tag

- 23 -

CAPITULO 2

Navegador

El Navegador le permite ver DNDE SE ENCUENTRA en do Esquema. Esto


Es muy Useful CUANDO SE Tener Varias Capas de mdulos PORQUE la
ventana Esquema SLO Muestra el mdulo de Que Usted est Edicin.

Saltando
El navegador no es slo visual, es interactivo tambin. Puede saltar a
cualquier mdulo en la cadena actual al hacer clic en l. Tambin puede
utilizar las teclas numricas para hacer esto (siempre y cuando no est
usando el PC teclado para la entrada MIDI). Nmero 1 siempre te llevar al
nivel superior. The PGUP and PGDN keys
se mover arriba y abajo de la jerarqua
actual.

- 24 -

INTERFAZ DE USUARIO

Panning

Se resalta el mdulo actual de la cadena. En el interior se ve un rectngulo


que representa la parte de el mdulo que se puede ver en la ventana de
esquema. Este es el llamado Vista Rectngulo. Usted puede haga clic y
arrastre para desplazarse por este esquema.

Marcadores
Puede marcar determinadas partes
de su
esquemtica para que pueda volver
fcilmente a ellos. Para ello basta
con ir a la parte de el esquema que
desea marcar,
Mantenga
pulsado SHIFT y pulse

una de las funciones teclas (F1 ...


F15). El navegador mostrar la
tecla de funcin asociada.
Para volver al marcador en un
momento posterior slo tiene que
pulsar la tecla de funcin.
Tambin puede entonces hojear
de nuevo al punto de que hayas
venido
desde presionando la funcin de
unaPara
teclaeliminar
todo el un
tiempo.
marcador todo lo que tiene que hacer es saltar a ella a
continuacin, mantenga SHIFT y pulse la misma tecla de nuevo.

- 25 -

CAPITULO 2

Ventana Esquemtica
La ventana de esquema es donde todo se junta. Los componentes
pueden ser arrastrados hasta aqu desde la caja de herramientas. Puede
conectar los componentes arrastrando vnculos entre ellos.
La ventana de esquema tiene todas las caractersticas que usted
esperara en un editor: deshacer, copiar y pegar, seleccin mltiple, el
zoom, y ayuda sensible al contexto estn completamente soportadas.

Acercamient
o
La ventana Esquema es totalmente ampliable. Hay varias maneras en
que puede acercarse el esquema ventana:
Mouse Wheel

La forma ms fcil para hacer un zoom es utilizar la rueda del ratn.


Mantenga presionada la tecla CTRL y luego mover el ratn, con inters
acercar y hacia usted para reducir.

Cuando el zoom de la rueda del ratn, el programa se ampliar hacia o desde el punto en el que
posicionar el puntero del ratn. Esto le permite hacer zoom y paneo en un solo movimiento.

Si el ratn lo admite, tambin puede devolver el esquema para el nivel de zoom por defecto pulsando
el botn de la rueda del ratn. La posicin de panorama esquemtico tambin se devuelve a l es
por defecto.
Zoom Slider

El control deslizante de zoom se encuentra en el lado derecho de la barra de


herramientas. Al mover el control deslizante hacia la izquierda har zoom y
hacia la derecha agrandar
Zoom Slider

La posicin del zoom por defecto se muestra como un pequeo punto por encima de la barra deslizante. El
deslizador se ajustar a esta posicin que usted pasa para hacer ms fcil para volver a la configuracin
predeterminada. El nivel de zoom por defecto tambin puede ser
logrado haciendo doble clic en el control deslizante.

Menu Contextual

Haga clic derecho en una parte vaca de la esquemtica y seleccione


Acercar o Alejar

- 26 -

INTERFAZ DE USUARIO
TECLADO
Simple, presiona la tecla + (zoom in) o la tecla - (zoom out).

Scrolling

Puede utilizar la rueda del ratn para desplazarse por la ventana


esquemtica arriba o hacia abajo. Mantenga pulsado SHIFT y mueva el rueda
del ratn para desplazarse horizontalmente.
Panning

Adems de utilizar el Navegador, puede desplazarse rpidamente por la


ventana esquemtica por el acaparamiento de la fondo y moverlo con el
ratn.
Para
hacer esto:
1.
Haga clic izquierdo en una parte vaca de la esquemtica y mantenga presionado el botn del
2.

3.

ratn.
Ahora haga clic y mantenga pulsado ese botn abajo tambin. El cursor cambiar para mostrar una
mano agarrar el esquema.
Ahora mueva el ratn y el esquema se mover con ella. Suelte ambos botones del ratn para terminar
arrastrando.

Tambin puede desplazarse por la celebracin de la barra espaciadora hacia abajo.


El cursor cambiar a la mano. Mantener el espacio bar y arrastre el esquema alrededor.Resetting Zoom and Pan

Si alguna vez necesita restablecer el zoom y desplazarse de vuelta a sus


posiciones por defecto que usted puede hacer esto mediante la seleccin
Restablecer en el men Ver o presionando el botn HOME.

- 27 -

CAPITULO 3

3 Componentes &
Enlace
s
LOS

ELEMENTOS BASICOS DE UN ESQUEMA

- 28 -

COMPONENTES & ENLACES

Los componentes y enlaces son los ladrillos y el mortero de un esquema


FlowStone.
Entender cmo editar y manipular estos elementos bsicos es esencial para
trabajar con el software ya que la mayora de la interaccin que usted tiene
con FlowStone ser a travs del esquema.
Hemos introducido el concepto de componentes y enlaces a la derecha en el
inicio de esta gua. Vamos a repasar esta de nuevo, pero ahora en un poco
ms de detalle este momento.
Componentes

Los componentes proporcionan la funcionalidad en un esquema. Cada uno


realiza una tarea bien definida. ellos estn representados por bloques
rectangulares con adornos circulares llamados conectores que pueden
aparecer en los lados izquierdo o del lado derecho (o ambos).

Los conectores de la parte izquierda se llaman Conectores de entrada. Estos proporcionan


el componente con la informacin que se utiliza cuando se realiza la tarea est definida.
Los conectores de la parte derecha se llaman Conectores de salida. Estos proporcionan informacin sobre
el resultado de la de la tarea realizada por el componente.

En el ejemplo anterior la cadena Reemplazar componente toma 3 entradas: la cadena de


texto original, la posicin en la que la sustitucin debe ser hecho y la cadena de texto a
insertar. La salida es la cadena modificada.

- 29 -

CHAPTER 3

Links
Enlaces definen cmo fluye la informacin entre los componentes
de un esquema. Un enlace pasa desde el conector de salida de un
componente al conector de entrada de otro componente. La
direccin del flujo de informacin es generalmente de izquierda a
derecha o de salida a entrada, pero en algunos casos, la
informacin puede pasar de la entrada a la salida, as.

Puede tener varias conexiones desde el mismo conector de salida. Tambin


puede tener varios enlaces que pasan al mismo conector de entrada. Sin
embargo, slo se puede tener un enlace que va desde el mismo conector de
salida para el mismo conector de entrada.

Cuando mltiples enlaces llegan al mismo conector de entrada a continuacin, para


algunos tipos de conectores, los datos de cada enlace se aaden juntos. En otros
casos, los datos se acaba de combinar.

- 30 -

COMPONENTES & ENLACES

Realimentacion Infinita
Los enlaces pueden ser conectados desde un componente en s mismo para crear caminos de realimentacin. Sin
embargo, en algunos circunstancias esto puede crear un bucle de retroalimentacin infinita.
Si esto sucede, el software 'congela' la enlace afectada (s). Un enlace congelada se muestra como una lnea discontinua
de color rojo o lnea de puntos.
Enlaces congelados siguen funcionando pero los datos fluyen a travs de ellos se reduce (pero no exclusivamente en
total) para evitar que el software de bloqueo hacia arriba.
[Nota que los vnculos entre la corriente, poli o conectores mono nunca se congelan como retroalimentacin es siempre
permitido en estos casos.]

Una lnea discontinua indica que el bucle infinito es en la direccin hacia adelante es decir, de izquierda a derecha como
cambios son desencadenado.
Una lnea de puntos indica que la direccin est al revs, es decir, de derecha a izquierda como los datos se estn
reunidos.
Enlaces congeladas son relativamente raros. Sin embargo, cuando llegan a ocurrir, se pueden localizar fcilmente
porque cada mdulo que contiene un enlace congelado en algn lugar debajo de ella se resalta con un rayado rojo y
blanco frontera y un adorno diciendo que hay un error en el interior.

Si usted sigue los mdulos de color rojo en la jerarqua que finalmente va a


llegar al enlace congelado (s).

- 31 -

CHAPTER 3

Manejo Links congelados


As que, cmo lidiar con enlaces congelada una vez que los has
encontrado?
Usted puede ser capaz de obtener el comportamiento que estabas
deseando lograr mediante la insercin de un bloqueador del disparador o
utilizando un componente de muestreo y retencin que desencadena de
otro lugar.
Podra ser que la retroalimentacin puede ser necesario slo en una
direccin a la vez as que podra usar select componentes para
asegurarse de que los datos slo se enva en una direccin o la otra.
Algunos componentes han construido en el manejo para evitar la
retroalimentacin infinita que se produzcan. The Switch componentes,
por ejemplo, (interruptor del float, String Interruptor etc) tienen este tipo
de comportamiento. Insercin de una en
entre enlaces congelada a menudo puede resolver el problema.
A veces un enlace congelado puede ser simplemente eliminado y se
mantiene la misma funcionalidad. El enlace puede han agregado como
una exageracin o por error.

- 32 -

COMPONENTES & ENLACES

Components

Adding a Component

Dragging From the Toolbox

Para aadir un componente a un esquema, slo tiene que ir a la caja de


herramientas, escoja el componente que desee y arrstrelo
en su esquema.
Haga clic en el componente que desee a continuacin,
mantenga y arrastrar a la ventana esquemtica

Suelte el botn del ratn para soltar


el
componente en el esquema

- 33 -

CHAPTER 3
Adding from the 'right-click' Menu
Tambin puede agregar los componentes de los favoritos o listas recientes haciendo clic
derecho en el esquema - que le ahorra de tener que acudir a la caja de herramientas por
completo.
Haga clic derecho en una parte vaca de la esquemtica a continuacin, seleccione Aadir favorito o Aadir reciente
dependiendo de la lista que desea utilizar, a continuacin, slo elegir un componente en el submen emergente
resultante.

Stacking Components
A veces es posible que desee agregar ms de un componente a la vez. Usted puede hacer esto
mediante el apilamiento de hasta componentes antes de arrastrar a todos a la esquemtica.
Para aumentar el nmero en la pila simplemente haga clic en el componente de la misma
cantidad de veces que el nmero que usted requiere.
Usted ver un contador aparece en la esquina inferior izquierda de la componente en la
caja de herramientas.

Stack indicator
Para disminuir el nmero en la pila de botn derecho del ratn sobre el componente.
Cuando usted tiene el nmero que necesita slo arrastrarlos a travs como antes.

- 34 -

COMPONENTES & ENLACES


Keyboard Shortcuts
A medida que se familiarice con el software que usted encontrar que hay un cierto pequeo grupo de
componentes que se utilizan con mucha ms frecuencia que otros. Con el fin de ahorrar tiempo en
constante ir y venir de la caja de herramientas se puede hacer uso de atajos de teclado.
Cuando un componente tiene una tecla de acceso asignada esto se muestra en el componente en la
caja de herramientas.

Shortcut Key Indicators

- 35 -

CHAPTER 3

Disabled Components
En algunas ocasiones no es posible para que usted agregue un componente particular de su
esquema. Esto es debido a que algunos componentes del sistema slo se permite una vez dentro de
un mdulo en particular o todo el esquema.
Esto tambin puede ocurrir si est ejecutando las ediciones Free o Enterprise y llegar a uno de los
lmites de los componentes de un tipo particular.
Si esto ocurre, el componente tendr un smbolo rojo "no entrada" en la parte superior de la
misma.
Symbol indicates that the
component cannot be added at
the current location in the
schematic

Hitting Return
Una ltima forma de agregar componentes de la caja de herramientas es el uso de la tecla en el teclado. Esto es
til si usted acaba de hacer una bsqueda de decir. Golpear retorno cuando en la caja de herramientas (o el cuadro
de bsqueda) siempre se agregar el componente seleccionado para el esquema.

- 36 -

COMPONENTES & ENLACES

Selections and the Action Panel


Para seleccionar un componente, simplemente haga clic en l. Al
hacer esto usted ver el panel de accin. Este contiene una serie
de botones. el botn 'X' se eliminar el componente. El botn 'N'
le permitir nombrar el componente.
Otros botones pueden aparecer dependiendo del tipo de
componente seleccionado - ms sobre esto ms adelante.

Los comandos en el panel de accin tambin se pueden


invocar desde la barra de men y el men contextual. Para
sacar el men contextual, haga clic en el componente.
Tenga en cuenta que al igual que el componente (s) seleccionado, los enlaces que comienzan y
terminan en un componente que est seleccionado tambin se consideran parte de la seleccin

Moving Components

Para mover un componente:


1.

2.

3.

Mueva su ratn sobre l. El cursor


cambiar a Move / Select.
Haga clic y mantenga presionado el
botn del ratn. el cursor cambiar a
Move.
Arrastrar a la posicin deseada y suelte
el botn del ratn.

Para los movimientos finos que usted puede utilizar la funcin codazo. Con un uso seleccionado
componente las teclas de cursor para moverse hacia arriba, abajo, izquierda o derecha una cuadrcula.

- 37 -

CHAPTER 3

Nombrando Componentes
Usted puede dar un componente de un nombre. Esta es slo una etiqueta
que se puede utilizar para recordar el papel de un componente en el
esquema.

Para dar un componente de un nombre, haga clic en el botn 'N' en el panel de accin o haga
clic derecho en el componente y seleccione Cambiar nombre. Alternativamente, usted puede
seleccionar el componente y presione CTRL + R.
Un cuadro de edicin aparecer sobre el componente. Escriba aqu el nombre y pulse
ENTER, TAB o haga clic en otra parte de su esquema. Puede presionar ESC en cualquier
momento para cancelar.

La interaccin directa
Para una manera ms interactiva para aadir nombres, pasa el ratn sobre el rea justo por encima del
componente y mantenga CTRL. Se resaltar el marco del cuadro de nombre. Haga clic en el cuadro y proceda
como antes.

Editing Names

Para editar un nombre que puede utilizar el panel de acciones y de opciones que aparece como
antes o puedes hacer clic en l, como se muestra a continuacin.

- 38 -

COMPONENTES & ENLACES

Deleting Components
Eliminacin de un componente es extremadamente fcil. La forma ms rpida de hacerlo
es para seleccionarlo y pulse la tecla SUPR. Tambin puede presionar el botn "X" en el
panel de accin o haga clic derecho en el componente y seleccione Eliminar.

Redimensionado
Algunos componentes pueden cambiarse de
tamao para que sean ms grandes o ms
pequeos. Algunos componentes slo cambiar el
tamao horizontal, otros cambian de tamao
verticalmente, as.
Si un componente se puede cambiar el tamao,
el control resizec aparecer en la esquina
inferior derecha de la seleccin elegida.
El control es un arco blanco que recorre la
esquina de la seleccin

Para cambiar el tamao, mover el puntero del ratn sobre el control de


cambio de tamao. El puntero del ratn se convertir en el cursor de
cambio de tamao. Haga clic y mantenga a continuacin, arrastre la parte
superior de cambio de tamao.

- 39 -

CHAPTER 3

Multiple Selections
Puede seleccionar varios componentes al mismo tiempo. Esto es til si desea mover un
grupo de componentes, pero mantener su distancia relativa o si desea eliminar toda una
carga de cosas de una sola vez.
Hay dos maneras de crear una seleccin mltiple. La primera manera es mantener pulsada
SHIFT y haga clic en cada uno de los componentes, a su vez. Si ya se ha seleccionado un
componente, al hacer clic en l lo eliminar de la seleccin.
Una forma ms rpida de hacer una seleccin mltiple es arrastrar selecto. Esto implica
arrastrar un rectngulo de adjuntar todos los componentes que desea seleccionar.

Seleccione para
arrastrar
1.
Haga clic:en una parte vaca de la esquemtica de la parte superior izquierda de los
componentes que desea seleccionar.
2.

Sosteniendo el ratn hacia abajo, mueva el ratn hacia abajo y hacia la derecha.
Usted ver un rectngulo de puntos aparece mientras se mueve.

3.

Los componentes se mostrarn como seleccionado al mover el ratn de modo que


cuando la seleccin es lo que desea, suelte el botn.

- 40 -

COMPONENTES & ENLACES

Connector Labels
La mayora de los componentes tienen una etiqueta corta para cada uno de sus conectores de
entrada. No hay suficiente espacio en el cuerpo del componente para ambas entradas y etiquetas de
salida. Las salidas suelen ser menos ambiguo y menos en nmero y etiquetas para que de entrada
son generalmente preferidos.
Etiquetas de los componentes son generalmente muy corto y proporcionan un rpido
recordatorio de lo que cada conector es para. Si necesita ms informacin usted puede
seleccionar el componente (haciendo clic en l). Cuando est disponible, aparecern
etiquetas de los conectores adicionales a la izquierda ya la derecha del componente.

Cortar, Copiar y Pegar

FlowStone soporta el estndar Cortar, Copiar y Pegar operaciones para mover o duplicar partes de
un esquema. Ambas selecciones nicas y mltiples se pueden cortar, copiar y pegar.
Se puede acceder a estas operaciones desde el men Edicin o haciendo clic derecho en una
seleccin en el caso de Cortar o Copiar o en cualquier parte de su esquema en el caso de Pegar.
Copia de una seleccin pondr un duplicado de los componentes y los enlaces en el Portapapeles.
El portapapeles es una memoria intermedia invisible que conserva lo que estaba la ltima copia en
l.
El corte es como una copia combinada y eliminar como la seleccin original se elimina del esquema.

Despus de haber cortado o copiado una seleccin a continuacin, puede ir a cualquier otra parte
de su esquema o cualquier otro esquema que tenga abiertos y pegar en una copia del contenido del
portapapeles. Las copias se pegan en la posicin actual del ratn.
Usted puede mantener la tecla ALT mientras pegando a haber elementos pegados apilar hasta en la
ubicacin de los elementos de origen.

- 41 -

CHAPTER 3

Links
En esta seccin usted aprender cmo mover un enlace a otro conector o eliminarlo por
completo. Tambin ver cmo cambiar el orden de enlace y cmo doblar un vnculo..

Creating a Link
Los enlaces deben comenzar en un conector de entrada y terminar en un conector de salida. Puede enlazar otro
componente o para s mismo, para crear una ruta de realimentacin decir.
Para crear un enlace:
1.

Mueva su ratn sobre un


conector de salida. Lo ms
destacado conector
mostrar al pasar sobre l.

2.

Haga clic y mantenga, a


continuacin, arrastre hacia el
conector de entrada. Ver una
lnea de puntos que representa
la relacin potencial.

3.

Siga arrastrando hasta que el


puntero del ratn pasa por
encima del conector de entrada.
El enlace potencial se ajustar
al conector para indicar que el
enlace se puede formar.

4.

Suelte el botn del ratn para


crear el enlace.

- 42 -

COMPONENTES & ENLACES

Allowed Links
A veces no es posible establecer un vnculo entre un par de conectores.
Cuando esto sucede, la cursor del ratn cambiar para mostrar esta.
En general, los enlaces slo pueden hacerse entre los
conectores del mismo tipo. Sin embargo, hay varias excepciones
a esta. Por ejemplo, los flotadores y Ints se pueden conectar lo
que puede Flotadores y Stream conectores.
Una descripcin completa de todas estas excepciones se puede
encontrar en el captulo 5 en la conversin entre tipos de datos
en la pgina 98.

Moving a Link
Puede mover el extremo de un enlace desde el conector de entrada de otro conector de entrada en el mismo
componente. Tambin puede mover a un conector de entrada en un componente completamente distinto.
To move a link:
1.

Move the mouse pointer over the input


connector where the link ends. The
cursor will change to the linking pointer.

2.

Click and hold. You'll see a dotted outline confirming that you've picked up the
link that you wanted.

3.

Drag the link to another input connector and release the mouse
button.

- 43 -

CHAPTER 3

Deleting a Link

Hay varias formas de eliminar un enlace. usted


puede recogerlo y colocarlo en el espacio vaco.
Slo tienes que mover desde el conector de
entrada (como se describe ms arriba), pero no
vincularlo a otro conector.

Tambin puede hacer clic en el vnculo y


seleccione Vnculo Eliminar en el men
contextual.

Para borrar realmente rpido, mantenga pulsada


la tecla CTRL.
Cuando el puntero del ratn pasa por encima de
un enlace, aparecer el botn de eliminar.
Haga clic en el botn y el vnculo se ha ido.

- 44 -

COMPONENTES & ENLACES

Link Order
Cuando hay muchos enlaces que terminan en el mismo conector de entrada, el orden de los enlaces puede
afectar el comportamiento de su esquema. Por ejemplo, si tiene dos enlaces que estn pasando datos de
cadena a una cadena conector, la primera cadena en llegar tendr el segundo anexo al mismo.
El orden de un enlace se indica mediante un marcador de fin. Esta es una serie de muescas perpendicular
al enlace en su punto final. El primer eslabn de la orden tiene ningn marcador, el segundo tiene un
marcador con una muesca, la tercero tiene dos muescas, etc..

Cambiando el orden.
Es til ser capaz de cambiar el orden de los vnculos en un conector de entrada. Para ello, simplemente haga clic en el
conector y el enlace de la parte superior actual (el ltimo en el orden) se convertir en el enlace de abajo
(la primera en el orden).

- 45 -

CHAPTER 3

Doblar Links
En un esquema complejo con muchos
componentes, a veces una lnea recta slo
no es suficiente. A menudo, usted lucha
para evitar la creacin de enlaces que se
ejecutan a travs de los componentes o la
otra.
Para solventar este problema, se puede doblar
ningn enlace para hacer el esquema ms claro
y fcil de leer. Todo lo que tienes que hacer es
clic en el enlace y tire de ella en su lugar.

Cada curva que usted pone en un enlace crea un punto de control. Los puntos de control definen la
trayectoria del enlace. Si mover el puntero del ratn sobre un enlace que quede resaltado y los
puntos de control se muestran como pequeos cuadrados. Los puntos de control sern o negro o
blanco, dependiendo del color del enlace.

Puede arrastrar los puntos de control en torno a la re-forma al enlace. Tambin puede eliminar un punto
de control por haga clic en un punto y seleccionando Eliminar Point en el men contextual.

Para eliminar todos los puntos de control y hacer que el enlace de una lnea
recta de nuevo, seleccione Straighten Link del men contextual.

- 46 -

COMPONENTES & ENLACES

Auto Linking

Para ayudarle a construir su esquema con


mayor rapidez tenemos la caracterstica
de enlace automtico.
Cuando esta funcin est activada se
puede crear una conexin entre dos
conectores moviendo un componente
para que el conector de salida requerida
est en la misma horizontal y lo
suficientemente cerca del conector de
entrada requerido.

Cuando se cumplen estas condiciones,


aparecer una lnea punteada.
Esto sugiere, donde se creara el enlace. Si a
continuacin una pausa por una fraccin de
segundo el enlace parpadea y llegar a ser
permanente.

Si no quiere tener que esperar a que


el enlace que se cree que pueda
instante aceptar el enlace sugerido
haciendo clic en el botn derecho del
ratn.

Hay varias opciones para el Auto Vinculacin.


Estos se pueden ajustar mediante la seleccin esquemtica desde el men Opciones.

Se puede cambiar el tiempo que transcurre entre la sugerencia y la creacin de enlace tambin se puede establecer cmo
conectores estrechos tienen que ser antes de que se sugiri un vnculo. Si slo desea utilizar el mtodo del botn derecho
para hacer un enlace a continuacin, se puede establecer el enlace automtico a slo sugieren vnculos y, por supuesto,
usted puede desactivar esta funcin en conjunto.

- 47 -

CHAPTER 3

Smart Linking
Si es necesario enlazar varios componentes entre s de forma rpida, puede utilizar
la caracterstica de enlace inteligente.
Simplemente coloque sus componentes de una manera lgica, seleccione y luego
haga clic en cualquiera de los componentes del botn de enlace
en el panel de accin o seleccione Vincular componentes en el men Esquema.
El software har una mejor conjetura en cmo desea que los componentes a ser unidos entre s. Si utiliza el botn del
panel de accin para hacer esto, entonces cuando se pasa el puntero del ratn sobre el botn, el software
indicar los enlaces que se crearan
Vinculacin inteligente es til si tiene varios componentes que desea vincular a otro componente o si quieres
componentes de la cadena juntos.

- 48 -

COMPONENTES & ENLACES

Removing Multiple Links


Puede eliminar todos los eslabones de una
seleccin de una sola vez. Simplemente haga clic
derecho en la seleccin y elija Eliminar Vnculos
en el men emergente.
Esto puede ser muy til cuando se tiene una
gran seccin del esquema que necesita
desconectar

Intercambio de Enlaces
A veces es posible que desee reemplazar un componente en un esquema con otro componente.
La razn ms comn para hacer esto es cuando usted tiene una nueva versin de un mdulo
que desea utilizar en su lugar de uno ya existente (vase el siguiente captulo para aprender
acerca de los mdulos).
Usted puede hacer esto a mano moviendo todos los enlaces de uno en uno, pero esto es mucho
tiempo y puede llevar a errores si se olvida de un vnculo o donde estaba en el orden de enlace.
Para ayudar a que tenemos la funcin Links Cambiar. Slo tiene que seleccionar los dos
componentes, haga clic derecho y elegir intercambiar enlaces en el men emergente.
Los enlaces de un componente intercambiarn a la otra y viceversa. Si los componentes no
tienen el mismo nmero de entradas o salidas, entonces el software transferir los vnculos que
pueda y deje caer que no se puede.

- 49 -

CHAPTER 3

Wireless Links
Los enlaces inalmbricos proporcionan un mecanismo para pasar datos a travs de la jerarqua de mdulo sin tener que
crear ningn enlace fsico. Ellos son como las redes inalmbricas en el mundo real. Tiene un transmisor
llamado una salida inalmbrica en un extremo y un receptor, una entrada sin hilos en el otro extremo.

Se establece una conexin entre una salida y una de entrada


inalmbrico Wireless slo si se cumplen las tres condiciones
siguientes:
1.

La entrada sin hilos debe aparecer en un mdulo por debajo de la salida Wireless en la
jerarqua

La entrada sin hilos y de salida deben tener la misma


etiqueta
3.
La entrada sin hilos y de salida deben tener el mismo tipo de
conector
Cuando se establece un enlace de los indicadores de conexin de la
entrada inalmbrica y salida se encendern.
2.

- 50 -

COMPONENTES & ENLACES

Los enlaces inalmbricos slo funcionan en la jerarqua del mdulo, no se puede vincular de nuevo hacia arriba.
Adems, el rango de una salida inalmbrica slo se extiende hasta la prxima salida inalmbrica por debajo de
ella que tiene la misma etiqueta y el tipo de conector.
La misma salida inalmbrico se puede conectar a mltiples entradas inalmbricas y viceversa, siempre y cuando
se ajusten a los criterios 3 descritos anteriormente.
Hay otro componente inalmbrico llamado Output Wireless Module. Esto se utiliza para hacer un mdulo
inalmbrico. Consulte la seccin Mdulos para ms informacin sobre este.

Follow Wireless

Los enlaces inalmbricos son excelentes para mantener


sus esquemas ordenado pero tienen un inconveniente: que
puede ser muy difcil de seguir. Para ayudar con esto
tenemos la funcin Seguir Wireless.
Para utilizar esta slo tiene que seleccionar una entrada o
salida inalmbrica Wireless y, o bien haga clic derecho y
seleccione Seguir inalmbrica desde el men o la tecla
TAB.
El esquema saltar a la primera conexin de salida
inalmbrica o de entrada. La trayectoria del vnculo
- 51 -.
tambin se indicar en el Navegador

CHAPTER 3
El componente inalmbrico de conexin se resaltar y una etiqueta a continuacin se mostrar el
nmero de componentes inalmbricos a juego existen, y el ndice de la que actualmente es
resaltado.
A continuacin, puede hacer clic derecho sobre un rea vaca de la esquemtica y seleccione
Siguiente Wireless componentes o presione TAB. Finalmente se TAB de nuevo al componente
que empezar con - el componente inalmbrico fuente.

Ejemplo
A continuacin tenemos a uno de los mdulos de la caja de herramientas estndar. Nos
hemos mudado a un mdulo llamado sub MinMax.
Queremos ver lo que el componente del mdulo inalmbrico Out llamado Max est
conectando. Todo lo que hacemos es seleccionar el componente y presione la tecla TAB.

La esquemtica salta al primer componente de entrada inalmbrico que conecta a Max. Podemos verlo ms
destacado que se trata de componente 1 de 2.

- 52 -

COMPONENTES & ENLACES

El esquema muestra el camino a travs del esquema de este componente y la


conexin inalmbrica.
Debido a que hemos seleccionado una salida Mdulo inalmbrico de la
conexin se muestra desde el punto de la transmisin es decir, el mdulo
primario.
Podemos ver claramente que el receptor se encuentra en el interior del
mdulo de 'A 0-1 "dentro" prefijado ".
Si continuamos pestaa iremos a la segunda entrada inalmbrica y luego de
vuelta a la fuente. Una vez ms, porque estamos siguiendo una salida Mdulo
inalmbrico se muestra el origen como el mdulo principal.
Para dejar de seguir las conexiones inalmbricas, simplemente haga clic en el
esquema o realizar algn otro tipo de edicin operacin.

- 53 -

CHAPTER 4

4 Modulos
MANAGING COMPLEXITY

- 54 -

MODULOS

Usted puede recordar de la introduccin que los componentes se dividen en


dos tipos: las primitivas y mdulos. Una primitiva tiene un comportamiento
predefinido.
Es un cuadro negro cuyo comportamiento no se puede cambiar.
Un mdulo en el otro lado tiene su comportamiento definido por un esquema.
Puede agregar entradas y salidas y el comportamiento interno puede ser
modificado para hacer prcticamente cualquier cosa que desee.
El componente del mdulo se puede encontrar en la caja de herramientas en
el marco del grupo de filtros del mdulo. Arrastre uno en un esquema y vers
que un mdulo vaco es slo un cuadro gris.

El panel de acciones para un mdulo tiene botones de adicin para reflejar las operaciones adicionales que se
pueden realizar en l. De ellos el ms importante es el movimiento en el botn del mdulo (representado como
un tringulo invertido). Al pulsar este botn se puede ir dentro de un mdulo para ver que es esquemtica y de
all definir el comportamiento del mdulo.
Los mdulos son muy simples en concepto, pero son extremadamente poderosos. Ellos se pueden utilizar
para compartimentar funcionalidad en piezas que se pueden reutilizar una y otra vez. Son esenciales para la
gestin de la complejidad en nada pero el ms simple de los esquemas.

- 55 -

CHAPTER 4

Key Differences

Aparte del hecho de que un mdulo tiene su propio esquema, hay algunas
otras diferencias clave entre los mdulos y los Primitivos. En esta seccin se
describen estas diferencias. Se dan ms detalles en las secciones siguientes.

Appearance
Mdulos En primer lugar se pueden diferenciar de los primitivos por la forma de mirar. Un
mdulo tiene un fondo de color gris claro, mientras que una primitiva tiene un borde gris
oscuro con una sombra paralela y barra de ttulo.

Un mdulo puede tener adornos


adicionales de sincronizacin
que indican, propiedades o
capacidades inalmbricas.
Ms sobre esto ms adelante.

- 56 -

MODULOS

Front Panel
Cualquier mdulo puede tener un panel frontal. Esto se muestra en el mismo mdulo y proporciona
una superficie interactiva para agregar controles o la visualizacin de grficos.
Los grficos del panel frontal y la interaccin se definen en todo esquemtica del mdulo.

Properties
Si desea controlar el comportamiento de un mdulo de una manera ms interactiva y luego en vez de usar los
conectores de entrada se puede definir un panel de propiedades. De nuevo, el panel de propiedades se define
por esquemtica del mdulo.

- 57 -

CHAPTER 4

Toolbox
La diferencia clave final entre un mdulo y una primitiva es que un mdulo se puede
arrastrar a la caja de herramientas para su uso en una fecha posterior. Puede arrastrar un
mdulo por s mismo o puede arrastrar todos los mdulos seleccionados de una sola vez.

Dragging a module to
the toolbox

Al hacer esto el mdulo adquirir automtica cualquier marca que ha seleccionado en


el momento. Si no se selecciona ninguna etiqueta entonces el mdulo no tendr
etiquetas aadidas automticamente.

- 58 -

MODULOS

Basic Operations

Usted puede hacer todo a un mdulo que se puede hacer para una primitiva.
Puede eliminarlo, nombrarlo, moverlo, etc La diferencia clave entre un mdulo
y un componente es que se puede ir en un mdulo y ver o editar es
esquemtica.

Moving into a Module


Con la mayora de las operaciones
en FlowStone hay muchas maneras
de hacer la misma cosa.
El paso a un mdulo no es la
excepcin.
Para entrar en un mdulo, ya sea:
1.

Haga clic en el movimiento en el mdulo


botn en el panel de acciones

2.

Haga doble clic en el mdulo

3.

Haga clic en el mdulo y seleccione


Mover en el mdulo en el men
contextual

4.

Con el mdulo seleccionado,


pulse la tecla PGUP

La ventana Esquema cambiar para mostrar propia esquemtica del mdulo, el Navigator tambin
cambiar para reflejar esto.
Para retroceder fuera del mdulo nuevo, ya sea el botn derecho y seleccione Mover a los padres o
pulse la tecla AV PG.
Tambin puede hacer doble clic en una parte vaca del esquema o, por supuesto, utilizar el
Navegador.

- 59 -

CHAPTER 4

Inputs and Outputs


Para obtener informacin dentro y fuera de un
mdulo es necesario agregar entradas y salidas.
Para ello, slo tienes que arrastrar ellos en la
caja de herramientas de la forma habitual (las
encontrar en el grupo del mdulo).
El ejemplo muestra enfrente de un mdulo con
dos entradas y tres salidas.

Para que una manera rpida de agregar


Mdulo de entradas y salidas del mdulo de
componentes que puede utilizar mtodos
abreviados de teclado.
Un selecto grupo de componentes se utilizan
con mucha ms frecuencia que los dems.
Para salvarte de ir a la caja de herramientas
cada vez que se puede pulsar una tecla en
particular y un nuevo componente se deja caer
a su posicin del ratn.
Para agregar una entrada, pulse yo, para
aadir una salida de prensa "O". Tenga en
cuenta que estos accesos directos no
funcionan si est utilizando el teclado del PC
para la entrada MIDI.

Orden de entrada /
salida
Es costumbre de mantener las entradas de la
izquierda y las salidas a la derecha, pero le toca a
usted.
Lo que importa es la posicin de los insumos respecto a
la otra, ya que esto determina el orden de las entradas
en el propio mdulo.
Al intercambiar las posiciones verticales de los
componentes de entrada y salida se puede cambiar
fcilmente el orden de las entradas para un mdulo.
Si los componentes tienen la misma posicin vertical
se toma la posicin horizontal en cuenta, con el
extremo izquierdo de entrada es ms alta en la orden.

Las mismas reglas se aplican a las salidas.

- 60 -

MODULOS

Conectores de
plantilla
Los conectores para los componentes de entrada y salida del mdulo del mdulo
son lo que llamamos Conectores de plantilla. Estos tienen ningn tipo definido.
Hay dos maneras que usted puede asignar un tipo a un conector de
plantilla:
1.

Captar automticamente el tipo de otro conector mediante la creacin de un enlace


a ese conector.

2.

Ajuste el tipo de forma explcita al hacer clic derecho sobre el conector y la


eleccin del tipo en el men contextual.

Nombres de entrada y
salida
Si usted da a sus entradas y salidas de nombres entonces stos se mostrarn cuando seleccione su mdulo.
Adems, los nombres de entrada se mostrarn automticamente en el cuerpo propio mdulo.

Si quieres ser an ms completa que se puede brindar descripciones cortas y largas.


Para hacer esto usted necesita para escribir en la entrada del mdulo o componente de salida en forma
<long name>\n<short name>. As, por ejemplo, la etiqueta de "Altura mxima del rectngulo \ nmaxh"
dara una entrada o salida de un nombre corto de "MaxH" y un largo nombre de "Altura mxima del
rectngulo".

- 61 -

CHAPTER 4

Hacer un
Modulo
Usted
encontrar que a medida que crea un esquema que usted quiere y necesita piezas de seccin
off en mdulos separados con el fin de gestionar la complejidad cada vez mayor. Usted puede hacer
esto fcilmente utilizando la funcin Mdulo Marca.
Slo tiene que seleccionar un nmero de componentes a continuacin, haga clic en el botn Mdulo
de Marca en la accin de seleccin panel (o haga clic derecho en la seleccin y seleccione Crear
mdulo).

El software crear un nuevo mdulo y colocar los componentes seleccionados y enlaces dentro (el diseo de todos los
componentes se conserva). Un mdulo de entrada o de salida se pueden crear para cada enlace que se conecta a la
seleccin. Los viejos vnculos se conectan a las entradas y salidas en el nuevo mdulo en lugar de la seleccin.

Propiedade
s

Ya hemos mencionado que los mdulos pueden tener propiedades. Estos afectan a
cmo el mdulo se ve o se comporta. Cuando un mdulo tiene propiedades en el
botn Propiedades se muestra en la esquina inferior derecha del mdulo. Esta es en
la forma de un pequeo crculo con una letra P en el centro.
Al hacer clic en el botn de propiedades del mdulo se expandir para mostrar el
panel de propiedades. Con el panel abierto usted es libre de hacer los cambios que
desee. El panel entonces se mantendr abierta hasta que haga clic en alguna otra
parte de su esquema.
Si desea que la pantalla del panel de propiedades
permanente que puede fijarlo abierta manteniendo la
tecla CTRL mientras hace clic en el botn P. El P
cambiar a un icono de pin para mostrar que las
propiedades permanecern abiertas.

- 62 -

MODULOS

Wireless
Modules
La mayora de los mdulos se han fijado los conectores de salida que se
vincula fsicamente a otros conectores.
Sin embargo, a veces es til hacer una salida del mdulo inalmbrico. En
lugar de utilizar un componente del mdulo de salida que utiliza un
componente de salida Mdulo inalmbrico.

Mediante la adicin de los productos inalmbricos a su mdulo, el mdulo se


convierte en un mdulo inalmbrico.
El mdulo se comportar de la misma forma que un componente de salida
Wireless establecer enlaces inalmbricos a juego con los componentes de
entrada inalmbricos ms abajo en la jerarqua de mdulos.
Como con las salidas inalmbricas un partido se determina por el tipo de conector y la etiqueta del componente.
Mdulos inalmbricos pueden ser identificados por el smbolo inalmbrico que aparece en el cuerpo del mdulo. Esto
aparecer en gris cuando no se han establecido vnculos. Sin embargo, si una o ms salidas Mdulo inalmbrico
dentro del mdulo se han establecido conexiones con entradas que coincidan con el smbolo inalmbricos inalmbrico
se iluminar.

- 63 -

CHAPTER 4

Front Panel

Cada mdulo tiene la opcin de tener un panel frontal. Paneles frontal le permiten aadir
elementos interactivos a su esquema y son el mecanismo por el que usted proporciona
una interfaz grfica de usuario (GUI) para sus creaciones.

Enabling the Front


Panel

El panel frontal se muestra en el propio mdulo. Por defecto, el panel frontal est desactivado.
Para activarla, seleccione el mdulo y luego haga clic en el botn G (GUI) (tambin puede
hacer clic derecho sobre el mdulo y seleccione Habilitar del panel frontal).
Si cambia el tamao del mdulo del panel frontal
cambiar de tamao en consecuencia.

- 64 -

MODULOS

Editando el Panel
Frontal
Al colocar las perillas, deslizadores y otros controles dentro de un mdulo que tiene un
panel frontal entonces estos elementos aparecern inmediatamente en el panel frontal.
Sin embargo, todo va a ser apilados en la parte superior izquierda esquina.

Con el fin de organizar los elementos que necesita para desbloquear el panel
frontal. Primero, seleccione el mdulo y luego haga clic en el botn de candado en
el panel de accin (tambin puede hacer clic derecho sobre el mdulo y seleccione
Editar del panel frontal o tecla CTRL y pulse E).

El panel frontal permanecer abierta hasta que se bloquee de nuevo.


Sin embargo, slo ser capaz de editar el panel mientras se
selecciona el mdulo. Cuando el mdulo queda seleccionada operar
como si el panel estaba cerrada.

- 65 -

CHAPTER 4

Seleccionando
Puede seleccionar los elementos en el panel frontal de la manera habitual haciendo clic sobre ellos. Si
mantiene SHIFT puede hacer clic para aadir o eliminar elementos de la seleccin.
Tambin puede hacer clic en una parte vaca del panel frontal y arrastre para seleccionar todos los
elementos en un rea rectangular. Para seleccionar todos los elementos que puede utilizar CTRL + A.
Si un artculo est debajo de otro, puede mantener pulsado ALT y hacer clic para alternar entre la
seleccin el elemento superior y la de abajo.

Selection Info
Ya sea por encima o por debajo de los elementos seleccionados vers un texto que muestra informacin
acerca de la seleccin.
La primera parte trata de los nombres de los mdulos para los elementos de la seleccin. La segunda parte es
que muestra las coordenadas de la esquina superior izquierda de la seleccin. Las coordenadas estn en la
forma "(x, y)" seguido de "SQR" o "pxeles".
Si sqr muestra a continuacin, las coordenadas estn en cuadrculas.
Si px muestra a continuacin, las coordenadas se expresan en pxeles en el nivel de zoom por defecto. Se
puede cambiar entre cuadrculas y pxeles haciendo clic en el texto de informacin de seleccin.

- 66 -

MODULOS

Moviendo
Despus de haber seleccionado los elementos que puede luego moverlos arrastrndolos alrededor. Por defecto, la
posicin de encaje a la red, pero se puede evitar esto mediante la celebracin de CTRL mientras arrastra.

Tambin puede utilizar las teclas de cursor para desplazar una seleccin una cuadrcula a la vez en cualquier direccin.
Si mantiene la tecla CTRL mientras empujando mover una distancia equivalente a 1 pxel en el nivel de zoom por
defecto.
Si se ampla o se reduce entonces pasars por una distancia que es equivalente a 1 pxel en el nivel de zoom actual.
Esto le permite tener el control ultra fino sobre la colocacin de los objetos en un panel frontal.

Redimensionando
Usted puede cambiar el tamao de los elementos del panel frontal. Esto funciona de la misma manera que para los
componentes en un esquema. Primero, seleccione el elemento que desee cambiar de tamao. La esquina inferior
derecha de la seleccin mostrar un control de cambio de tamao de color azul. Haga clic y arrastre para cambiar el
tamao de este.

Tenga en cuenta que debido a que cada elemento en el panel frontal es en realidad el panel frontal de un
mdulo en algn lugar ms abajo en la jerarqua, cambiar el tamao de un elemento se cambie el tamao del
mdulo correspondiente en el esquemtico.

- 67 -

CHAPTER 4

Jumping
Si quieres pasar directamente al mdulo que est representado por un elemento
de panel frontal entonces todo lo que tiene que hacer es hacer doble clic en l.

- 68 -

MODULOS

Draw Order
Si tiene varios elementos que se superponen entre s, entonces usted puede determinar cules aparecen en
la parte superior de los dems mediante el uso del men de pedido.
Haga clic en un elemento seleccionado (o material) y aparecer un men emergente.

A continuacin, puede elegir si desea traer una seleccin hacia adelante


en el orden de dibujo o enviarlo hacia atrs. Usted puede enviar el
artculo directamente a la parte trasera o llevarlo a la parte delantera.

Ver Fuera de los


Items

Es posible que los elementos del panel para mover fuera de la vista. Esto puede
ocurrir al cambiar el tamao del panel o cuando los mdulos de copiar y pegar.
Cuando esto ocurre vers los marcadores rojos en el borde del exterior del panel.
Estos tambin indican la ubicacin de los artculos.

Para obtener los artculos de nuevo a la vista, simplemente haga clic derecho
en el mdulo y seleccione Poner los elementos del panel a la vista.
Esta opcin tambin se encuentra en el men Esquema en la barra de men.

- 69 -

CHAPTER 4

Grupo de Items
A veces, los elementos del panel frontal se agrupan. Esto se determina por la forma en que
los mdulos se construyen. Hablaremos de cmo esto se produce ms tarde as que por
ahora slo tendremos que hablar de lo que ocurre cuando se produce.
Elementos agrupados se indican mediante una lnea de puntos fina alrededor de los
artculos. La nica manera de que agrupan artculos comportan de manera diferente de las
que no se agrupan es que estn limitados a aparecer en el mismo
llamar la orden respecto a la otra. Por ejemplo, si usted enva un artculo en el
grupo de atrs, el resto de los artculos del grupo se movern hacia atrs tambin.

Client Area
En ocasiones es posible que tenga que cambiar el tamao de un panel frontal sin cambiar el tamao
del mdulo. Esto puede suceder cuando el nmero de entradas o salidas del mdulo impone un
tamao mnimo en el mdulo, pero desea que la altura del panel frontal sea ms pequeo.

- 70 -

MODULES
Cuando se desbloquea el panel frontal vers un grueso borde gris oscuro alrededor del borde del panel.
Esto define el rea de cliente. Puede arrastrar los bordes alrededor para cambiar el tamao del rea de
cliente.
Cuando el borde se mueve de su posicin estndar que cambia a un color gris ms oscuro.
Tenga en cuenta que cuando esto sucede el borde se separa del mdulo de lmite y no cambiar el
tamao cuando el mdulo cambia el tamao a menos que se ve obligado a hacerlo.
Puede volver a colocar un borde al mdulo arrastrndolo de nuevo a su posicin original

Ocultando el panel
frontal
A veces desea que un mdulo tiene un panel frontal, pero usted no quiere mostrarlo.
Esto puede deberse a que es demasiado grande y quiere que su esquema sea
compacto. Puede ocultar el panel frontal, reduciendo al mnimo el mdulo. Primero,
seleccione el mdulo y luego haga clic en el botn Alternar botn Minimizar en el panel
frontal (o haga clic en el mdulo y seleccione Minimizar panel frontal).

El mdulo aparecer como sera si no estuviera presente el panel frontal. Usted puede maximizar el
mdulo de nuevo para mostrar el panel frontal si lo desea mediante la realizacin de la misma accin.

La visibilidad en paneles del mdulo


de Padres
Hay algunas circunstancias en las que no desee el panel frontal de un mdulo que
aparece en los paneles frontales del mdulo de padres. Por ejemplo, puede que
est utilizando una perilla para controlar una variable para propsitos de
experimentacin o es posible que desee ocultar una imagen de fondo para que deje
de entrar en el camino mientras usted arregla otros elementos del panel.

- 71 -

CHAPTER 4

Puede ocultar un mdulo seleccionando el mdulo y hacer clic en el botn de ojo en el


panel de accin (o usted puede hacer clic derecho en el mdulo y seleccione Mostrar
Panel de Padres). El botn ocular mostrar con un tachado para indicar que el mdulo
no se muestra en los paneles frontal del mdulo padre.
El Show En funcionamiento Panel de Padres funciona en
selecciones mltiples tambin.

- 72 -

MODULES

Propiedades

Ya hemos visto cmo acceder y cambiar las propiedades de un


mdulo, pero cmo llegan all en el primer lugar? En esta seccin
usted aprender cmo agregar propiedades a tus propios
mdulos..
Habilitacin del panel de
propiedades
Para activar el panel de propiedades de todo lo que necesita hacer es seleccionar el mdulo y haga clic en el botn P
En el panel de accin. Tambin puede hacer clic en el mdulo y seleccione Habilitar Propiedades..

- 73 -

CHAPTER 4

Adicin de elementos de
propiedades

Los elementos en el panel de propiedades de cada mapa en un componente particular en


algn lugar dentro del mdulo o del sub-mdulos. Hay seis tipos de componentes que se
pueden habilitar para su visualizacin en el panel de propiedades. Ellos son: Int, Float, String,
Boolean, Selector ndice y botn disparador.

Para activar uno de estos componentes para la visualizacin de las


propiedades, haga clic derecho en el componente y seleccione
propiedades. Vers una pequea etiqueta con una letra P en el medio
aparece en la esquina inferior derecha de la componente.
Esto indica que este componente es una propiedad y estar
representado por un control en el panel Propiedades.

- 74 -

Si se agrega una etiqueta al componente este ser utilizado en el


panel frontal para identificar el componente. Si ahora vuelve al
panel de propiedades vers el control de la propiedad para el
componente.

MODULES

Tipos de
Control

Cada uno de los cinco tipos de componentes de la propiedad Enabled de


un control que lo representa en el panel Propiedades. Hay slo tres
diferentes tipos de control.
Componentes Float, Int y String son representados por los controles de
edicin. Estos tienen una etiqueta que toma su texto de la etiqueta del
componente.

Componentes booleanos se muestran como una casilla de verificacin.


Una vez ms la etiqueta de la casilla de verificacin utiliza el texto de la
etiqueta del componente de Boole.

- 75 -

CHAPTER 4

El componente de botn de disparo est representado por un botn.


El texto del botn se toma de la etiqueta asignada al componente
Botn de activacin.

El componente Selector ndice se utiliza para seleccionar de una lista de


opciones para que esto se representa como una lista desplegable. La etiqueta
del componente una vez suministra el texto de la etiqueta de control.

- 76 -

MODULES

Edicin del Panel de


Propiedades

Para editar las posiciones de los elementos en el panel simplemente


desbloquear el panel, exactamente igual que lo hara para la edicin de un
panel frontal.

La edicin es entonces exactamente el mismo que para el panel frontal.


Puede seleccionar los elementos, arrastrar y empujar objetos alrededor o
ajustar su tamao. Vea la seccin en el panel frontal del mdulo para
obtener ms detalles.
Redimensionad
o
El tamao del panel de propiedades se puede ajustar de forma
independiente del tamao del mdulo. Cuando el panel est abierto a
cualquier cambio de tamao del mdulo slo se aplica al panel de
propiedades. Al hacer clic de distancia o cerrar el panel de propiedades del
mdulo volver a su tamao original.

Customizando
No slo se est restringido a los tres tipos de control descritos
anteriormente. Dado que el panel funciona como un panel frontal extra
que puede, de hecho, aadir cualquier tipo de controles o grficos que te
gusta. Todo lo que necesitas hacer es conectar su interfaz grfica de
usuario personalizada a una entrada sin hilos con las "Propiedades" de la
etiqueta.

- 77 -

CHAPTER 4

El siguiente ejemplo muestra cmo mostrar un botn en el panel de


propiedades..

- 78 -

MODULES

Sincronizacin
A menudo encontrar que usted tiene muchas copias del mismo mdulo
dispersos alrededor de su esquema. Esta es una de las grandes
ventajas de los mdulos - a crear una y luego se puede utilizar en
muchos otros lugares.
Sin embargo, qu sucede cuando se quiere cambiar el comportamiento
del mdulo?
Bueno, desde luego no quiero tener que cambiar todas las copias de
una en una.
Usted podra cambiar slo uno de ellos y luego copiar y pegar de nuevo
pero no es genial. Sera mucho mejor si pudiera transmitir los cambios a
todos sus mdulos a medida que los realiza.
Eso es exactamente lo que el Mdulo Sincronizacin o Mdulo de
sincronizacin est diseado para hacer.
Cuando uno o ms mdulos se sincronizan los cambios realizados en un
mdulo
se hacen al instante a todos los dems, es as de simple.
Paste Synchronise
Usted puede poner las copias de los mdulos sincronizados medida que los realiza. En lugar de pegar una copia de los
mdulos, elija Pegar Sincronizar en el men Edicin o pulse SHIFT+CTRL+V.

Cuando pegue Sincronizar por primera vez, te dars cuenta de que tanto el mdulo original y la
copia ahora tienen el smbolo de sincronizacin mdulo. Se seleccionar la copia pegada.
Cuando se selecciona un mdulo sincronizado tambin ver la cuenta de sincronizacin. Esto
indica cuntos otros mdulos se sincronizan con ste.
El recuento es de la forma xN donde el smbolo x representa la multiplicacin y N es un nmero.

- 79 -

CHAPTER 4

Sincronizar Todo
Si usted no piensa de antemano que usted quera copias de un mdulo que se sincroniza, entonces no te preocupes.
Hay una manera fcil de poner a todos en sincrona despus de que se haya creado.
Simplemente haga clic en uno de los mdulos y seleccione Sincronizar todo. Todos los mdulos que coinciden con el
mdulo que ha hecho clic se pondrn en sincrona, con independencia de su lugar de residencia en su esquema.

Tenga en cuenta que si alguna de las copias originales han sido alterados de
alguna manera, entonces no pueden ser puestos en sincrona.

Synchronise Painter
Para la sincronizacin ms selectivo que tenemos la funcin Sincronizar Painter. Este es un modo de
colocar el software en el cual le permite hacer clic en los mdulos que desea poner en sincrona.
Right-click en el mdulo que desea sincronizar con y seleccione Sincronizar Painter.
El cursor cambiar a la paintercursor sincronizacin.
Para realizar otra sincronizacin mdulo con ste todo lo que necesita hacer es hacer clic en l.
Si el mdulo es idntico por lo que se puede sincronizar la frontera mdulo parpadear en azul para
indicar que la operacin se realiz correctamente.

Usted puede navegar a travs de su esquema, mientras que el pintor Sincronizar est encendido. Puede utilizar el
Navegador o los paneles de accin de los mdulos. Tambin puede mantener CTRL para desactivar
temporalmente la pintura mientras hace doble clic en un mdulo para acceder a su contenido.
Para salir del modo Pintor Sincronizar usted puede hacer clic derecho en el esquema y desactive la opcin Sincronizar
Painter. Como alternativa, puede pulsar la tecla ESC. Si intenta realizar cualquier otra operacin de edicin, mientras que
el Sincronizar Pintor est en ella este se desactivar inmediatamente y se le regresa al modo de edicin estndar.

- 80 -

MODULES

Removiendo
Sincronizacin

Va en ocasiones tiene que ser capaz de detener un conjunto de mdulos se sincronicen entre s.
De hecho, es una buena idea para quitar la sincronizacin cuando se sabe que no es necesario realizar ms
cambios.
Hay tres maneras de hacer esto. Usted puede utilizar el Sincronizar pintor como se describi anteriormente.
Para una manera muy rpida para eliminar la sincronizacin se puede hacer clic derecho sobre un mdulo
sincronizado y seleccione Un-sincronizar todos. Esto eliminar la sincronizacin de todos los mdulos que se
sincronizan con el que ha hecho clic.
Tambin se puede simplemente eliminar la sincronizacin para un mdulo en particular por s mismo, haciendo
clic derecho sobre ella y seleccionando Un-sincronizacin.

Finding Synchronised Modules

Si desea localizar mdulos que se sincronizan con un mdulo en particular,


entonces slo tiene que seleccionar el mdulo y pulse la tecla TAB.
El software saltar al siguiente mdulo que est en sincrona. Siga pulsando
el tabulador para desplazarse por todos los mdulos que se sincronizan.
Finalmente, volver de nuevo al mdulo con el que comenz.
Tambin puede mantener SHIFT y pulse TAB para ycle travs de los
mdulos sincronizados en el orden inverso.

- 81 -

CHAPTER 4

Focus Mode
Si usted est construyendo una aplicacin para exportar a veces es posible que desee
obtener una vista previa o simplemente usarlo sin toda la interfaz de edicin en el
camino. Usted puede hacer esto utilizando una funcin llamada Modo de enfoque.
Modo de enfoque se aplica a un mdulo concreto. Se derrumba la ventana de la
aplicacin en torno a un mdulo y le permite tener como el foco principal - como si se
tratara de la aplicacin.

Focus on a Module
Para poner un mdulo en el modo de enfoque, seleccione el mdulo a continuacin, haga clic en el botn de modo de
enfoque en el panel de acciones (parece una lupa). Alternativamente haga clic derecho en el mdulo y seleccione el
modo de enfoque.

Para salir del modo de enfoque haga clic en el botn de cierre, pulse la tecla
Escape.

Focus on the previous Module


Es posible que desee obtener una vista previa de su aplicacin o mdulo cuando ests en alguna otra parte
del esquema sin tener que navegar de nuevo a encontrar cada vez. Usted puede hacer esto mediante la
seleccin de modo de enfoque en el men Ver o haciendo clic derecho en una parte vaca del esquema y
seleccionar el modo de enfoque.
Se seleccionar el ltimo mdulo se centr en este caso, con independencia de cualquier otro mdulo que
se puede seleccionar en el esquema de la poca.
Para una rpida conmutacin de modo de enfoque de esta manera puede utilizar la combinacin de teclas
SHIFT + ESCAPE.

- 82 -

TIPOS DE DATOS & FLUJOS DE SEAL

5 Tipos de Datos &


Flujo de
Seal
CONECTOR

TIPOS EXPLIICADOS

- 83 -

CHAPTER 5

FlowStone soporta ms de 30 tipos diferentes de datos. Cada tipo


tiene su propio conector con un smbolo nico para su fcil
reconocimiento. Aunque hay muchos tipos diferentes de datos todos
ellos caen en una de tres categoras diferentes: Stream, provocada o
Evento.
Datos de la muestra abarca todas las seales de audio y de control
digital. Estas seales estn fluctuando a la tasa de muestreo y as
todos los componentes que ellos procesan tambin realizar clculos a
una velocidad de muestreo.
Datos disparada funciona de una manera completamente diferente.
Cuando el dato corriente fluye de forma continua, provocada datos
slo fluye en respuesta a algn evento.
Por lo general, el evento es una interaccin del usuario o los datos
que llegan de alguna fuente externa, como una tarjeta de interfaz o un
temporizador.
Los datos de eventos son similares a los datos provocados en que
fluye en respuesta a algn evento. Sin embargo, la forma en que fluye
es bastante diferente.
Tenga en cuenta que en la gran mayora de los casos, los datos fluyen
de izquierda a derecha, con esto queremos decir desde el conector de
salida al conector de entrada.
Esto es cierto para todos los flujos y todos los datos de eventos, pero
hay algunas excepciones con algunos de los tipos de datos disparada.

- 84 -

TIPOS DE DATOS & FLUJOS DE SEAL

Stream Data
Si usted est interesado en aplicaciones de audio o procesamiento
de datos a altas velocidades de datos, entonces usted tendr que
trabajar con los datos de la secuencia. Streams entregan seales
digitales de alta velocidad de datos que usted puede entonces el
proceso en el software. Esto se conoce como procesamiento de
seal digital (o DSP). Si usted no est familiarizado con DSP
entonces la siguiente seccin le dar una visin general rpida.
Procesamiento digital de seales en una cscara
de nuez
Qu es DSP?
Bueno, vamos a empezar con una seal que vamos a definir como el valor continuo de un cierto
parmetro en el tiempo. Esto podra ser cualquier cosa, desde la temperatura de una habitacin de
audio tomado de algn dispositivo de escucha.
Si no se pasa la seal en su ordenador desde una fuente externa, como un micrfono, entonces
tiene que ser convertida de una seal analgica a una digital . Esto se hace mediante la medicin
de la magnitud de la seal en repetidas ocasiones durante intervalos de tiempo discretos.
Cada medicin se denomina una muestra y el resultado es una serie de nmeros que es la seal
digital.
El proceso se denomina muestreo y la velocidad a la que se mide se llama la tasa de muestreo.
El ndice ms utilizado para las seales de audio, por ejemplo, es 44 100 muestras por segundo, a
menudo representados como una frecuencia de 44.1 Khz pero las tasas ms altas tambin se
utilizan para obtener las seales de mayor calidad.
La parte de procesamiento de DSP consiste en tomar la corriente de nmeros que representan la
seal digital y su conversin en otra corriente de nmeros mediante la aplicacin de una
combinacin de transformaciones matemticas.
Esto es lo que FlowStone no usa en secciones de componentes de secuencia de datos que se
conectan entre s.
La seal de salida puede ser convertido nuevamente en analgico y transmite o escuch como el
sonido a travs de auriculares o altavoces.
Una caracterstica clave del software es que puede procesar estas muestras individualmente a la
tasa de muestreo.
Muchas aplicaciones no son capaces de esto y tienen que procesar una coleccin de muestras en
un solo marco con el fin de mantener el uso de la CPU en niveles aceptables. Esta restriccin limita
las posibilidades de procesamiento, ya que es a menudo un requisito para procesar una muestra
determinada en base a la muestra que la precedi. Esta situacin se denomina retroalimentacin y
nica captacin de la muestra es una capacidad de FlowStone que lo diferencia de otro software.

- 85 -

CHAPTER 5

Hay dos principales tipos de datos de flujo: Poly y Mono. Poly slo se utiliza
para aplicaciones de audio donde las seales de sonido se generan a partir
de las notas MIDI. Si usted no est generando el audio de esta manera
entonces puede ignorar completamente Poli.
Mono
Mono lleva una sola seal en la frecuencia de muestreo. Un conjunto de
componentes mono conectados entre s (para formar lo que se llama una seccin
Mono) siempre tiene datos que fluye a travs de l. Una vez conectado a la
derecha a un componente Direct Sound Out o salida ASIO una seccin Mono se
ejecuta constantemente, incluso si hay una seal de nivel cero que pasa por.
Conector Mono - un solo canal de flujo de movimiento rpido de los datos
de coma flotante que oscila a una velocidad de muestreo. Siempre y cuando
est conectado a un componente de salida de sonido, como Direct Sound
Out siempre est activa.
Poly
Conectores Poly pueden llevar a muchas seales digitales a la vez. Una seccin Poli slo utiliza su
tratamiento cuando existan seales que pasan a travs de l. Poli slo se utiliza para aplicaciones de audio
y se genera en respuesta a las notas MIDI.
El nmero de seales se determina por el nmero de notas que se tocan. Si no hay seales entonces no
hay xito CPU. Sin embargo, cuando hay una o ms notas jugando obtendrs el uso proporcional de la
CPU para cada seal generada (aunque debido a la forma FlowStone utiliza SSE, que slo te dan una
aumentar en cada 4 nota).

Conector Poli - representa las seales de audio


multicanal. Cada canal es un movimiento rpido arroyo
independiente de datos de punto flotante que oscila a una
velocidad de muestreo. Los datos son de varios canales
porque hay un canal para cada nota que usted juega.

Cundo utilizar Poli o


Mono
Usted podra utilizar una combinacin de componentes de poli (una seccin
de Poli) para modelar la parte polifnica de un sintetizador. Con una seccin
Poli puede generar seales de audio separadas para cada voz o una nota
que usted juega. A continuacin, puede combinar las seales de Poly Mono y
tienen una seccin Mono donde usted aplicar efectos a la seal combinada
en su conjunto.
- 86 -

TIPOS DE DATOS & FLUJOS DE SEAL

Conectores Poly y Mono le permiten ver fcilmente qu tipo de datos est fluyendo a travs de diferentes
partes de su esquema. Esto es importante porque cuando se agrega a su esquema que necesita saber si
el tratamiento que usted introduce se aplicar de forma acumulativa para cada voz (Poli) o constantemente
por una seal (Mono).

- 87 -

CHAPTER 5

Conectores Stream
Puede crear mdulos que se pueden utilizar en una seccin de un mono o poli mediante el uso de
conectores Stream.
Se ven como versiones de color gris oscuro del conector poli.
Stream connector

Cuando un conector de salida de corriente est vinculado a un conector de Poly o Mono al


instante recoge ese tipo.
El cambio de tipo fluye entonces desde la izquierda a la derecha de nuevo por cualquier otro
procedimiento conectores corriente cambindolos al nuevo tipo de acuerdo.

- 88 -

TIPOS DE DATOS & FLUJOS DE SEAL

Poly y Mono Secciones en aplicaciones de audio


Para obtener los datos a fluir a travs de un poli o seccin mono que tienes que conectarlo
correctamente. En la mayora de los casos usted desea utilizar la entrada MIDI de un teclado o
de otra fuente para generar notas. A continuacin, desea que cada nota para hacer un sonido
que se puede escuchar

La configuracin ms comn sera el que figura a


continuacin:

1.
2.
3.
4.
5.

El MIDI al mdulo de Poli convierte los datos de notas MIDI entrantes en


seales Poly
La seccin Poli procesa las seales
El mdulo combinator luego combina las seales independientes Poly en una seal
mono
La seccin Mono aplica un procesamiento para el resultado
La seal final es enviado a su tarjeta de sonido a travs de un componente Direct Sound
Out o salida ASIO dentro
FlowStone oa travs de la configuracin de audio de acogida si se utiliza dentro de un plugin
NOTA: Si usted no tiene Direct Sound Out o componente de salida ASIO
el procesamiento de audio no se realizar

A, seccin poli utilizable completa siempre comienza con un mdulo MIDI a Poly y termina con
un mdulo combinator. La nica excepcin es si usted est usando un analizador de seal
para mirar la salida de un tramo de poli.
Usted puede tener una seccin Mono sin seccin Poly. Esto es lo que tendra si estuviera creando un efecto que realiza
alguna DSP en una seal entrante. Sin embargo, si quieres escuchar todo lo que tiene que conectar una seccin Mono a
un dispositivo de salida a travs de un componente Direct Sound Out o salida ASIO.

- 89 -

CHAPTER 5

Boolean Connectors
Hay equivalentes booleanos del poli, mono y los tipos de datos Stream. Slo se ven
en algunos componentes, sobre todo los componentes de comparacin Poly y
Mono.
El MIDI Poly mdulo dispone de una salida de Poli booleano que
cambia de false a true cuando se toca una nota y por lo tanto
puede ser utilizado como una seal de puerta.

Poly Boolean mscara multi-canal, una mscara para cada nota de juego
Mono Boolean mscara de un solo canal, en constante
funcionamiento
Stream Boolean

Poly Int

El tipo de datos de poli Int. es el entero equivalente del tipo Poly. Slo se
utiliza en el grfico a Poli para permitir la indexacin de frecuencia de
muestreo de Arrays de flotador.
PolyInt - multicolor nmero entero de canales, un canal para
cada nota de juego

SSE

Si una CPU soporta SSE entonces tiene un conjunto de instrucciones


incorporadas en la que permiten las operaciones matemticas que se
realizarn en varios conjuntos de datos al mismo tiempo. FlowStone hace
pleno uso de esto cuando el procesamiento de datos de la secuencia.
El resultado es que se puede procesar con eficacia hasta 4 canales al mismo
tiempo por el mismo costo de la CPU como una sola.

- 90 -

TIPOS DE DATOS & FLUJOS DE SEAL

Mono 4

Si usted realmente desea conseguir el mejor rendimiento de una seccin Mono entonces usted
necesita para considerar el uso del tipo de datos Mono4. No siempre es posible usar esto, pero
cuando se puede se hace una gran diferencia en el rendimiento.
Secciones Mono slo tienen un proceso de sonido. Debido FlowStone utiliza SSE este proceso
podra hacer cuatro veces el trabajo por el mismo costo de la CPU. Para tomar ventaja de esto
tenemos los componentes y deshacer. Estas te permiten empacar literalmente cuatro canales
mono en una corriente Mono4.
Mono4 cuatro seales mono procesados como uno

Performance
Para ayudar a medir el efecto de los cambios en las partes de su esquema de flujo que
tenemos un medidor de cpu.
Esto se puede encontrar en el lado derecho de la barra de estado en la parte inferior de la
ventana de aplicacin. El medidor de CPU es muy bsico. Slo se mide el rendimiento de la CPU
de las secciones de la corriente, no se mide el rendimiento GUI.

- 91 -

CHAPTER 5

Triggered Data

Como Trabaja
Datos activa slo fluye a travs de un esquema cuando se produce un evento que 'disparadores' un
cambio. Hasta que esto suceda secciones de datos activados permanecen en un estado de equilibrio.
Cuando un evento ocurre un mensaje de llamada de activacin se enva a travs de los conectores de
salida de uno o ms componentes.
El gatillo fluye a travs de los enlaces hasta que llega a otro componente. Ese componente luego evala si
el estado se vera afectado.
Cualquier reclculos necesarios se realizaron a continuacin y un disparador se enva a travs de los
conectores de salida de dicho componente. El proceso contina creando un efecto de cascada a travs de
la esquemtica.
El siguiente ejemplo muestra algo muy simple de dos nmeros, se suman.
Cuando se escribe en un componente Float esto da lugar a uno de los eventos que hemos estado
hablando y comienza una rfaga de disparo.

Tenga en cuenta que durante la parte de reclculo de un


componente puede pedir a los dems componentes que
proporcionen valores a sus entradas para sus ltimos valores.
Esto en s mismo puede provocar un aluvin de mensajes a la
izquierda.

- 92 -

TIPOS DE DATOS & FLUJOS DE SEAL

Para que se Utiliza

los datos desencadenado tiene dos funciones principales.


En primer lugar se proporciona una forma de realizacin de clculos que no
necesitan ser hechas a la tasa de muestreo. En segundo lugar que le permite
construir elementos muy detallados y complejos de interfaz de usuario, que
slo tienen que responder al interactuar con ellos.
Como regla general el DSP rpido es manejado por el flujo de datos y la
interfaz de usuario ms lenta DSP y es manejada por los datos disparada.
Tipos de datos disparables
Los diversos tipos de datos activadas se pueden agrupar en varias categoras
basadas en su propsito.
Primary Types

Estos son los tipos ms comunes. Representan datos simples, como nmeros y
texto.
Float - un nmero de punto flotante de 32

bits
Int - un entero de 32 bits con signo en el rango desde -2147483648 hasta

2147.483648 millones
String una cadena alfanumrica de caracteres de longitud
ilimitada
Boolean

uno de dos valores: true o false

Trigger - no

es realmente un tipo de datos (no hay datos) sino que se


utiliza para pasar mensajes de activacin
Tipos de matriz

Estos tipos representan matrices de tamao variable de algunos de los tipos


primarios. Una matriz es simplemente una lista ordenada de elementos del mismo
tipo. Los tipos de matriz tienen un patrn de esquema 'de cuatro hojas "en lugar
de un crculo.

matriz de nmeros de punto flotante


de 32 bits
Float Array

gama de 32 bits entero con signo en el rango desde -2147483648 hasta


2147483.648 mil
Int Array

conjunto de cadenas de
caracteres
String Array

- 93 -

CHAPTER 5

Tipos de interfaz grfica


Estos se utilizan solo para la edicin de interfaz grfica de bajo
nivel por lo que no se necesita saber acerca de ellos hasta llegar
a utilizar los componentes GUI.
View transporta

toda la informacin de dibujo y el

ratn

rea se define mediante las coordenadas de la esquina superior izquierda, una

anchura y una altura


Mouse

etc)

eventos de ratn (botn izquierdo arriba / abajo, mover el ratn,

en formato argb ('a' es el nivel de


transparencia)
Color

Pen para

dibujar lneas - definido por el color, grosor y

estilo

Font Informacin que comprende la fuente de letra, tamao y estilo


String Format

informacin de alineacin para

dibujar texto

Bitmap 32bit image


Point Array

una matriz de puntos (pares de punto flotante)

Bitmap Array una matriz para los mapas de


bits
Memory Types
Hay dos tipos que representan buffers de datos almacenados en la
memoria. Ellos son los ms usados para el almacenamiento de datos de
archivos de onda para las muestras.

Souvenirs - una seccin contigua de datos en la


memoria
Mem Array una serie de secciones de memoria de longitud ilimitada

Ruby Types
En un Ruby todos

los datos se considera como un objeto. Los nmeros son objetos, las
cadenas son objetos, las matrices son objetos. Fuera del cdigo Ruby objetos
tienen el mismo tipo: VALOR as que cuando se pasa objetos de Ruby entre los
componentes de Ruby se les pase a travs del conector Valor Ruby.
Valu puede

referirse a cualquier objeto

de Ruby

- 94 -

TIPOS DE DATOS & FLUJOS DE SEAL

Special Types
Hay un puado de tipos de datos que se destacan por su cuenta.

MIDI

todos los mensajes MIDI estndar

Voice Actualmente slo se utiliza dentro del MIDI al mdulo de Poli, pero podr ser

extendido en el futuro
Bus el conjunto definido por el usuario de los tipos de datos que viajan juntos a travs
del mismo conector
Preset lleva informacin sobre el parmetro preestablecido y cambios de
programacin de plugins
Template no es un tipo de datos, en lugar de esto, toma lo que sea que lo conecte

a l

- 95 -

CHAPTER 5

Eventos de
Datos

Como Trabaja
Como dato desencadenados , los datos de eventos slo fluye a travs de un esquema
cuando ocurre algo que causa un cambiar . Hasta que esto suceda secciones de datos
de eventos permanecen en un estado estable .
Cuando ocurre un evento un mensaje denominado evento se enva a travs de los
conectores de salida en uno o ms componentes . El Evento fluye a travs de los
enlaces hasta que llega a otro componente .
Todo esto suena muy similar al sistema de disparo . Sin embargo , existen dos
diferencias importantes . primero el evento lleva datos con l.
El sistema de disparo slo seala que se ha producido un cambio, componentes y luego
vuelven a llamar ( a la izquierda ) para calcular sus valores. Eventos transportan datos
con ellos . una vez que un caso llega a un componente que no hay de volver a llamar .
La segunda diferencia es que los eventos estn programados . Cuando se crea un
evento primero se le da un tiempo erradicar y slo se ejecutar cuando se llega a ese
momento. Esto significa que usted puede especificar exactamente cuando se desea un
evento ocurra. Este tiempo se integra completamente con los datos de la secuencia ,
para que pueda programar eventos que se producen en una muestra precisa.
Actualmente los datos de eventos slo se aplica al componente de Ruby. Vea la seccin
1 String
changes sending trigger
to
de Rub
de componentes
para ms
informacin . 4 Time+1 arrives and event is sent out
right via trigger system

2 Ruby component calls back to


get the new string value and
stores it.
Use of the trigger system
ends here. After this point the
Ruby component will never
call back for a value, it can
only use what it has been
sent.

- 96 -

3 Ruby component
schedules an event to be
sent out 1 second into the
future using the Event
system

TIPOS DE DATOS & FLUJOS DE SEAL

Tipos de Datos
Eventuales

Fuera de los componentes de Ruby slo un tipo de datos utiliza el sistema de


eventos, Ruby Valor.
En Ruby todos los datos se considera como un objeto. Los nmeros son objetos, las
cadenas son objetos, las matrices son objetos.
Fuera del cdigo Ruby, los objetos tienen el mismo tipo: VALOR as que cuando se
pasa objetos de Ruby
entre los componentes de Ruby se les pase a travs del conector Valor Ruby.
Value puede referirse a cualquier objeto de

Vamos a Ruby
discutir esto con ms detalle en la seccin Rub componentes de esta
gua.

- 97 -

CHAPTER 5

La conversin entre tipos


En la mayora de los
casosdatos
va a crear vnculos entre los conectores del
de
mismo tipo. Sin embargo, FlowStone soporta varias conversiones
automticas e intuitivas entre tipos de datos que encontrar
extremadamente prctico.
En la mayora de los casos va a crear vnculos entre los conectores del
mismo tipo. Sin embargo, FlowStone soporta varias conversiones
automticas e intuitivas entre tipos de datos que encontrar
extremadamente prctico.

String <> Boolean


Usted puede obtener un valor booleano de una cadena, y tambin convertir
de un valor lgico de una cadena:

- 98 -

TIPOS DE DATOS & FLUJOS DE SEAL

Int <> Boolean

Boolean e Int tambin son intercambiables. El cero representa un valor falso,


cualquier otro valor se considera para ser verdad.

String <> Float <> Int

Puede convertir de nuevo y adelante entre las cuerdas, flotadores e ints.


Redondeo obviamente ocurrir al convertir de Flotante a Int (la parte decimal
es ignorado).

- 99 -

CHAPTER 5

Int/Float > Poly/Mono


Un flotador o Int se pueden conectar a las entradas de Poly o Mono. Estos actan como seales
que mantienen un nivel constante. No puede sin embargo conectar un poli o Mono a un
slo
se pueden
conectar
a s mismos..
flotador
o Int. De
hecho conectores
Poly y Mono

- 100 -

TIPOS DE DATOS & FLUJOS DE SEAL

MIDI <> String

Esto no es tanto una conversin como una manera prctica de revisar qu


datos MIDI es procedente de un MIDI de salida. Conecte un componente de
datos String y nota on / off, cambio de control y mensajes de pitch bend,
etc se muestran junto con los diversos parmetros que las definen.
Como no se trata de una conversin, como tal, usted necesita MIDI "fuerza"
a los enlaces de Cuerda manteniendo SHIFT + CTRL al vincular.

Float Array <> String

Usted puede convertir fcilmente entre una cadena y una red de


flotadores.

- 101 -

CHAPTER 5

Accesos directos de
Strings
El componente de datos String se puede utilizar como un atajo para la definicin de los
distintos tipos de datos de la GUI. Los colores, las reas, Bolgrafos y ms pueden ser
definidos en una nica cadena de texto.
Area

Para crear un rea de utilizar el formato "x, y, w, h", donde "x" e "y" dar a la esquina
superior izquierda de la zona y "w" y "h" dar el ancho y alto de la zona. Todas las
dimensiones estn en cuadrculas, por supuesto.

Colour

Hay dos formas de especificar un color mediante una cadena de datos. Usted puede
utilizar uno de los 14 colores predefinidos que son los siguientes:
Black, White, Red, Green, Blue, Yellow, Grey
tBlack, tWhite, tRed, tGreen, tBlue, tYellow, tGrey

(los colores 't' son parcialmente


transparentes)
Utilice el color por su nombre en el componente de cadena. Tenga en cuenta que los nombres de los colores no son
sensibles a las maysculas.

La segunda manera de especificar un color es por ARGB. Utilice el formato "(a: r: g: b)" donde a es la
transparencia, r es el componente rojo, g es el componente verde y b es el componente azul. Todos
los valores son enteros en el rango de cero a 255.

Pen
Una
pluma tiene tres atributos: color, grosor y estilo. El uso de un componente
(pluma)
de la cadena se puede especificar una pluma por la prestacin de estos
atributos en el "color, grosor, estilo" formato.

- 102 -

La parte de color es exactamente el mismo que para la especificacin de un


color con una cadena (vase ms arriba).

TIPOS DE DATOS & FLUJOS DE SEAL

El espesor es un nmero de punto flotante en cuadrculas.


El estilo puede ser cualquiera de las siguientes cadenas
solid, dash, dot, dashdot, dashdotdot

Puede dejar el parmetro estilo a fuera y un estilo slido ser asumido.

Font

Las fuentes pueden ser generadas por cadenas con el formato "tipo de
letra, el tamao, el estilo".
Tipo de letra es el nombre del ejemplo de fuente Arial o Tahoma.
El tamao es la altura del texto en cuadrculas (no es un tamao de punto).
El estilo puede ser cualquier combinacin de las siguientes cadenas (en cualquier orden):
normal, bold, italic, underline, strike
Algunos ejemplos: Bold, underlineboldstrike, italicunderline.
Puede dejar fuera el parmetro estilo y ser asumido un estilo regular.

- 103 -

CHAPTER 5

StringFormat
Formatos de cadena se especifican con el formato "style,horizalign,vertalign".
El estilo puede ser cualquier combinacin de las siguientes cadenas (en cualquier orden):
normal, righttoleft, nowrap, vertical
Algunos ejemplos: nowrapvertical, nowraprighttoleft. Tambin puede utilizar 0 para indicar que no se aplican las
opciones de estilo.
Para la alineacin horizontal que puede utilizar:
left, center or right
Para la alineacin vertical puede utilizar:
top, center or bottom

- 104 -

EXPORTING

6 Exportando
CREANDO

APLICACIONES Y PLUGINS AUTONOMAS

- 105 -

CHAPTER 6

Creando Aplicaciones Autnomas


FlowStone se puede utilizar para crear aplicaciones completas que se ejecutar por su cuenta.
Primero haga clic en el botn EXE en el panel de accin del mdulo que desea exportar (o haga clic en el mdulo y
seleccione Crear independiente desde el men pop-up).

Aparecer el cuadro de dilogo Crear aplicacin independiente.

Application Name
El nombre de la aplicacin es el nombre del archivo exe. Que se generar. Por defecto, el software
utilizar la etiqueta del mdulo. Si no hay una etiqueta del cuadro de dilogo mostrar el ltimo nombre
que utiliz.

- 106 -

EXPORTING
Application Icon

Usted puede elegir su propio icono de la aplicacin. Haga clic en Cambiar y busque el icono que desea utilizar el cuadro
de dilogo resultante. Iconos necesitan ser almacenados en. Ico antes de que puedan ser utilizados por los g. Si usted
decide lo que desea es utilizar el icono predeterminado, haga clic en el botn Usar predeterminado. Una vista previa del
icono que el software utilizar se muestra en el cuadro de dilogo.

Su aplicacin se crear aqu


Las solicitudes se cre en una carpeta determinada y usted tiene la opcin de cambiar esto.

Full Screen
Marque esta casilla si desea que la aplicacin para poner en marcha y llenar toda la
pantalla. Esta es la opcin ideal para las aplicaciones destinadas a los sistemas
integrados.
Include context menu for zoom and exit
Esta opcin determina si el men del botn derecho default est presente en su exe
exportado. Este men permite a los usuarios del exe para cambiar el nivel de zoom,
mover a pantalla completa y salir de la aplicacin ..
Enable ESC to Quit
Esta opcin permite que la tecla Escape como medio de salir de su exe generado. Es til para
las aplicaciones que se ejecutan en pantalla completa en la que no quiere tener un botn Salir
o men de la GUI.
Launch on Completion
Usted puede elegir si desea iniciar la aplicacin recin generado al finalizar marcando esta casilla.

Compress EXE
Exes exportados se comprimen automticamente para reducir el tamao del archivo. En un nmero muy pequeo de los
sistemas de este se ha encontrado para interferir con el proceso de exportacin causando que no funcione. Si usted est
experimentando problemas de esta naturaleza, entonces usted puede desactivar la compresin.

Include Support for SSE and SSE2


El PC en el que se genera el exe puede apoyar SSE2 o simplemente puede apoyar SSE. Al exportar un exe el software
guarda el cdigo que se ha optimizado para las capacidades de la ESS de su propio PC. Si a continuacin, da el exe para
alguien cuyo ordenador tiene capacidades diferentes SSE desde que el software tiene que hacer ajustes en la carga de
modo que el lector va a funcionar.

- 107 -

CAPITULO 6

Estos ajustes pueden ralentizar el proceso de carga. Para evitar esto se puede optar por incluir
apoyo a todos SSE configuraciones al momento de exportar. De esta manera no hay una
reduccin en la velocidad de carga cuando se utilizan exes en PCs con capacidades diferentes de
la ESS.
Create wavetable .dat files for faster loading
Los componentes del diente de sierra y Sine utilizan tablas de ondas. stas son generadas
en el arranque, pero puede optar por guardarlos en un local. Dat con el fin de acelerar el
tiempo de carga exe.
Include MIDI and Audio Menu
Para aplicaciones de audio FlowStone puede crear exes con un men por defecto que
permite a los usuarios seleccionar la entrada MIDI y salida de audio. Usted puede optar por no
tener este men y, o bien facilitar el acceso a estas opciones a travs de su propia interfaz
grfica de usuario o no darles nada.

Launch on Completion
Usted puede elegir si desea iniciar la aplicacin recin
generado al finalizar marcando esta casilla.

Start Audio on Launch


Si se selecciona esta opcin, el software intentar abrir el
controlador de audio por defecto cuando se lance el exe.

Haga clic en Crear y dentro de unos pocos segundos de su aplicacin. Exe se crear en
la ubicacin de destino que ha especificado. Si marc el lanzamiento el cuadro
Finalizacin aparecer la ventana de la aplicacin.

Library Dependencies
En la mayora de las ocasiones su exe exportado se puede distribuir por s sola. Sin embargo,
algunos componentes en FlowStone dependen de libreras externas. Si su proyecto utiliza
estos componentes y, a continuacin, exportar a un independiente tendr que distribuir las
libreras de soporte junto con el ejecutable.
Se le informar de cualquier dependencia al exportar.
Proporcionamos instaladores pre-empaquetados para las bibliotecas en nuestro sitio
web. Usted es libre de distribuir estos en la forma que se proporcionan. Para obtener ms
informacin, consulte nuestra pgina web:
http://www.dsprobotics.com /libraries.html

- 108 -

EXPORTING

Creando Plugins
FlowStone puede exportar plugins VST totalmente independientes.
VST es un formato estndar creado por Steinberg. Un plugin VST es un
Procesador de efecto digital virtual o instrumento que se puede utilizar en
Aplicaciones compatibles VST para crear msica.
El mecanismo para la creacin de un plugin en FlowStone es muy simple.
Todo lo que necesitas es un mdulo con una combinacin aceptable de
Entradas y salidas MIDI y / o Mono.
El panel frontal del mdulo (si se proporciona uno) proporcionar la interfaz
de usuario de su plugin. Dentro de su mdulo es necesario proporcionar las
entradas y salidas necesarias entonces todo lo que ocurre en el medio es de
usted.
Inputs y Outputs
Para un instrumento VST necesitar una entrada MIDI y dos salidas mono mdulo. Esto
permite que el instrumento para enviar datos de audio estreo basado en seales MIDI
enviados desde un host.
Efectos VST pueden variar. Usted puede crear un efecto MIDI que toma una entrada MIDI
y una salida MIDI.
Para un efecto de audio estndar se necesitan dos entradas mono y dos salidas mono.
Por supuesto, usted puede tener cualquier nmero de entradas y salidas, pero usted
necesitar un host que puede manejar los datos que est solicitando desde o enviar a la
misma.

Tenga en cuenta el botn VST, y por lo tanto la opcin de crear un plugin


desde un mdulo, no aparecern a menos que la combinacin de entradas y
salidas es aceptable.
Usted puede utilizar el VST VSTi o mdulos en la caja de herramientas si
desea un mdulo de plantilla a utilizar como punto de partida para su
complemento.
- 109 -

CHAPITULO 6

Create VST/VSTi Dialog


Para crear un plugin VST, simplemente haga clic en el botn VST en el panel de accin de su
mdulo de plugin o seleccionar el mdulo y seleccione Crear VST / VSTi en el men Esquema.

Al hacer clic en el botn VST se le presentar con el dilogo


Crear VST / VSTi. Esto le permite especificar las diversas
caractersticas de su plugin.

- 110 -

EXPORTING
Plug-in Name

El nombre de plug-in es el nombre de la dll que se generar y el nombre que se utilizar cuando el
plug-in aparece en su anfitrin. Por defecto, el software utilizar la etiqueta del mdulo. Si no hay
una etiqueta del cuadro de dilogo mostrar el ltimo nombre que utiliz.
This plug-in is an
El tipo de plug-in se ajustar automticamente en funcin de la combinacin de entradas y salidas
en el mdulo. Bsicamente, si usted tiene una entrada MIDI y dos salidas mono entonces
Instrumento se seleccionar otro modo Efecto ser seleccionado.

Vendor & Version


El nombre del proveedor es su nombre o nombre de su empresa si desea especificar uno.
Tambin puede establecer un nmero de versin, esto debe ser un valor entero.

Your plug-in will be created here


Los plugins son creados en una carpeta determinada y usted tiene la opcin de cambiar esto.

Plug-in ID
Puede configurar los cuatro caracteres nicos de identificacin para su plugin. Esto es parte
del estndar VST. Usted debe tratar de usar un identificador que no es utilizado por ningn
otro. Sin embargo, es ampliamente reconocido que el nmero de plugins VST en circulacin
es casi imposible que el sistema de identificacin nico para trabajar. En la mayora de los
ejrcitos no es necesario disponer de un identificador nico.

Include Support for SSE and SSE2


El PC en el que se genera el plugin puede apoyar SSE2 o simplemente puede
apoyar SSE. Al exportar un cdigo de plugins del software guarda que est
optimizado para las capacidades de la ESS de su propio PC. Si a continuacin, da
el plugin para alguien cuyo ordenador tiene capacidades diferentes SSE desde que
el software tiene que hacer ajustes en la carga de modo que el lector va a
funcionar.
Estos ajustes pueden ralentizar el proceso de carga. Para evitar esto se puede
optar por incluir apoyo a todos SSE configuraciones al momento de exportar.
De esta manera no hay una reduccin en la velocidad de carga cuando se
utilizan plugins en PCs con capacidades diferentes de la ESS.
Create wavetable .dat files for faster loading
Los componentes del diente de sierra y Sine utilizan tablas de ondas. stas son generadas en el
arranque, pero puede optar por guardarlos en un local. Dat con el fin de acelerar el tiempo de carga de
plugins /
Haga clic en Crear y dentro de un par de segundos el plugin DLL se crear en la ubicacin de
destino que ha especificado.

- 111 -

CAPITULO 6

Para crear el complemento, haga clic en el botn Crear. Tambin puede crear una versin de
demostracin. Esto insertar rfagas de ruido intermitentes en sus plugins.

Storing VST Export Preferences


Con el fin de preservar la configuracin que desea utilizar en el cuadro de dilogo Crear VST / VSTi puede agregar un
componente VST Plugin Info a su mdulo. Esto tiene entradas para todos los parmetros en el cuadro de dilogo.

Sin tener nada conectado a una entrada que se utilizar el valor por defecto. Sin embargo, si usted proporciona un valor
para cualquiera de las entradas del campo correspondiente en el cuadro de dilogo se va a rellenar con este valor
cuando se pulsa el botn VST.

Presets

La mayora de los plugins VST incluyen un conjunto de datos preestablecido


que puede utilizar para abrir al instante colecciones de ajustes de los
parmetros.
FlowStone incluye soporte para presets.
Todos los controles estndar (botones, deslizadores, etc.) ya contienen
componentes para el almacenamiento y los datos preestablecidos.
Para hacer uso de todo esto lo que necesita hacer es agregar un componente
Gestor de ajustes preestablecidos dentro de tu mdulo plugin.

- 112 -

EXPORTING

Preset Manager module


...with properties open

Utilice las propiedades Gestor de ajustes preestablecidos para establecer el nmero total de programas, sus
nombres y si los datos de preajuste debe estar cerrada o no. Cuando presets estn bloqueados todos los
cambios que realice en ellos se pierden al cambiar de programa - esto se aplica a los plugins de exportacin,
as como en el interior SynthMaker.

Timing Info
Algunos plugins VST dependen de la informacin que se enva desde la aplicacin host en el que se est utilizando.
Los ejemplos tpicos son la frecuencia de muestreo, el tempo y si el secuenciador est jugando. Usted puede
obtener acceso a dicha informacin a travs de componentes especiales. Estos componentes son:
Sample Rate, Tempo, Time Signature, Delay Compensation, Is Playing, Bar Start Position, Sample
Position, PPQ Position, VST Editor Open.
Para obtener informacin sobre cmo funcionan, por favor consulte la gua de referencia de los
componentes ..

- 113 -

CHAPTER 7

7 Advanced GUI
Editing
THE

GUI COMPONENTS AND HOW TO USE THEM

- 114 -

ADVANCED GUI EDICION

Module GUI
En el captulo Mdulos aprendimos cmo habilitar el panel frontal de un
mdulo, agregar elementos a ella y moverse a su alrededor. Utilizamos
deslizadores, perillas e interruptores de la caja de herramientas.
Son ellos mismos los mdulos pero sus paneles frontales se construyen
utilizando componentes GUI.
En este captulo se ver cmo crear sus propios paneles frontales con los
componentes GUI. Trabajar a este nivel tienes un control completo sobre
todos los detalles de cmo su panel frontal se ve y se comporta.
Module GUI Componentes
Ya hemos visto que el punto de partida para cualquier GUI en FlowStone es un mdulo. Los mdulos
proporcionan la base sobre la que una interfaz grfica de usuario se puede construir a travs de su panel
frontal. Puede activar el panel frontal pulsando el botn G en el panel de accin.
Sin embargo, si desea utilizar los componentes GUI es necesario tener acceso al panel dentro de su
esquema y esto se hace a travs del componente de interfaz grfica de usuario del mdulo (o MGUI para
abreviar)

- 115 -

CHAPTER 7

Cree un nuevo mdulo a continuacin, colocar un componente MGUI interior.


Usted puede encontrar el componente MGUI bajo
el grupo del filtro del mdulo en la caja de herramientas.

Si se muda de nuevo a un nivel superior usted ver que el mdulo ahora se ve un


poco diferente. Ahora cuenta con un panel frontal, aunque con nada en l. Puede
cambiar el tamao del mdulo para que el panel ms grande o ms pequeo. Tambin
puede observar que el botn G se ha eliminado desde el panel de acciones.
MGUI Connectors
Toda la informacin se enva a travs de GUI Ver conectores.
Estos son los crculos de color amarillo con una V en el
centro.
El MGUI tiene uno Ver salida. Cualquier cosa conectada a
esta podr dibujar en el panel frontal o manejar mensajes de
ratn de la misma.
View maneja todos los mensajes de dibujo y de ratn
Las dos salidas de flotador se pueden utilizar para obtener el
tamao del panel frontal si esto es necesario.
Por el momento slo se necesita saber acerca de los conectores de
salida. Los conectores de entrada que entran en juego cuando las cosas
empiezan a ponerse ms avanzada. Cubriremos esto en una seccin
posterior.

- 116 -

ADVANCED GUI EDICION

GUI Connector Types


Los componentes GUI introducen un nuevo conjunto de tipos de datos.
Cada tipo tiene su propio conector y cada conector tiene su propio
smbolo. Sin embargo, los smbolos tienen el crculo amarillo en comn
para demostrar que son GUI relacionados.
Vimos esto por primera vez en el captulo sobre los tipos de
datos:
View transporta toda la informacin de dibujo y el ratn
Area se define mediante las coordenadas de la esquina superior izquierda, una anchura y una altura
Mouse mouse events (left button up/down, mouse move etc.)
Colour in argb format (a is the transparency level)
Pen for drawing lines defined by colour, thickness and style
Font font information comprising typeface, size and style
String Format informacin de alineacin para dibujar texto
Bitmap 32bit image
Point Array an array of points (floating point pairs)
Bitmap Array an array of bitmaps

- 117 -

CHAPTER 7

Coordinate System
FlowStone utiliza un sistema de red de componentes de
posicin.
Exactamente el mismo sistema de red es utilizada por la gran
mayora de los componentes GUI para dibujar y para los
eventos de ratn.
El sistema de la rejilla es de punto flotante con base para que
pueda tener fracciones de un cuadrado de la cuadrcula.
Esto permite un posicionamiento ms preciso de elementos
de dibujo.
Por supuesto, no hay manera de obviar el hecho de que la
pantalla utiliza pxeles y que stos forman una rejilla discreta de
puntos. Pero mediante el uso de tcnicas especiales de
representacin, FlowStone puede todava exhibir grficos como
si estuvieran en una superficie continua.

Working in Pixels
A veces es necesario trabajar en pxeles en lugar de cuadrculas.
Para hacer esto usted puede hacer uso de la plaza de Grid para
pxeles y pxeles de componentes cuadrcula para moverse entre
los dos sistemas.

- 118 -

ADVANCED GUI EDICION

Drawing
En esta seccin se describe cmo dibujar usando los componentes GUI.
Con la introduccin del componente de Ruby que ahora tambin puede
dibujar con cdigo Ruby.
Esta es ahora la forma recomendada de dibujo en FlowStone.
Para ms detalles vea la seccin Dibujo en el captulo Rub
componentes.

Drawing on a Panel
Sobre la base de un panel frontal es una simple cuestin de elegir un dibujo primitivo
y la conexin de la salida de Vista de la MGUI a la entrada Vista de la primitiva.
Todas las primitivas de dibujo se pueden encontrar mediante la seleccin del grupo
de filtros GUI. Hay primitivas para dibujar lneas, rectngulos, textos, mapas de bits
y mucho ms.
El siguiente ejemplo muestra cmo dibujar un simple rectngulo relleno. Hemos
utilizado un pequeo atajo para especificar el rea del rectngulo. Esto hace que el
uso de un componente de cadena para especificar la x, y, anchura y altura que
definen el rea. El color se define mediante el componente de color.

- 119 -

CHAPTER 7

Dibujando en
orden
A menudo, usted va a dibujar ms de un elemento en un panel frontal. Si dos elementos se superponen a
continuacin, el que es el ltimo en el orden de vnculos se mostrar ltimo y por lo tanto sobre la parte
superior del otro elemento.
El siguiente ejemplo muestra esto. El rectngulo naranja est en el segundo eslabn de la MGUI
(ver Links para mucho ms, en orden de vnculos). Por tanto, el rectngulo naranja se har
efectivo en la parte superior de la roja.

- 120 -

ADVANCED GUI EDICION

Chaining GUI Components


La mayora de los componentes GUI tienen un conector de salida de la vista. Esto permite que
otros componentes GUI para vincularse a ellos para las cadenas de elementos grficos, se
puedan crear.
El siguiente ejemplo muestra cmo se hace esto. El efecto en el orden de enlace es el siguiente: se
toma el enlace para el rectngulo rojo en primer lugar seguido por los enlaces desde su conector de
salida. Entonces es hora de volver al siguiente eslabn de la MGUI etc. En este ejemplo, el rectngulo
rojo se elaborar bajo la azul que sera entonces bajo la naranja.

- 121 -

CHAPTER 7

Mouse Handling
Esta seccin describe cmo manejar la interaccin del ratn usando los
componentes de Ratn. Con la introduccin del componente de Ruby ahora
tambin puedes hacerlo utilizando el cdigo Ruby. Para ms detalles vase
la seccin Interaccin en el captulo Rub componentes.

Mouse Area
Para recibir mensajes de ratn en una parte de su
panel frontal primero debe definir una zona de ratn.
Esto se hace usando el componente de rea de ratn.
El siguiente ejemplo muestra cmo la mitad derecha de un
mdulo se puede hacer para recibir mensajes de ratn.
Esto se indica por un cambio en el cursor como el puntero
del ratn pasa sobre el rea de ratn.

Mouse Clicks

Para atrapar los clics del ratn en una zona ratn se necesita
un componente de ratn L-Button Down. Vincular el conector
de salida del ratn sobre el componente Zona de ratn para la
entrada en el componente de ratn L-Button Down.

- 122 -

ADVANCED GUI EDICION

Cada vez que se hace clic en el rea del ratn un disparador se enviar
a la salida de disparo en el ratn L-Button Down. Las coordenadas del
punto de clic (en cuadrculas) estarn disponibles a partir de las dos
salidas de flotador.

Mouse
Arrastrando

Puede hacer un seguimiento de la posicin del ratn, mientras que el botn izquierdo
del ratn se mantenga pulsado. Esto le permite implementar operaciones de arrastre.

El componente que tiene que hacer es arrastrar el componente Mouse. Esto toma los
mensajes del ratn en l es de entrada y enva las coordenadas a sus dos salidas de flotador
mientras arrastra.
El ejemplo siguiente muestra cmo el componente de arrastre del ratn se puede utilizar para
cambiar el tamao de un rectngulo. Hemos creado nuestro propio mdulo de rectngulo
para manejar el dibujo en este ejemplo.
Esto hace que el esquema un poco ms ordenado.

- 123 -

CHAPTER 7

Movimientos de
Mouse
Tambin puede realizar un seguimiento del ratn mientras se mueve a travs de una zona de
ratn. Esto se hace mediante el movimiento del ratn componente.
Antes de poder utilizar esta necesita habilitar mensajes de mover el ratn en el componente MGUI
apropiado. Mensajes de movimiento del ratn estn desactivados por defecto para reducir los
gastos generales de funcionamiento innecesarios.

Trate de reemplazar el componente Arrastrar ratn en el ejemplo anterior


con un componente de movimiento del ratn y vers cmo funciona esto.

Drag
Accumulate

El componente Drag Mouse es un poco demasiado de bajo nivel para algunas tareas. Si desea
crear un control deslizante o cualquier cosa con las piezas que se pueden arrastrar alrededor se
mueve, entonces es mucho ms fcil de utilizar un componente Drag Acumula.

Drag Acumula componentes gestionan la mayor parte del trabajo de campo de las operaciones de
arrastre para usted. Hay tres variedades: X, Y y XY.
El Drag Y Acumula y gestiona un parmetro que vara en un rango determinado. Al arrastrar el ratn, el
desplazamiento desde el punto en el que ha hecho clic se mantiene por el componente. A medida que contine
arrastrando el parmetro se actualiza de acuerdo con la posicin Y del ratn y un valor de escala que se pueden
especificar.

- 124 -

ADVANCED GUI EDICION

Si usted tiene una mirada en el interior del mdulo de Knob mapa de bits en la caja de
herramientas podrs ver cmo el YDrag se utiliza y Acumula componentes.
Puede moverse a travs de los siguientes mdulos:
Bitmap Knob\Knob\Interaction\Knob\Control\Moving Part\Knob Control
Echa un vistazo en el interior del Knob y vers el YDrag que Acumula en el medio.
El cuadro siguiente explica lo que est pasando.

- 125 -

CHAPTER 7

Redrawing

Redraw Control
Si cambia una propiedad de un elemento de dibujo durante una operacin de ratn como
arrastrar, a menudo se desea que los cambios se reflejan inmediatamente en el panel
frontal del mdulo.
Para permitir la mxima flexibilidad FlowStone le permite controlar cuando se vuelven a
dibujar las partes del panel frontal. En el ejemplo arrastra rectngulo se utiliz el tipo ms
simple de redibujado - slo obligados todo el panel para actualizar. Esto se hizo mediante
el componente Redibujar.
Si nos fijamos en el interior del mdulo del rectngulo vers el componente Redibujar.
Cuando el componente recibe un disparo que enva un mensaje de vuelta a travs de los
enlaces a Ver la primera MGUI que encuentra. Cuando el MGUI recibe el mensaje vuelve
a dibujar todo lo que contiene el panel delantero.

Precision Redraws
Redibujar todo el panel cada vez que puede ser lento cuando el rea es
grande (intente cambiar el tamao del mdulo en el ejemplo anterior para que
sea muy grande - se dar cuenta de que el arrastre se vuelve lento).

A menudo, slo una pequea rea del panel est cambiando a la vez, as que
es mucho ms eficiente para volver a dibujar slo la parte que ha cambiado.
Para ello contamos con el componente Redibujar Area. Esto funciona
exactamente de la misma manera que el componente Redibujar excepto que
slo vuelve a dibujar el rea que usted proporciona a su zona de entrada.

- 126 -

ADVANCED GUI EDICION


Hemos modificado el ejemplo arrastra rectngulo por lo que utiliza el componente
Redibujar rea. Por desgracia no es slo un simple caso de la vinculacin del rea
del rectngulo al componente Redibujar rea. Esto se debe a la zona antes de que
el ltimo movimiento del ratn pueda ser necesario volver a dibujar tambin. Lo
que necesitamos es el rea combinada de los antiguos y los nuevos rectngulos.

Para este ejemplo hemos creado un mdulo que se encarga de la conservacin de la zona antigua y su
combinacin con la nueva rea. Esta utiliza una muestra de rea y Hold para mantener el viejo rea para
cuando se necesita.

- 127 -

CHAPTER 8

8 Ruby
Componentes
A WORLD OF POSSIBILITIES

- 128 -

RUBY COMPONENTES

Introduccin
El componente de Ruby es, con mucho, el componente ms flexible en
la caja de herramientas FlowStone. Encapsula el lenguaje completo
Ruby, que permite pasar de los datos a travs de un sistema de
eventos precisa eficiente del tiempo y se integra plenamente con
FlowStone desencaden tipos de datos, eventos de ratn y grficos.
El componente de Ruby puede ser utilizado para cualquier cosa, desde
simples ecuaciones a las bibliotecas de clases complejos, la interaccin
del usuario y procesamiento de grficos. Realmente se abrir un
mundo de posibilidades.
Para el resto de este captulo se asume un conocimiento bsico del
lenguaje Ruby que no est cubierto en esta gua. Si desea una gran
http://www.ruby-doc.org/docs/ProgrammingRuby

Overview

El componente de Ruby se divide en dos mitades. En la parte superior es


el Editor de cdigo. Haga clic aqu y escriba su cdigo Ruby.
A continuacin el editor es el Panel de salida. Esta rea muestra los
mensajes de error, la salida de cdigo evaluado y valores de datos vistos.
Puede cambiar el tamao relativo de las reas del Editor y salida
arrastrando la barra separadora.
El botn On / Off se puede utilizar para evitar que el cdigo Ruby de ser
evaluado. Esto puede ser til si se desea escribir cdigo que podra
generar inestabilidad mientras se escribe en (bucles while son un
Code
Editor
ejemplo
de
ello).

On/Off Button

Output Pane

- 129 -

CHAPTER 8

Entradas y Salidas
El componente de Ruby puede interactuar con la mayora de otros tipos de datos
provocados en FlowStone. Por defecto, el componente tiene una entrada y una salida de
cadena de cuerda.

Aadiendo o Removiendo
Para cambiar el nmero de entradas y salidas slo haga clic y arrastre los
controladores bajo los conectores inferiores mayora.

Drag handle down to add more


connectors or up to remove them

Cambiar el
tipo
Para cambiar el tipo de un conector en particular, simplemente haga clic

derecho en el conector y elegir el tipo en el men resultante. Esto es similar


a la forma en que se puede establecer el tipo de mdulo de entrada o salida.

- 130 -

RUBY COMPONENTES

Insertando, Quitando y Moviendo


Si usted no quiere molestar a la configuracin de los conectores que ya tienes
a continuacin, puede aadir o eliminar en un punto especfico.
Estas operaciones se realizan con un clic derecho sobre un conector. El men
del botn derecho tiene una serie de botones en la parte inferior para borrar o

- agrega un nuevo conector de debajo de la que ha hecho clic en


- elimina el conector que ha hecho clic
- mueve el conector hacia arriba un solo lugar con el fin
- mueve el conector hacia abajo un solo lugar con el fin

Nombrando
Para cambiar el tipo de un conector en particular, simplemente haga clic derecho en el conector y
elegir el tipo en el men resultante. Esto es similar a la forma en que se puede establecer el tipo
de mdulo de entrada o salida..
Hay dos maneras de aadir etiquetas de los conectores. En primer lugar usted puede hacer clic derecho
en el conector y, a continuacin, haga clic en el botn N.
- abre un cuadro de edicin en el lugar donde se puede nombrar o cambiar el nombre del
conector
Escriba el nombre en el cuadro de edicin resultante y pulse la tecla Retorno.

Otra forma de nombrar los conectores es seleccionar primero el


componente de Ruby a continuacin, mantenga la tecla CTRL y pase el
ratn cerca del conector cuya etiqueta que desea editar. Un cursor I-Beam
aparecer junto a un borde del cuadro de texto.
Haga clic en el cuadro de texto, escriba el nombre y pulse Enter.
Si desea configurar varias etiquetas a la vez simple tabulacin entre las
etiquetas en vez de golpear la tecla de retorno. Si un conector ya tiene una
etiqueta que puede utilizar los mismos mtodos que antes para editarlo.
- 131 -

CHAPTER 8

Editor Bsico de Cdigos


El editor de cdigo es donde toda la accin sucede. Esto es donde se
escribe el cdigo Ruby, que lo procesa los datos de entrada y enviar ningn
resultado a la salida (s).
El editor tiene coloreado de sintaxis para hacer el cdigo ms legible. Es
compatible con todas las operaciones que usted esperara incluyendo
cortar, copiar y pegar, barras de desplazamiento automtico y rueda de
desplazamiento del ratn.
Hemos utilizado el hecho de que Ruby es un lenguaje extensible para
implementar una serie de clases y palabras clave especficas Flowstone.
Tambin hemos definido un conjunto de mtodos que se pueden
implementar en su cdigo para que con ms fuerza se puede integrar con
FlowStone.
El resto de esta seccin se supone que sabe lo que Ruby es y tener un
conocimiento bsico de lo que es una clase de Ruby, el mtodo y la variable
El Panel de salida
es.
Antes de entrar en el quid de la cuestin, una charla del Panel de
salida.
El editor de cdigo y panel de salida trabajan juntos.
Cualquier error o salida desde el cdigo que escribe en el editor se
muestran en el panel de salida. Por ejemplo, puede escribir
cualquier expresin matemtica vlida en el componente de Rub y
el resultado evaluado se muestra en el panel de salida..

El ejemplo anterior muestra 10 como el resultado de 2*3+4.

- 132 -

RUBY COMPONENTES

Escriba una expresin vlida o cualquier sintaxis


que provoca un error y te sale un mensaje de
error en lugar.
Tenga en cuenta slo se muestra el primer error
encontrado.

Como se puede ver, se muestra el mensaje de error en rojo para diferenciarlo de


salida evaluada.
Tenga en cuenta los mensajes de error vienen directamente de la intrprete de
Ruby.
A veces pueden parecer ajenas al error. Sin embargo, el componente de Rub
evala su cdigo mientras est escribiendo lo que si un error hace estallar para
arriba usted sabr exactamente lo que lo caus
Una ltima cosa a destacar es el panel de salida slo muestra el valor de la
expresin ltima evaluada. Tome los siguientes ejemplos:

En el componente de la izquierda se evala la primera


expresin, seguida por la segunda expresin. El segundo es el
ltimo y por lo que este se enva al panel de salida.
En el componente de la derecha pasa lo mismo. Sin embargo,
con el fin de mostrar que la primera expresin de hecho se
vuelve a evaluar hemos asignado su resultado a una variable (x)
y luego se usa esta expresin en el segundo.
Ahora sabemos lo suficiente sobre el Panel de salida para
proceder a las cosas ms emocionantes.

- 133 -

CHAPTER 8

Clase de edicin Ruby


Cada componente de Ruby est representado por una instancia de la clase RubyEdit.
Esta es una clase que hemos definido en FlowStone para representar el componente de
Ruby.
Hemos definido los mtodos y variables de instancia que le permiten comunicarse con el
componente. Estos proporcionan la interfaz entre el cdigo Ruby y FlowStone

Al escribir " Self " en el componente de Rub devolver la instancia de la clase


RubyEdit que representa ese componente. En el ejemplo anterior se puede ver la
representacin de instancia en el panel de salida. Tambin puede utilizar la variable
de instancia @ esta en lugar de " Self".
Todo el cdigo que escriba en un componente de Ruby se ejecuta en el contexto del
objeto RubyEdit que lo representa.
Input Data

Los datos que llega a un componente de Ruby se almacena en una variable de


instancia llamada @ins. Se trata de un conjunto de rubes y almacena el ltimo valor
para llegar a cada entrada.
Usted puede ver esto simplemente escribiendo en el componente. Tenga en cuenta
que las variables de instancia son de color oro en el editor de cdigo.

Para acceder al valor en cualquier entrada de utilizar la matriz de referencia del


elemento de Ruby []. Los valores son cero indexados as que para obtener el valor
en el uso de la segunda entrada @ins [1].

Es bastante comn tener slo una entrada por lo que hemos aadido otra variable de
instancia llamada @ en que hace referencia a este primer valor de entrada directa.

- 134 -

RUBY COMPONENTES

Introducir etiquetas
Si establece una etiqueta para su entrada y luego esto se traduce
automticamente en una variable de instancia, se puede utilizar
dentro de su cdigo de Ruby.

Tenga en cuenta que a medida que la variable es una variable de instancia


debe estar precedido por el smbolo @

Output Data (Salida de Datos)


Adems de recibir los datos de FlowStone por supuesto puede enviar datos a cabo.
Para ello utilice el mtodo de salida.

Tenga en cuenta que la salida no es una palabra clave, es un mtodo de la clase RubyEdit. Por lo
general, debe invocar un mtodo en un objeto. Sin embargo, en el caso del componente de Ruby
se evala todo el cdigo en el contexto de la instancia RubyEdit que lo representa.
Se puede escribir con la misma facilidad self.output y se obtendra el
mismo resultado.

Por esta razn, la clase de mtodos de RubyEdit se muestran en prpura para que
pueda distinguirlos de palabras clave Ruby (que a su vez muestran en azul) y los
mtodos heredados (que muestran en negro).

- 135 -

CHAPTER 8

Especificacin de una salida


En el ejemplo anterior no se ha especificado de salida y por lo que el resultado se enva a la
primera salida. Si desea especificar una salida en particular, entonces usted agrega esto
como la primera entrada para el mtodo de salida.
El valor puede ser el ndice de un conector de salida (a partir de cero), como se muestra a
continuacin

O puede ser la etiqueta de un conector de salida si se ha


especificado:

Almacenamiento de
salidas
Del mismo modo que los datos de entrada se almacena en una matriz de
Rub hacemos lo mismo para los datos de salida. El ltimo valor enviado a
una salida se almacena en una matriz denominada @outs.
Puede inspeccionar el contenido de esta matriz de la misma manera como
para la matriz de entradas. Esto puede ser til cuando se depura.

Usted puede cambiar el contenido de la matriz @outs. Esto puede ser til si
usted desea cambiar un valor en una salida sin enviar un evento o gatillo. El
valor se puede leer por otros componentes que se conectan a la salida.

- 136 -

RUBY COMPONENTES

Esto puede ser muy til si tiene datos de eventos se ejecutan a un ritmo
elevado y quiere leerlo a travs de datos provocadas a una tasa ms baja.
El ejemplo anterior muestra un Tick25 se utiliza para leer la salida a 25Hz
independientemente de la velocidad de cambio del valor en el interior del
componente de rubes.

- 137 -

CHAPTER 8

The event Method


Como hemos mencionado anteriormente, el componente de Rub evala
su cdigo a medida que escribe.
Si el cdigo contiene expresiones (a diferencia de las declaraciones o
definiciones), entonces stas se ejecutan y el ltimo resultado se muestra
en el panel de Salida.
Fuera del editor de cdigo tambin se ejecutar cada vez que los datos
llegan a una entrada. Esto le permite utilizar el componente de Rub para
el procesamiento de datos.
Todo esto es muy til, pero qu pasa si usted quiere dar respuesta a los
datos recibidos en una entrada diferente a los datos recibidos en otro?

Definicin de
Mtodos
Para datos ms avanzados de manipulacin se puede definir un mtodo de
evento. Este es un mtodo especial que FlowStone busca cada vez que
recibe datos en una entrada.
El mtodo de evento puede tener hasta 3 parmetros de
entrada
:

i
Hace referencia a la entrada a la que llegaron
los
datos

v
Valor
que lleg a la entrada

Tiempo a la que llegaron los datos (tiempo esquemtico en segundos)

Usted puede tener "0,1,2", o todos en "3" parmetros de entrada, pero debe agregar en el orden. As, por
ejemplo, puede no tener parmetros o puede tener la "i" por s mismo o "i" y "v" o "i" y "v" y "t", pero usted
puede no tener "v" en su cuenta o "i" y "t" y sin "v". Ms sobre "t" en la siguiente seccin, nos centraremos
en "i" y "v" por ahora.

El ejemplo anterior muestra cmo se defina un mtodo de evento que actuara como
una "muestra y mantener '. Los datos que llegan a la primera entrada se almacena.
Cualquier disparo en la segunda entrada se traduce en el ltimo valor de ser enviados.
- 138 -

RUBY COMPONENTES

Si no suministrar entrada AV y slo tienen una referencia conector entonces no se pasar ningn dato.
El mtodo de evento todava se llama cuando los datos llegan a cualquiera de las entradas.
Usted sabr qu entrada provoc que simplemente no llegaran datos.
Tenga en cuenta que usted puede nombrar a los parmetros de entrada como guste, no tienes que
usar i, v y t. Sin embargo, el nombre del mtodo debe ser siempre de eventos ya que FlowStone lo
estar buscando.

Referenciacin de Conector
Se podra pensar que el parmetro de referencia del conector que se pasa al mtodo de
evento es un valor entero, pero es en realidad una instancia de la clase
RubyEditConnector.
Los objetos de esta clase pueden ser tratados como ndices enteros cuando se utiliza en
una situacin de comparacin. Sin embargo, debajo de la capilla de la clase no slo
encapsula el ndice conector sino tambin cualquier etiqueta del conector que puede haber
asignado.
Hemos aadido las anulaciones de los operadores de comparacin estndar para la clase
RubyEditConnector lo que significa que, adems de la comparacin con los valores enteros en el
mtodo de evento tambin se puede comparar directamente con una cadena.

El ejemplo anterior mostr la forma en que se puede utilizar para comparar con un
nmero entero. En comparacin con una cadena (si tiene una etiqueta para el conector)
es exactamente el mismo:

Comparacin trabajar en las declaraciones de caso tambin. Tambin puede usar


cualquiera de los operadores de desigualdad.
Las operaciones matemticas tambin se pueden realizar en el objeto RubyEditConnector,
devuelven un resultado entero.

Si necesita usted puede tener acceso al ndice individual o el nombre de un objeto


RubyEditConnector utilizando el ndice y los mtodos de nombres.

- 139 -

CHAPTER 8

Efecto sobre la ejecucin


Si proporciona
un mtodo de evento, entonces cualquier cdigo que
de
cdigo
define fuera del mtodo dejar de ejecutar cuando una entrada
cambia.
El ejemplo siguiente muestra un mtodo de evento, que simplemente
muestra el valor ms reciente recibida.

Antes de aadir este mtodo, el cdigo restante habra ejecutado cada vez que
cualquiera de las entradas ha cambiado lo que resulta en la suma de las entradas
que se envan a la salida. No obstante, con el mtodo de evento en lugar FlowStone
ejecuta este mtodo en lugar y hace caso omiso de cualquier otro cdigo.

- 140 -

RUBY COMPONENTES

Programacin de
eventos
Usted puede recordar de los tipos de datos y la seccin de flujo de seal que, a diferencia
de los datos disparada que se enva de inmediato, los datos de eventos pueden ser
programados para ser enviado en algn momento en el futuro.
Para ello cuenta con un esquema de un reloj. El reloj es el tiempo transcurrido, en
segundos del mundo real, que comienza cuando el esquema est cargado o creado.
El reloj no representa un tiempo de das, es simplemente un contador que aumenta
continuamente.

Programacin de una cita


Para programar un evento que necesita para proporcionar un sello de tiempo al enviar los datos
a una salida. Esto tiene que ser suministrado como un tercer parmetro de entrada cuando se
utiliza el mtodo de salida.
La marca de tiempo casi siempre ser un desplazamiento desde la hora actual. Usted puede
obtener el tiempo de dos maneras diferentes dependiendo de donde se realiza la llamada.

Desde cualquier lugar se puede utilizar el mtodo de tiempo. Si usted est en el mtodo
de evento y luego si se define con entradas de referencia de entrada, valor y tiempo que
a continuacin, tendr el tiempo pas a usted a travs del parmetro de entrada el
tiempo.

El evento se enva a la cola de eventos y slo se enviar a travs


de la salida designado cuando se alcanza la hora del reloj de la
marca de tiempo de eventos.
El siguiente ejemplo muestra cmo programar un evento desde dentro de un mtodo de
evento usando el parmetro de entrada el tiempo.

- 141 -

CHAPTER 8

Enviando a una
Puede enviar eventos a la misma componente de Ruby al enviarlos a una entrada. Esto es til si desea
entrada
crear una cita repetitiva o realizar una operacin recursiva
.

Para ello se utiliza el mtodo de entrada. Esto funciona exactamente de la misma manera que
el mtodo de salida, pero, por supuesto, la referencia del conector se refiere a la entrada a la
que desea enviar el caso a la vez.

El ejemplo anterior crea un contador que se mueve en una segunda etapa


y contina sin fin.
Tenga en cuenta que, al igual que para el mtodo de salida, puede utilizar
una etiqueta de conector en lugar de un ndice para identificar dnde
desea enviar un valor a.

Borrando Eventos
Una vez que se enva un evento que va en la cola de eventos y espera hasta que su tiempo viene a ser
ejecutado.

Si usted est programando eventos que ocurren en algn momento del


futuro, a veces es posible que desee evitar que suceda.
Usted puede hacer esto utilizando el mtodo clearEvents.
Esto eliminar todos los eventos pendientes para ese componente
particular de rubes de la cola de eventos.

- 142 -

RUBY COMPONENT

Clock
Accuracy
El
reloj esquemtica funciona a 100 Hz. A diferencia de los componentes que no
son Tick tiempo preciso debido a su uso de temporizadores de Windows, el sistema
de Eventos utiliza un temporizador diferente que es mucho ms precisa de modo
que cada garrapata 10 milisegundos debe producirse en el momento preciso.
Si usted tiene alguna de las primitivas DirectSound o ASIO en su esquema y estos
se encienden entonces el reloj cambiar automticamente a funcionar en sincrona
con el procesamiento de audio.
A continuacin, puede programar eventos que se produzcan con la muestra de la
sincronizacin exacta dentro de cualquier trama de audio.

- 143 -

CHAPTER 8

Ruby Valores
A principios de esta gua hablamos del tipo de conector Rub Valor.
Esto se utiliza para pasar datos de un componente de Ruby a otro.
Es un concepto muy simple, pero como vers, tambin es
increblemente poderosa, ya que le da la flexibilidad para definir y
utilizar sus propios tipos de datos.
Empezaremos con un breve recordatorio de lo que un valor Ruby es.

Tipos de Valores de Ruby


En Ruby todos los datos se considera como un objeto. Los nmeros son objetos, las cadenas
son objetos, las matrices son objetos - todo es un objeto. Cada objeto es una instancia de
alguna clase. Por ejemplo, un objeto entero es una instancia de la clase Fixnum y una matriz
es una instancia de la clase Array.
Algunas clases son subclases de una clase padre.
Fixnum por ejemplo, es una subclase de la clase Integer. Esos superclases pueden ellos mismos ser
subclases de otra clase. Un aspecto clave de Ruby es que no importa cuntas superclases son todos ellos
terminan en una clase base comn llamada Object. As que todos los datos son, de hecho, una instancia de
la clase Object y, como tal, se puede considerar todos tienen el mismo tipo de base comn.

Cuando se hace referencia al rub datos de esta forma comn que llamamos un valor.
Como tal, cuando se pasa objetos de Ruby entre los componentes de Ruby se les
pase a travs del conector Valor Rub
Value puede referirse a cualquier objeto

de Ruby

Pasando valores de Ruby


Valores de Ruby pueden pasar de uno a otro componente de Ruby. Los datos
se transfieren mediante el sistema de eventos que hemos hablado antes.
Porque todo en Ruby es un objeto que puede pasar lo que quieras entre los
componentes. Esto abre muchas posibilidades.

- 144 -

RUBY COMPONENT

Por ejemplo, FlowStone tiene componentes de autobuses que se utilizan para pasar colecciones de datos en
torno a travs de un solo conector. El conector Valor Ruby puede actuar como un autobs al pasar un hash de
Ruby (una coleccin de pares de datos y de cadena).
El siguiente ejemplo muestra cmo un autobs se puede crear con el componente de Ruby.

Por supuesto que puede ser an ms inteligente que eso. En el ejemplo anterior que estbamos pasando un hash de
Ruby. Sin embargo, podemos pasar a lo que queramos. As que podemos crear nuestra propia clase, con sus propios
datos y transmitir eso.

- 145 -

CHAPTER 8

El siguiente ejemplo muestra una clase RobotArm diseado para modelar un brazo de enlace de mltiples robots.
Esto se est poniendo bastante avanzada, pero ahora se puede ver que las opciones para la ampliacin de los tipos de
datos que se pasan alrededor son casi ilimitadas.

- 146 -

RUBY COMPONENT

Persistencia
El componente de Rub guarda su estado. Si guarda un esquema con un componente de
Ruby en l, entonces cuando se carga de nuevo las @ins y @outs arrays se restauran
exactamente como estaban antes. Esto asegura que el componente mantiene su estado en
todo momento.
La nica excepcin a esto es bitmaps. Debido a que los mapas de bits pueden ser muy
grandes estos no se guardan automticamente como parte de los arreglos de entrada y de
salida. Si desea restaurar un mapa de bits despus de usar la carga Despus de
componente Load desencadenar una actualizacin de cualquier mapa de bits de entrada.
Adems es posible que desee agregar un componente Despus Duplicate tambin, as que
el mapa de bits se actualiza al copiar y pegar.

Administracin del Estado de


Usuario
Si usted tiene sus propios datos que desee guardar con un componente de Ruby,
entonces puede implementar los mtodos saveState y LoadState:
def loadState v
end
def saveState
end
La forma en que esto funciona es muy simple. En el mtodo saveState de devolver
un objeto Ruby que encapsula todos los datos que desea guardar. Puede ser una
cadena o una matriz decir si usted tiene un montn de datos o simplemente podra
ser un valor simple.

- 147 -

CHAPTER 8
Al guardar su esquema del mtodo saveState es llamado por FlowStone y el estado de su
componente de Ruby se guarda tambin.
Al abrir su esquema nuevo FlowStone llama al mtodo loadState y lo pasa los datos
devueltos en el mtodo saveState. Todo lo que necesitas hacer es utilizar estos
datos para restaurar el estado de un componente nuevo a la forma en que fue.
He aqu un pequeo ejemplo de cmo funciona esto. Se muestra un contador que
mantiene su valor actual cuando se guarda:

Si tiene varios valores que desea guardar y restaurar a continuacin, la forma ms fcil para hacer frente a estos es
ponerlos en una matriz y volver que en saveState. Digamos que usted tiene variables @x, @y, @name.
Aqu hay un cdigo de ejemplo que podra salvar y restaurar los siguientes:

En loadState usamos la sintaxis Rubys para asignar variables para elementos consecutivos de una matriz.
@x, @y, @name = v

is equivalent to:

@x = v[0]; @y = v[1]; @name = v[2];

Al utilizar este mtodo, siempre asegrese de mantener el mismo orden de las variables en su
mtodos loadstate y saveState o te pueden conseguir algunos resultados extraos.

- 148 -

RUBY COMPONENT

Debugging
FlowStone est diseado para facilitar la programacin. Sin embargo, nunca
puede ser a toda prueba y por lo que en algn momento usted est obligado a
encontrarse frente a errores que haya que rascarse la cabeza.
Este objetivo de esta seccin es proporcionar informacin, consejos y
sugerencias que se espera que el proceso de depuracin y mucho menos de un
dolor de cabeza.

Error Reporting
La primera cosa que usted necesita saber cuando usted tiene un error es donde est. Como ya comentamos camino de
vuelta cerca del inicio de todo este captulo, el componente de Rub evala su cdigo mientras escribe. Si se produce un
error, se muestra inmediatamente en el panel de salida.

Esperemos que esto le ayudar a eliminar la mayora de los problemas de forma inmediata cuando
se producen.
Hay algunas situaciones en las que los errores no son reportados inmediatamente. Errores dentro de
cualquiera de los mtodos que se definen slo se mostrarn cuando se llama al mtodo. Hay
algunas excepciones a esto, pero la mayora de las veces el error slo se manifestar en la
ejecucin del mtodo.
Cuando esto sucede, usted seguir recibiendo un mensaje de error. Sin embargo, a diferencia de
cuando ests escribiendo es posible que haya movido a otra parte de su esquema y no ser capaz de
ver el componente cuando aparece el error.
Para ayudar con esto, FlowStone resalta cualquier mdulo que contiene un componente de Ruby que tiene un error.

- 149 -

CHAPTER 8

Para ayudar con esto, FlowStone resalta cualquier mdulo que contiene un componente de Ruby
que tiene un error.The watch Method

Si est depurando el cdigo es a menudo muy til ser capaz de mirar a los valores de las
variables que se ejecuta el cdigo. Usted recordar desde antes en este captulo que el valor de
la ltima expresin evaluada se muestra en el panel de salida.
Esto es muy bueno pero
si usted quiere ver un valor que se calcula antes o dentro de un mtodo?
Para ayudar con esto tenemos el mtodo del reloj. Este mtodo toma dos entradas. La primera es una
etiqueta para identificar los datos vistos en el panel de salida. El segundo parmetro de entrada es el
valor que desea mirar.
La etiqueta puede ser una cadena o un valor entero.
El ejemplo de abajo muestra cmo las coordenadas del ratn se pueden ver como el cursor se mueve a travs de la
Vista (no es que esto requiere de mensajes de mover el ratn para ser habilitado en el MGUI dentro del mdulo
- Ver la seccin de Interaccin para saber ms sobre esto).

Si lo que desea es ver rpidamente un valor de un rub Editar entonces se puede omitir la entrada de etiqueta de cadena.
Esto le mostrar con la etiqueta 'Quick Watch "en el panel de salida. Tenga en cuenta que el reloj rpida slo se mostrar
el ltimo valor enviado a l por lo que si quieres ver ms de una, ya sea poner todos los relojes de una matriz ( eg.
watch [x,y,name,pos] ) o utilizar una etiqueta para cada reloj por separado.

- 150 -

RUBY COMPONENT

Dibujo

As como el manejo de datos del componente de Rub tambin se puede utilizar para manejar
eventos de ratn y dibujar a un panel frontal. Esta seccin abarca el dibujo y la prxima interaccin
manijas ratn.
Para habilitar el componente de Ruby a dibujar a un panel frontal se necesita
aadir un conector de entrada de Vista y luego enlazar a un conector de salida
de un Vista MGUI (ya sea directamente o mediante una serie de enlaces) o de
una entrada sin hilos que se conecta a un panel frontal en un mdulo anterior.

Una vez que haya esta configuracin puede empezar a responder a las peticiones de dibujar FlowStone.

The draw Method


Para responder a las peticiones de redibujar en FlowStone tendr que definir un mtodo de sorteo.
FlowStone busca esto cada vez que un mensaje de dibujo llega a ver un conector en un
componente de Ruby.
El mtodo puede tener un parmetro de referencia de conector de entrada opcional (si va a manejar
mltiples View conectores en el mismo componente de Ruby) seguido de una parmetro View
obligatorio.
{ examples }

El parmetro View es una instancia de la clase View. Esta es una clase de


Ruby que hace referencia al panel frontal y le permite dibujar a l. Piense en
ello como la superficie de dibujo.

- 151 -

CHAPTER 8

Dibujo Clases y
Mtodos
Dibujo se realiza mediante los mtodos del objeto View que llama. Tambin hay un nmero de clases
que representan objetos de dibujo.
Todos los mtodos y clases que vamos a usar son contenedores a Microsoft de Gdi+ biblioteca de grficos.
Hay algunas variaciones menores, pero en general se asignan directamente a los mtodos y clases de Gdi+.
Hay muchos recursos en lnea dedicados a este por lo que si usted necesita ms ayuda o ejemplos que
usted debe ser capaz de mirar estas arriba y traducirlos directamente en los equivalentes de piedra variable.

Drawing Units
Antes de comenzar debemos hablar rpidamente sobre las unidades de medida que utilizamos para el dibujo.
Debido a que todo el dibujo en FlowStone es escalable, trabajamos en unidades de paso de la red y no en
pxeles (vea la seccin de Coordenadas en el captulo de avanzada interfaz grfica de usuario de edicin).
Todas las coordenadas, mediciones y tamaos estn en los pasos de la cuadrcula.

Si alguna vez tiene que saber el tamao de un cuadrado de la cuadrcula se puede llamar al mtodo
gridStep en el objeto View en cualquier momento.

Lpices, pinceles y colores


Antes de que pueda dibujar cualquier cosa que usted necesita ya sea un lpiz, un pincel o un color. Todos ellos estn
representados por las clases de Ruby. Plumas se utilizan para las lneas de dibujo y pinceles se utilizan para rellenar
reas. La clase Color se utiliza para definir los lpices y pinceles, y como insumo en otros mtodos de dibujo.

Colo
r

No se puede llegar a ninguna parte sin un color as que vamos a empezar aqu. Objetos de color se define
por tres componentes primarios de color (rojo, verde y azul), ms la transparencia opcional que se llama
Alpha (Alfa=Transparencia). Cada componente es un valor entero en thsete rango 0-255..

Para crear un objeto


Color:
myColor = Nuevo color a,r,g,b
Donde a es el alpha, r es el rojo componente, g is the verde component and b is the azul component.

Estos son algunos ejemplos de la creacin de objetos de


colores
.
c = Color.new
255,255,0,0
# an opaque red
c = Color.new
c = Color.new
c = Color.new

128,0,0,255
0,255,0
64

# a half transparent blue


# an opaque green (no transparencia)
# a dark grey (a single value is a grayscale)

X = Cualquier
Valor

Axxx. Rxxx, Gxxx. Bxxx.


AlfaX.RojoX.VerdeX.Azul
X

- 152 -

RUBY COMPONENT

Pens
En su esencia, las plumas se definen por un color y el grosor (o anchura). Tambin pueden tener un estilo de guin,
tapas de los extremos como flechas u otras formas y pueden hacer que sus articulaciones en un nmero de diferentes
maneras.
Estas son las caractersticas ms avanzadas que lo mejor es estudiarlas ms tarde.
Para crear un objeto Pen:
myPen = Pen.new color, thickness
El parmetro de color es un objeto de color que usted necesita para crear y pasar pulg de espesor es el ancho de lnea
(una vez ms en los pasos de la red, as que esto es por lo general un nmero menor que 1 para lneas ms finas).
Si usted lo necesita, usted puede conseguir el espesor o la anchura de un objeto pluma llamando al
mtodo getWidth. Tambin puede configurar el ancho utilizando el mtodo setWidth.
El color se puede ajustar mediante una llamada al mtodo setColor y pasando un objeto Color.

Brushes
Cepillos pueden ser de colores slidos, texturas o degradados. El cepillo ms simple es el pincel slido. Esto est
representado por la clase de cepillo.
Para crear un objeto Brush:
myBrush = Brush.new color

Una vez ms, el parmetro de color es un objeto de color que usted necesita para crear y pasar
pulg Al igual que con las plumas, el color se puede ajustar mediante una llamada al mtodo
setColor y pasando un objeto Color.

Basic Shapes

Usted puede dibujar un nmero de diferentes formas bsicas utilizando los mtodos de la clase View. Todos
ellos toman un instrumento de dibujo (ya sea una pluma para esquemas o un cepillo para rellenos) y luego
una serie de otros parmetros para definir la posicin y el tamao.
Los parmetros son generalmente puntos, colecciones de puntos o rectngulos. Estos son
representados por matrices de Ruby. Un punto est representado por una matriz de dos elemento
con el primer elemento es la coordenada X y el segundo es la coordenada y.
Un rectngulo est representado por una matriz de cuatro elementos. Los dos primeros elementos
son las coordenadas X e Y de la esquina superior izquierda, seguido de la anchura y la altura.
Una coleccin de puntos est representado por una matriz de dos matrices de puntos
elemento.

- 153 -

CHAPTER 8
Hay 6 mtodos de la forma:
drawRectangle instrument, rect
drawRoundRect instrument, rect, corner
drawEllipse instrument, rect
drawPie instrument, rect, startAngle, sweepAngle
drawPolygon instrument, points
drawClosedCurve instrument, points
Estos son algunos ejemplos de formas de dibujo:

El mtodo drawClosedCurve puede tomar una entrada adicional:


drawClosedCurve instrument, points, tension
La entrada de tensin determina la curvatura. Un valor de cero producir lneas rectas, un valor de
0,5 produce curvas a la curvatura normal y el aumento de las tensiones producir lneas ms curvas.

Lines and Curves


La clase View tiene un nmero de diferentes mtodos de dibujo de lnea. Todos ellos toman
una pluma como su primera entrada.
El resto de parmetros dependen del tipo de lnea. Al igual que con las formas, las matrices
de Ruby se utilizan para especificar los puntos, colecciones de puntos y rectngulos.
Hay 5 lneas mtodos de dibujo:
drawLine instrument, point1, point2
drawArc instrument, rect, startAngle, sweepAngle
drawCurve instrument, points
drawBeziers instrument, points
drawLines instrument, points

- 154 -

RUBY COMPONENT
Estos son algunos ejemplos de dibujo en la lnea de accin:

El mtodo drawCurve puede tomar dos formas adicionales:


drawCurve instrument, points, tension
drawCurve instrument, points, offset, segments, tension
La entrada de tensin determina la curvatura. Un valor de cero producir lneas rectas, un valor de
0,5 produce curvas a la curvatura normal y el aumento de las tensiones producir lneas ms curvas.
El valor de desplazamiento determina el punto en el que se iniciar el dibujo y la
entrada de los segmentos determina cuntos se dibujan los segmentos de la curva.
La imagen de abajo muestra cmo los cambios de
curvatura de las tensiones por encima y por debajo de
0,5:

- 155 -

CHAPTER 8

Graphics Paths
Un camino de grficos es una combinacin de formas y lneas que se agrupan, en secuencia
para formar un solo objeto. Caminos estn representados por la clase GraphicsPath.
Para crear una instancia de un GraphicsPath es fcil:
path = GraphicsPath.new
Despus de que llame a los mtodos del objeto GraphicsPath para agregar elementos a la trayectoria. Hay un
mtodo para cada uno de los mtodos de lnea y de forma en la clase View. Ellos toman los mismos parmetros,
excepto para la entrada de instrumento de dibujo.
Hay 5 mtodos de formas y mtodos de la lnea 5 de la siguiente manera:
addRectangle rect
addEllipse rect
addPie rect, startAngle, sweepAngle
addPolygon points
addClosedCurve points

addLine point1, point2


addArc rect, startAngle, sweepAngle
addCurve points
addBeziers points
addLines points

Tenga en cuenta que cuando se agregan elementos de lnea, lneas consecutivas


automticamente se uni a su fin y los puntos de inicio. A continuacin, puede llamar al mtodo
CloseFigure para hacer que el final de la ltima lnea de unirse con el inicio de los primeros en
formar una forma cerrada.
Los mtodos addCurve y addClosedCurve tambin pueden tomar los mismos
parmetros de entrada opcionales que los mtodos drawCurve y
drawClosedCurve toman. Vea las dos secciones anteriores para ms
informacin.
Hay un mtodo complemento adicional de la clase GraphicsPath llamado addpath. Esto
le permite aadir otro camino a la ruta. El mtodo tiene dos entradas: la ruta de acceso
que se aade y un verdadero valor / false para indicar si la ruta es para conectar a la cifra
existente (true) o ser una nueva figura en la trayectoria (false).
addPath path, connect
Una vez que haya creado un objeto GraphicsPath puede dibujar utilizando el mtodo drawPath de clase View.
Esto toma un camino y un instrumento de dibujo (lpiz o pincel) como insumos:
drawPath instrument, path

- 156 -

RUBY COMPONENT
El siguiente ejemplo muestra cmo se puede utilizar una ruta de grficos en la prctica:

Otros mtodos GraphicsPath

Usted puede obtener el rectngulo delimitador de un objeto GraphicsPath llamando al mtodo getBounds. Esto
devolver una matriz de rubes de la forma [x, y, w, h] que le da el rectngulo ms pequeo que contiene la ruta
completa.
Para ampliar la llamada ruta del mtodo ampliar:
widen pen, {optional View object}
La entrada de objeto de vista es opcional y slo sirve para proporcionar informacin de escala. La entrada de lpiz ofrece
una pluma para ensanchar el camino por. La ampliacin se realiza mediante la adicin de un esquema adicional a la ruta
como si el camino se haba dibujado en el lpiz.
Usted puede comprobar si un punto est dentro del GraphicsPath utilizando el mtodo isVisible:
isVisible point, {optional View object}
La entrada de objeto de vista es la misma que para el mtodo de ampliar. La introduccin de puntos es una matriz de dos
dimensiones Rub [x,y] para el punto que desea probar. El valor de retorno es verdadero o falso.
Tambin puede comprobar si un punto est en el esquema de un GraphicsPath utilizando el mtodo isOutlineVisible
isOutlineVisible point, pen, {optional View object}
Las dos primeras entradas son las mismas que para el mtodo de isVisible. La entrada de lpiz define la pluma que el
camino se dibuja con. El punto se prueba para ver si se encuentran en el camino trazado. obviamente
ms amplia es la pluma, es ms probable que es esto. El valor de retorno es verdadero o falso.

- 157 -

CHAPTER 8

Texto
Puede dibujar texto a una vista usando el mtodo drawString. Sin embargo, antes de
hablar de esto que vas a necesitar saber acerca de otros dos clases de dibujo.

Las Clases de Fuentes


La clase Font se define el tipo de letra que va a utilizar para la elaboracin de su texto. Deber
proporcionar el nombre del tipo de letra (esto debe ser una fuente instalada en el sistema), el tamao de la
fuente (en cuadrculas) y el estilo.

El estilo puede ser una combinacin de "normal", "bold", "italic", "underline" y "strikeout". Por ejemplo, "BoldItalic" o
"strickeout-underline". Usted puede tener espacios en las cadenas o use guiones u otros smbolos - el tiempo que las
palabras claves estn presentes, entonces FlowStone los recoger. Tambin puede utilizar un nmero entero en el rango
de 0 a 15 para especificar combinaciones de estilo como una mscara de bits. Los bits son: 1 = bold, 2= italic,
4 = underline and 8 = strikeout. As que mediante la adicin de estos juntos 1+4+8 = 13 es lo mismo que boldunderline-strikeout

He aqu un ejemplo de cmo crear un tipo de letra:


font = Font.new Arial,1.2,normal

La Clase StringFormat
La clase StringFormat define cmo se coloca el texto en relacin a su ubicacin o rectngulo delimitador. Hay
3 atributos a considerar. La alineacin determina cmo el texto se alinea horizontalmente. Hay 3 opciones:
Cerca de (izquierda), el centro (centro) o lejos (a la derecha).
Lnea de alineacin determina cmo el texto se alinea verticalmente. Hay 3 opciones aqu
tambin: cerca (arriba), el centro (centro) o lejos (abajo).
Finalmente Banderas permite especificar combinaciones de opciones ms detalladas. La entrada de
las banderas es un entero que debe ser una combinacin bit a bit de las opciones que desee.
Hay un buen nmero de opciones de modo de evitar que saturan las cosas aqu les hemos
enumerado en su totalidad al final de la siguiente seccin.
He aqu un ejemplo de cmo se puede crear un objeto StringFormat:
sf = StringFormat.new
sf.setAlignment center
sf.setLineAlignment far
sf.setFlags 4128

Drawing the Text


Ahora volvamos al mtodo drawString. Esta se define como sigue:
drawString text, font, stringFormat, location, brush

- 158 -

RUBY COMPONENT
La ubicacin puede ser un punto (un array de dos valores) o un rectngulo ( [x,y,width,height]). Si la ubicacin es un
punto de entonces todo el dibujo se hace referencia a ese punto. Si la ubicacin es un rectngulo, entonces el texto se
dibujar dentro de ese rectngulo.
He aqu un ejemplo:

El objeto StringFormat puede ser sustituido por cero en la llamada al mtodo drawString caso de que deseen ir con la
alineacin por defecto de arriba a la izquierda.

Texto de medicin
A veces tienes que ser capaz de medir la cantidad de espacio en la pantalla de un
bloque de texto representado ocupar. Para este fin existe el mtodo MeasureString:
measureString text, font, stringFormat, location
Los parmetros de entrada son los mismos que para el mtodo de cordn. Sin embargo, si la ubicacin define un
rectngulo entonces este acta como un cuadro delimitador mximo para el texto la idea de que una vez medido el
cuadro de lmite real ser menor que ste.

El mtodo drawString devuelve un hash de Ruby que contiene los siguientes elementos:
bounds

- el rectngulo delimitador que sera ocupado por el texto [x,y,w,h]

width

- la anchura de la lmites del rectngulo

height
chars

- la altura de la grada rectngulo


- el nmero de caracteres que se extrae

lines

- el nmero de filas de texto que se extrae

A Rub Hash es como una matriz, excepto que se accede a los elementos de un objeto de referencia en lugar de un
ndice de enteros (aunque se puede utilizar un ndice demasiado si lo desea). El hash devuelto por MeasureString utiliza
cadenas as que por ejemplo, si la variable de hash se llama "measure" que significa medida.
A continuacin para obtener el ancho que lo hara
utilizar la siguiente expresin:
measure[width]

- 159 -

CHAPTER 8
String Format Flags
En la seccin anterior sobre texto hablamos de banderas StringFormat. Esta seccin describe
estos en su totalidad.
Esta informacin se toma directamente de las notas de Microsoft Developer en GDI +.
Flag = 1
Especifica que el orden de lectura es de derecha a izquierda. En el texto horizontal, los
caracteres se leen de derecha a izquierda. En el texto vertical, las columnas se leen de derecha
a izquierda. De forma predeterminada, el texto horizontal o vertical se lee de izquierda a
derecha.
Flag = 2
Especifica que las lneas individuales de texto se dibujan verticalmente en el dispositivo de
visualizacin. Por defecto, las lneas de texto son horizontales, cada nueva lnea debajo de la lnea
anterior.
Flag = 4
Especifica que las partes de los personajes se les permite sobresalir de diseo rectangular de la cadena.
De forma predeterminada, los caracteres se alinean primero dentro de los lmites del rectngulo, entonces los caracteres
que todava sobresalen por encima de los lmites se vuelven a colocar para evitar cualquier saliente y con ello evitar
afectar pxeles fuera del rectngulo de diseo. Una, letra minscula italic F (f) es un ejemplo de un personaje que puede
tener
partes sobresalientes. Establecer esta bandera se asegura de que el personaje se alinea visualmente con las lneas de
arriba y abajo, pero puede hacer que las piezas de los personajes, que se encuentran fuera del rectngulo de diseo,
para que se recorte o pintado.

Flag = 32
Especifica que los caracteres de control Unicode diseo se muestran con un carcter representativo.
Flag = 1024
Especifica que una fuente alternativa para los caracteres que no se admiten en la fuente solicitada. Por
defecto, todos los caracteres que faltan se muestran con las "fuentes que faltan" carcter, por lo general
una plaza abierta.

Flag = 2048
Especifica que el espacio al final de cada lnea se incluye en una cadena de
medicin. De forma predeterminada, el rectngulo lmite devuelto por los Grficos
:: mtodo MeasureString excluye el espacio al final de cada lnea. Establezca la
marca para incluir ese espacio en la medicin.
Flag = 4096
Especifica que la envoltura de texto a la lnea siguiente se deshabilita. NoWrap est implcita cuando un punto de origen
se utiliza en lugar de un rectngulo de diseo. En la elaboracin del texto dentro de un rectngulo, de forma
predeterminada, el texto se divide en el ltimo lmite de la palabra que est dentro de los lmites del rectngulo y envolvi a
la lnea siguiente.
Flag = 8192
Especifica que slo lneas enteras se establecen en el rectngulo de diseo. Por defecto, el diseo contina
hasta el final del texto, o hasta que no ms lneas son visibles como resultado de la saturacin, lo que ocurra
primero.
La configuracin predeterminada permite la ltima lnea para ser parcialmente oscurecida por un rectngulo de
diseo que no es un todo

- 160 -

RUBY COMPONENT
mltiplo de la altura de la lnea. Para asegurarse de que slo las lneas enteras se
ven, establecer este indicador y tenga cuidado para proporcionar un rectngulo de
diseo por lo menos tan alto como la altura de una lnea.
Flag = 16384
Especifica que los personajes que sobresalen por el rectngulo de diseo y el texto que se extiende fuera del rectngulo
de diseo se les permite mostrar. Por defecto, todos los personajes sobresalientes y el texto que se extiende fuera del
rectngulo de diseo se recortan. Cualquier espacios finales (espacios que estn al final de una lnea) que se extienden
fuera del rectngulo de diseo se recortan. Por lo tanto, la configuracin de esta bandera tendr un
efecto en la medicin del hilo, si los espacios finales se estn incluyendo en la medicin. Si el recorte
se habilita, los espacios finales que se extienden fuera del rectngulo de diseo no estn incluidos
en la medicin. Si el recorte se deshabilita, todos los espacios finales se incluirn en la medicin,
independientemente de si se encuentran fuera del rectngulo de diseo.

Mltiples indicadores establecidos pueden


producir efectos combinados:
Cuando se establecen ambos 2 y 1, las lneas individuales de texto se dibujan verticalmente. La primera lnea
comienza en el borde derecho del rectngulo de diseo; la segunda lnea de texto es a la izquierda de la primera
lnea, y as sucesivamente.
Cuando se establece 2 y 1 no se fija, las lneas individuales de texto se dibujan verticalmente. La primera lnea
comienza en el borde izquierdo del rectngulo de diseo; la segunda lnea de texto est a la derecha de la primera
lnea.
Cuando 1 se ajusta y 2 no se fija, las lneas individuales de texto son horizontales y el orden de lectura es de derecha a
izquierda. Este ajuste no cambia el orden en que se muestran los personajes, simplemente especifica el orden en el que
los personajes se pueden leer.
Las 2 y 1 banderas pueden afectar la alineacin de
cadenas.

Bitmaps
Si pasa un mapa de bits a un componente de Ruby a travs de un conector de mapa de bits, puede utilizar esta en la
Vista
mtodos drawBitmap clase y drawBitmapSection para mostrar (o una parte del mismo) en la Vista.
Estos mtodos se definen como sigue:
drawBitmap bitmap, position [, alpha, rotation, origin]
drawBitmapSection bitmap, source, position [, alpha, rotation, origin]

El parmetro 'bitmap' es el mapa de bits que desea mostrar. En el caso de la


drawBitmapSection
parmetro 'fuente' es una matriz de 4 elementos que representa la seccin rectangular del mapa
de bits que desea mostrar. El conjunto rectngulo se define por [x, y, w, h] donde x, y definen la
parte superior izquierda y w, h definir el tamao de la seccin en pxeles.
El parmetro "posicin" puede ser un elemento de matriz de dos en representacin de la
esquina superior izquierda de donde desea que el mapa de bits que se muestre o puede ser
una matriz de 4 elementos que representa el rectngulo que desea dibujar el mapa de bits en.
El conjunto rectngulo se define por [x, y, w, h] donde x, y definen la parte superior izquierda y
w, h definir el tamao de las cuadrculas.

- 161 -

CHAPTER 8
Si proporciona un punto para la posicin, entonces el mapa de bits se basa en tamao completo. Si proporciona
un rectngulo del mapa de bits (o seccin de mapa de bits) se estiran o se reducen de tamao para encajar
exactamente en el rectngulo.
El parmetro 'alpha' es opcional. Se trata define el nivel de transparencia para el mapa de bits dibujado. Es un valor
entero en el rango de 0 a 255 con el 255 es totalmente opaco y 0 es completamente transparente. Si omite este
parmetro se asume un valor de 255.
El parmetro "rotacin" es tambin opcional y le permite girar el mapa de bits en un ngulo,
las agujas del reloj en grado. El origen de la rotacin se supone que es el punto central del mapa de bits a menos
que suministre un parmetro de "origen", en cuyo caso este punto se utiliza en su lugar. El parmetro de origen es
una matriz de dos elementos [x, y] donde x e y son las coordenadas del origen de rotacin en cuadrculas.
El parmetro 'bitmap' es una instancia de la clase Bitmap. Hay cuatro mtodos de esta clase para la determinacin del
tamao de mapa de bits:

width
height
widthPixels
heightPixels
La anchura y la altura de los mtodos que dan el tamao del mapa de bits en cuadrculas en el nivel de zoom
por defecto actual. Los widthPixels y mtodos heightPixels te dan la medida exacta del mapa de bits en
pxeles.
He aqu un ejemplo de un mapa de bits est dibujado en un rectngulo reducido 12 veces:

- 162 -

RUBY COMPONENT

Opciones de representacin de mapa


de bits
Si usted est dibujando un mapa de bits en un rectngulo que tiene un tamao diferente entonces usted puede
elegir el modo de hacer que el mapa de bits ajustando el modo de interpolacin. Esto se hace utilizando el
siguiente mtodo Ver:
setInterpolationMode mode
Esto toma un entero (0-7) o una de las siguientes cadenas:
"low","high","bilinear","bicubic","nearest","hqbilinear","hqbicubic"
Tambin puede averiguar el modo de interpolacin actual mediante el
siguiente mtodo. Esto devolver una de las 8 cadenas mostrados
anteriormente:
getInterpolationMode mode

Redraw
Si los valores de los cambios en otro mtodo que afecta a lo que se debe mostrar el mtodo draw,
entonces usted necesita para ser capaz de solicitar un redibujado. Esto es muy fcil de hacer.
Todo lo que hacemos es llamar al mtodo redibujado.
Si usted tiene ms de un Vista conectado a su componente de Ruby, entonces tambin debe
proporcionar la referencia del conector de entrada de la vista que desea volver a dibujar como
un parmetro de entrada para el mtodo redibujado.
Si slo una parte de la pantalla necesita ser redibujado se puede pasar
un rectngulo despus de la referencia del conector As que eso es:
redraw connectorReference, redrawArea { both optional }
Donde redrawArea es un conjunto de rubes de la forma [x,y,w,h].

Clipping
A veces tienes que ser capaz de dibujar slo dentro de una porcin de una vista. Aqu es donde entra en juego el
recorte. La clase View dispone de dos mtodos para establecer el recorte:
setClip region
combineClip region, combineMode
Ambos mtodos toman una regin como entrada. Esto puede ser una matriz de cuatro elementos que define un
rectngulo, el mismo formato que los rectngulos que utiliza para dibujar formas. Tambin puede ser una coleccin de
puntos que definen un polgono. Esto est representado por una matriz de dos conjuntos de elementos, cada uno de los
cuales define una posicin (x, y).
Tambin puede utilizar una ruta de objeto grfico para definir la regin.
El mtodo setClip establece la regin de recorte para la regin de entrada. Esto significa que el dibujo slo se
producir dentro de esa regin - nada fuera es "recortada" fuera.

- 163 -

CHAPTER 8
El mtodo combineClip combina la regin con la regin de recorte actual. La entrada CombineMode
es una cadena que especifica cmo las regiones se van a combinar. Las opciones son:
replace
- utilizar la nueva regin
- utilizar la interseccin de ambas regiones
intersect
- utilizar ambas regiones combinadas

union
xor- utilizar la unin menos la interseccin
exclude- usar la antigua regin menos el uno nuevo
complement - utilizar la nueva regin uno menos el viejo
He aqu un ejemplo de cmo utilizar de recorte:

Hay otros dos mtodos relacionados con el recorte:


resetClip
getClip
Para restablecer la regin de recorte slo llame resetClip o
tambin puede pasar nada como la regin para el mtodo setClip.
El mtodo getClip devolver una matriz que representa el rectngulo
delimitador de la regin de recorte actual en el formato [x,y,width,height].

Smoothing
Por defecto se suavizan los grficos. Los bordes dentados de lo contrario afilados
alrededor de los objetos grficos son suavizados para hacerlos aparecer lisa.
Si usted est dibujando lneas rectas es posible que desee desactivar esta opcin
como un efecto secundario es que s introduce un poco de confusin. El mtodo
setSmoothingMode de la clase View le permite controlar cuando suavizado
se aplica. Puede pasar 0 & 1 or on & off.

- 164 -

RUBY COMPONENT

Hay un mtodo similar para el suavizado de texto llamado setTextRenderingHint. Este mtodo tiene ms opciones de
entrada:
off
- no smoothing
singleBitPerPixelGridFit - utilizar mapas de bits de glyph para cada caracter con insinuando
singleBitPerPixel
antiAliasGridFit
antiAlias

- utilizar mapas de bits de glyph para cada caracter sin insinuando


- utilizar mapas de bits glyph antialiasing para cada carcter con insinuando
- utilizar mapas de bits glyph antialiasing para cada caracter sin insinuando

clearTypeGridFit

- utilizar mapas de bits glyph de ClearType para cada carcter con insinuando

View Properties
Hay unos cuantos ms mtodos de la clase View que todava no hemos mencionado. Adems de los mtodos de
dibujo que ya hemos hablado, hay cuatro mtodos que le dan algunas propiedades importantes de la Vista. Estos
son los siguientes:

gridStep
defaultGridStep
width
height
El mtodo gridStep le da el nmero de pxeles por cuadrcula para un objeto de vista. El mtodo defaultGridStep le
da el paso de la rejilla es decir, de forma predeterminada. el nmero de pxeles por cuadrcula cuando el nivel de
zoom se ajusta a la normalidad. Si no se cambia el paso de la rejilla por defecto (bajo Nivel de detalle del cuadro de
dilogo Opciones de esquema) entonces esto va a ser de 8 pxeles por cuadrcula.
Estos dos mtodos no son utilizados a menudo, pero que pueden ser tiles en la circunstancia especial por ejemplo.
para escalar mapas de bits, ya que puede querer un mapa de bits que aparezca en su tamao normal cuando el nivel de
zoom por defecto, pero la escala en consecuencia cuando el zoom.

- 165 -

CHAPTER 8
Los mtodos de anchura y altura son mucho ms comnmente utilizados. Si desea que sus grficos a
cambios basados en el tamao del panel frontal est dibujando a continuacin, tendr que conocer el ancho y
la altura.
Estos son suministrados por supuesto, en unidades cuadradas de cuadrcula.
A veces tienes que ser capaz de obtener el tamao de la vista cuando no ests en el mtodo Draw.
Qu hacer si usted no tiene acceso a una vista de objeto? Bueno, tenemos un mtodo especial
de la clase RubyEdit que puede utilizar:

getViewSize connectorReference
Tiene que pasar el ndice del conector View que desea consultar (o usted puede dejarlo en blanco y se utiliza
cero). El mtodo devuelve un array de dos elementos que contiene la anchura y la altura. En el siguiente ejemplo
hemos pulsado el botn de disparo y el mtodo de evento que se ha denominado la activacin de la llamada a
getViewSize y el resultado se visualiza en la lista de vigilancia.

Si usted no tiene una vista conectada entonces la llamada a getViewSize volver nula. Esto puede suceder cuando se
tiene ningn vnculo conectado o durante la carga o init por lo que si usted tiene la intencin de utilizar getViewSize en
la carga y los mtodos de arranque lo mejor es comprobar si el resultado es cero, antes de actuar sobre ella.

- 166 -

RUBY COMPONENT

Brushes Avanzados
La seccin Dibujo cubierto cmo crear un pincel slido y lo utilizan
para rellenar formas bsicas o dibujar texto. En esta seccin vamos a
ver las opciones de pincel ms avanzadas.

Linear Gradients
Puede crear reas rellenas que fluyen sin problemas entre los colores utilizando la clase
LinearGradientBrush.
Esta es una variacin de la clase del cepillo estndar y se puede utilizar como un instrumento para la
elaboracin en todos los mtodos de diseo de formas al igual que el estndar del cepillo.
En su forma ms simple un LinearGradientBrush le permite definir un
degradado entre dos colores. Se crea una instancia de la clase de la siguiente
manera:
b = LinearGradientBrush.new boundRect, color1, color2, angle, scaleTrans

boundRect
Este es un rectngulo (una vez ms se define como una matriz de rub [x, y, ancho, altura]) que
define el lmite del relleno degradado. El gradiente se llenar esta rea por lo que necesita para
asegurarse de que se crea un rectngulo delimitador que encaja con lo que las formas que
usted tiene la intencin de llenar.
color1, color2

Estos son los colores de gama de la pendiente y deben ser instancias de la clase
Color. Si no se proporciona un parmetro de ngulo luego color1 habr en el borde
izquierdo del rectngulo y color2 estarn en el borde derecho.
angle
Este es el ngulo de rotacin para el gradiente en grados en la direccin de las agujas del reloj. Si el ngulo es de
90 grados por ejemplo, color1 ser en la parte superior del rectngulo y el gradiente se ejecutar hacia abajo para
color2.
scaleTrans
Esto define si el ngulo se ve afectada por la transformacin asociada con el
cepillo. El parmetro es un indicador booleano por lo que se debe establecer en
true o false.
He aqu un ejemplo simple de una LinearGradientBrush:

- 167 -

CHAPTER 8

Transformations
Puede rotar, traducir o reducir el cepillo despus de haber sido creado. Para ello se utilizan
los siguientes mtodos:
rotateTransform angle
translateTransform x, y
scaleTransform sf-x, sf-y
resetTransform

El mtodo de rotacin tiene un ngulo en grados. El mtodo translate toma X e Y compensaciones.


El mtodo de la clave tiene X y escala Y factores - estos son equipos flotantes de 1,0 significa ningn cambio.
El mtodo resetTransform hace exactamente lo que dice, se restablece cualquier transformaciones
aplicadas.
El siguiente ejemplo muestra un gradiente que se ha estirado y traducido.

- 168 -

RUBY COMPONENT
Blending
Usted no slo tiene que tener una pendiente recta. Usando el setBlendTriangularShape y los mtodos
setBlendBellShape puede mover el color final hasta cierto punto en el medio y se mezclan a ambos lados. La opcin de
sirena usa una curva de mezcla no lineal.
setBlendTriangularShape focus, scale
setBlendBellShape focus, scale
Ambos mtodos toman dos entradas. El primero es el enfoque. Se trata de un flotador entre 0 y 1, que define la
distancia relativa del color de punto final desde el punto inicial. Un valor de 0.5 lo pondra justo en el medio, por
ejemplo.
El segundo parmetro es la escala. Este es tambin un flotador entre 0 y 1 y que define la intensidad del color en el
punto de enfoque.
He aqu un ejemplo de esto en accin:

Usted toma un paso ms all y establecer sus propios puntos de mezcla. Esto se hace usando el mtodo setBlend.
setBlend blendArray

El mtodo toma una matriz de dos conjuntos de elementos. Cada matriz de dos elementos
define primero un factor de mezcla entonces una posicin a lo largo del gradiente. Ambos
valores son los flotadores en el rango de 0 a 1.

- 169 -

CHAPTER 8
Todo esto se ilustra mejor con un ejemplo. La siguiente imagen muestra un degradado
con tres puntos de mezcla entre los puntos finales que ellos mismos se ponen a cero (es
decir, color1):

Tambin puede introducir toda una gama de colores en el gradiente usando el mtodo setInterpolationColors. Esto es
muy similar al mtodo setBlend excepto que en lugar de un factor de mezcla tiene un objeto de color se combina con la
posicin a lo largo del gradiente.
setInterpolationColors colourArray
El siguiente ejemplo muestra 4 colores se fusionen en varios puntos:

Wrapping
El LinearGradientBrush tiene un rectngulo delimitador definido. Esto hace que el cepillo en un azulejo.
La baldosa se utiliza a continuacin, varias veces para preparar cualquier rea que se pinta con el
pincel.
Dependiendo de cmo se defina el degradado es posible que desee voltear las baldosas que se coloquen
de modo que usted no consigue los bordes duros entre ellos. Usted puede hacer esto estableciendo el
modo de ajuste de 'flip' usando el mtodo setWrapMode.

setWrapMode mode

- 170 -

RUBY COMPONENT

El modo por defecto es de baldosas sin mover de un tirn, pero pasando la cadena "Flip" o el nmero 1 se puede
establecer esta a volteado. He aqu un ejemplo de cmo el modo de ajuste afecta a la result.You general puede
ver que en el rectngulo inferior cada baldosa se voltea de manera que el gradiente se ejecuta sin problemas de
una baldosa a otra.

Path Gradients
Sendero gradientes proporcionan otra forma de producir rellenos transitorios suaves entre diferentes colores.
A diferencia de la LinearGradientBrush crean un degradado radial desde una central color hacia un
conjunto de colores de los alrededores.
En los alrededores se define por un camino y colores se puede distribuir a lo largo del camino. Un solo color
central tambin se define y el gradiente de color se calcula mediante la mezcla hacia el exterior desde el punto
central.
En su forma ms simple un PathGradientBrush le permite definir un degradado entre dos colores. Se crea
una instancia de la clase de la siguiente manera:

b = PathGradientBrush.new path
Hay un nico parmetro de entrada, la ruta de acceso. La ruta puede ser una matriz de puntos (representado como una
matriz de dos conjuntos de elementos que contienen las coordenadas X e Y de cada punto) o puede ser un objeto
GraphicsPath.
Los colores por defecto son Negro en el centro y blanco en el camino.

- 171 -

CHAPTER 8
He aqu un ejemplo utilizando una ruta plaza y los colores por defecto:

Changing Colours
Hay dos mtodos de la clase PathGradientBrush que le permiten cambiar los colores.
setCenterColor colour
setSurroundColours colourArray

El mtodo setCenterColor toma un nico objeto de color. El mtodo setSurroundColours toma una matriz de colores.
Por defecto estos colores se asignan a su vez a cada punto de la ruta. Si hay menos colores que los puntos de ruta y por
eso se quedan sin los colores al asignar a los puntos en el camino, el ltimo color de la matriz se utiliza en todos los
puntos siguientes.
El siguiente ejemplo muestra lo que obtenemos al cambiar el color central de color rosa y los colores exteriores para rojo,
verde, azul y amarillo.

- 172 -

RUBY COMPONENT
Wrapping
En una manera similar a la LinearGradientBrush un PathGradientBrush tiene un rectngulo
delimitador que contiene la ruta completa. Esto hace que el cepillo en un azulejo. El azulejo se puede
utilizar varias veces para preparar cualquier rea que se pinta con el pincel.
A diferencia de la LinearGradientBrush, el valor predeterminado para la PathGradientBrush es no azulejo o
abrazadera. Usted puede cambiar esto estableciendo el modo de ajuste mediante el mtodo setWrapMode.
setWrapMode mode
Las diferentes opciones del modo permiten voltear las baldosas que se coloquen de manera que los paneles se funden
en uno al otro. Estas son las opciones para el valor de entrada de modo:
0 or tile

Suelo de baldosas normal se realiza

1 or flipx

3 or flipxy

Suelos de baldosas se realiza con azulejos alternos volteadas en la direccin


x
Suelos de baldosas se realiza con azulejos alternos volteadas en la direccin
y
Forros se realiza con tejas alternos volteadas en las direcciones x e y

4 or clamp or notile

No suelo de baldosas se realiza - esta es la opcin por defecto

2 or flipy

El siguiente ejemplo muestra el modo de ajuste "FlipX" en accin. Usted puede ver cmo los azulejos en la direccin x se
giran alternativamente pero los azulejos en la direccin vertical no lo son.

Blending
El PathGradientBrush apoya mezclando al igual que el LinearGradientBrush. Usando el setBlendTriangularShape y
los mtodos setBlendBellShape puede mover el color central hasta cierto punto en el medio y se mezclan a ambos
lados. La opcin de sirena usa una curva de mezcla no lineal.

setBlendTriangularShape focus, scale


setBlendBellShape focus, scale

Ambos mtodos toman dos entradas. El primero es el enfoque. Se trata de un flotador entre 0 y 1, que define la
distancia relativa del color de punto final desde el punto inicial. Un valor de 0.5 lo pondra justo en el

- 173 -

CHAPTER 8
middle for example. The second parameter is the scale. This is also a float between 0 and 1 and it
defines the intensity of the colour at the focus point.
Here's an example of these in action. We've used a GraphicsPath instead of an array of points this
time too just to show how that works when defining the brush.

You take this a step further and set your own blend points. This is done using the setBlend method.
setBlend blendArray
The method takes an array of two element arrays. Each two element array defines first a blend factor
then a position along the gradient. Both values are floats in the range 0 to 1.

- 174 -

RUBY COMPONENT
This is all best illustrated with an example. The picture below shows a gradient with three blend points
in between the end points which themselves are set to zero (ie. color1):

You can also introduce a whole range of colours into the gradient using the setInterpolationColors
method. This is very similar to the setBlend method except that instead of a blend factor you have a
Color object paired with the position along the gradient.
setInterpolationColors colourArray
The example below shows 4 colours merging together at various points:

- 175 -

CHAPTER 8
Centre Point
By default the centre point is calculated for you based on the path. However, you can set the position
of the centre point yourself using the setCenterPoint method.
setCenterPoint x, y
All you need to do is pass the x and y coordinates of the point you want to have as the new centre.
The example below shows a displaced centre point being used to create a 3D effect by creating the
illusion of reflected light from a ball.

- 176 -

RUBY COMPONENT
Focus Scales
By default the centre colour is focused at the centre point. However, you can change the focus size
around this point by using the setFocusScales method.
setFocusScales scaleX, scaleY
The method takes two scale factors. These are applied to the path that defines the brush and the
resulting shape defines the area that is filled with the centre colour. Scale factors of 1.0 will make the
whole shape the focus colour so most of the time the scale factors you use will be less than 1.0.
Here's an example that shows how this works. Here we have increased the size of the focus point and
stretched it a bit more vertically than horizontally.

Transformations
You can rotate, translate or scale a PathGradientBrush after it has been created. To do this you use
the following methods:
rotateTransform angle
translateTransform x, y
scaleTransform sf-x, sf-y
resetTransform
The rotation method takes an angle in Degrees. The translate method takes x and y offsets. The scale
method takes x and y scale factors these are floats with 1.0 meaning no change. The resetTransform
method does exactly what it says, it resets any applied transforms.

- 177 -

CHAPTER 8

Hatch Brushes
A HatchBrush is is used for filling an area with a hatched or stipple effect. It s defined by a hatch style,
a foreground colour and an optional background colour. You can create an instance as follows:
b = HatchBrush.new style, foregroundCol, backgroundCol
If you don't supply a background colour then the background will be left transparent and all you will get
is the hatching. For the style you have 53 different options. This can be specified as an integer (in the
range 0-52) or a text string.
The hatch styles are shown below (in increasing order left to right, top to bottom):

The hatch style strings are as follows:


"HORIZONTAL"
"VERTICAL"

"80PERCENT"
"90PERCENT"

"FORWARDDIAGONAL"

"LIGHTDOWNWARDDIAGONAL"

"BACKWARDDIAGONAL"
"CROSS"

"LIGHTUPWARDDIAGONAL"
"DARKDOWNWARDDIAGONAL"

"DIAGONALCROSS"
"05PERCENT"
"10PERCENT"

"DARKUPWARDDIAGONAL"
"WIDEDOWNWARDDIAGONAL"
"WIDEUPWARDDIAGONAL"

"20PERCENT"
"25PERCENT"
"30PERCENT"

"LIGHTVERTICAL"
"LIGHTHORIZONTAL"
"NARROWVERTICAL"

"40PERCENT"
"50PERCENT"
"60PERCENT"

"NARROWHORIZONTAL"
"DARKVERTICAL"
"DARKHORIZONTAL"

"70PERCENT"
"75PERCENT"

"DASHEDDOWNWARDDIAGONAL"
"DASHEDUPWARDDIAGONAL"

- 178 -

RUBY COMPONENT
"DASHEDHORIZONTAL"

"DOTTEDGRID"

"DASHEDVERTICAL"
"SMALLCONFETTI"
"LARGECONFETTI"

"DOTTEDDIAMOND"
"SHINGLE"
"TRELLIS"

"ZIGZAG"
"WAVE"
"DIAGONALBRICK"

"SPHERE"
"SMALLGRID"
"SMALLCHECKERBOARD"

"HORIZONTALBRICK"
"WEAVE"
"PLAID"
"DIVOT"

"LARGECHECKERBOARD"
"OUTLINEDDIAMOND"
"SOLIDDIAMOND"

The following example shows how to create and use a HatchBrush. The top rectangle uses a brush
created using just a foreground colour. You can see the background underneath as only the hatching is
applied. The bottom rectangle has been defined with a white background colour. We've also used the
two different ways of specifying the hatch style in each rectangle by index or by name.

- 179 -

CHAPTER 8

Texture Brushes
A TextureBrush is defined by a bitmap. When you fill an area with a TextureBrush the bitmap is used
repeatedly to tile the area you want to fill.
You can create an instance as follows:
b = TextureBrush.new

bitmap

The bitmap input parameter needs to be a Bitmap object. You need to pass a Bitmap object into your
Ruby component so that you can use it in your TextureBrush.
The example below shows how a TextureBrush is created and used.

Wrapping
When filling an area TextureBrush tiles are placed next to each other. However, you could choose to
flip the tiles alternately as you pave vertically or horizontally to create a more fluid pattern. To do this
you need to use the setWrapMode method.
setWrapMode mode
Here are the options for the mode input value:
0 or tile

Normal tiling is performed this is the default option

1 or flipx

Tiling is performed with alternate tiles flipped in the x direction

2 or flipy

Tiling is performed with alternate tiles flipped in the y direction

3 or flipxy

Tiling is performed with alternate tiles flipped in the x and y directions

- 180 -

RUBY COMPONENT
The example below shows the four different wrap modes in action.

Transformations
You can rotate, translate or scale a TextureBrush after it has been created. To do this you use the
following methods:
rotateTransform angle
translateTransform x, y
scaleTransform sf-x, sf-y
resetTransform

The rotation method takes an angle in Degrees. The translate method takes x and y offsets. The scale
method takes x and y scale factors these are floats with 1.0 meaning no change. The resetTransform
method does exactly what it says, it resets any applied transforms.
Here's an example showing how these all work:

- 181 -

CHAPTER 8

Advanced Pens

The Drawing section we covered the very basics of Pens. In this section we'll look at Pens in more
detail and show you some of the more advanced things that you can do with them.

Pen Alignment
By default lines drawn with a pen are centred. This means that if you have a thicker pen then part of
the pen will fall on either side of the line. Sometimes this is not the behaviour you want so you can
change it using the setAlignment method for the Pen.
setAlignment alignmentType
There are just 2 options for the alignment type:
0 or center

The pen is centred on the line

1 or inset

The pen is inset so its outer edge always follows the line

The example below shows how the two types work in practice. The two rectangles are exactly the
same size. However, the top rectangle is drawn with the alignment centred. You can see how this
makes the rectangle appear larger.

- 182 -

RUBY COMPONENT

Line Joins
When you draw any shape that contains straight lines the joints between the lines are mitred together
by default. A mitre joint is created between two lines by extending both lines artificially until they cross
each other and then cutting off the protruding edges.
Green area is kept to form joint

End result

In the diagram above the blue lines show the artificial extensions. The green area is kept to form the
joint and the blue protruding parts are removed. The end result is shown on the right.
You can change the way in which lines are joined using the setLineJoin method of the Pen object.
setLineJoin type
The method takes a single input. This can be either an index or a string:
0 or mitre

A standard mitre joint this is the default option

1 or bevel

The joint is flattened off instead of creating a point at the outer edge

2 or round

A curved edge is used to join the lines

3 or mitreclipped

A mitre joint is used if under the mitre limit otherwise a bevel is used

The best way to understand these is to see them in action:

- 183 -

CHAPTER 8
The bottom line shows the mitreclipped option. Notice that the first joint is beveled but the others are
mitred. This is because for the first joint a mitre would extend beyond the mitre limit.
The mitre limit is the maximum allowed limit of mitre length to pen width. The mitre length is measured
as shown in the diagram below.

Mitre length

The default mitre limit for a pen is 10.0 but you can change this using the setMitreLimit method.
setMitreLimit limit
If the line join is set to the default mitre option then any mitre joins above the mitre limit will be clipped
at the mitre limit. However, if the line join is set to mitreclipped then any mitre joins above the mitre
limit will be converted to bevels.

- 184 -

RUBY COMPONENT

Dashes
Pens can be set to draw broken rather than solid lines. Y can do this using the setDashStyle method
of the Pen object.
setDashStyle type
The method takes a single input. This can be either an index or a string:
0 or none

No dash is applied, instead you get the default solid line

1 or dash

A dashed line

2 or dot

A dotted line

3 or dashdot

A line comprised of alternating dashes and dots

4 or dashdotdot

A line comprised of alternating dashes and double dots

The example below shows a selection of these styles.

Dash Caps
You can set the way that ends of the dashes and dots are drawn by using the setDashCaps method.
setDashCaps type
There are only 3 options for the type:
0, 1 or flat

The ends are flat, dots are squares this is the default option

2 or round

The ends are rounded, dots are circles

2 or triangle

The ends are pointed, dots are diamonds

- 185 -

CHAPTER 8
Here's an example showing how the round and triangle options work:

Brushed Lines

We've seen how it's possible to fill a shape using a brush. Well you can also use a brush to fill a line
drawn with a pen. To do this use the setBrush method of the Pen object.
setBrush brush
The input is a brush object. You can use any kind of brush, gradient, hatched, texture, path or
solid.The example below shows two lines being drawn with hatch and texture brushes.

- 186 -

RUBY COMPONENT

Line Caps
Line caps define how the end points of a line are drawn. By default lines are squared off at the ends
but you may want a rounded or triangular end to your lines and line caps allow you to do this.
You can also have a larger shape at the start or end of a line. This is called an Anchor. The most
familiar line cap anchor is the arrow head but there are several more standard ones and you can also
make your own.
Line caps are properties of Pen objects. To set the line caps for a pen there are two Pen class
methods, one for setting the cap at the start of the line and one for setting the one at the end:
setStartCap type
setEndCap type
The type parameter can be any of the following strings:
square, round, triangle, noanchor, squareanchor, roundanchor,
diamondanchor, arrowanchor

Here is an example that shows how to use line caps:

- 187 -

CHAPTER 8
Scaling
Line caps are scaled automatically in proportion to the line thickness. This scaling can make it difficult
to achieve the style you're looking for. For example, if you create a single pixel thickness line with an
arrow end cap the arrow will be just 2 pixels wide.
You can get round this by creating a thicker pen and then scaling it down using the scaleTransform
method. The end cap is inversely affected by the scaleTransform and so if you find a scale factor that
maintains the .
scaleTransform sf-x, sf-y
resetTransform
The scaleTransform method takes x and y scale factors these are floats with 1.0 meaning no
change. There is also a resetTransform method which is useful if you're reusing the same pen and
resets any applied transforms.
The example below shows a single pixel width line with an arrow end cap. Below it are two identical
lines but with larger arrows using the technique we just described.

- 188 -

RUBY COMPONENT

Custom Line Caps


If you want to create your own custom line caps then you can do this using the CustomLinecap class.
You create an instance of this class the use it to set the start or end cap for the pen.
Before you can do any of this you will need to create a GraphicsPath object. This will define the
shape of the line cap.
You create a graphics path in the same way as usual. The units are still grid squares, however the
coordinate system is relative to the line. This is necessary because when the line changes direction
you want the end cap to change its orientation accordingly.
The diagram below shows how the coordinate system works. Figure 1 shows the axes relative to an
arbitrary line. Figure 2 shows a single line having been added to the graphics path for the custom end
cap. The line starts at (1,0) and ends at (0,1). If we added another line from (0,1) to (-1,0) and closed
the path then we'd have a path to make our own custom arrow head line cap.

So now we go back to the CustomLineCap class. We can create an instance of this class in one of two
ways. Either we have an end cap where the path shows as an outline or we have a path which is filled
(with the pen color). Here's how you handle both cases:
c = CustomLineCap.new nil,path,0
c = CustomLineCap.new path,nil,0

# line cap outline


# line cap filled

The third parameter is the offset of the cap from the line in grid squares. A positive offset will move the
cap away from the line and a negative one will pull it closer.
Now that you have a CustomLineCap object you can use the setCustomStartCap and
setCustomEndCap methods of the Pen class to assign the cap to the Pen. The example below shows
how this all works.

- 189 -

CHAPTER 8

Scaling
The custom line cap scales proportionally to the pen size. The default is for this to scale 1:1. You can
change this by using the setWidthScale method of the CustomLineCap class. Setting this to 2 for
example, would make the cap be double the size it would be normally at whatever pen width. The
width of the pen used to stroke the path would also be double the pen width.

Join and Caps for the Path


Going into even more detail, you can even set the end caps for the custom line cap itself. Use the
setStrokeCaps method of CustomLineCap. This takes two parameters, a cap for the start of the path
and a cap for the end of the path. These are strings and can be one of the following:
square, round, triangle
The join style can also be set by using the setStrokeJoin method. This takes a single string to define
the join style and can be one of:
bevel, round, miterclipped
The example below shows these methods being used. Note that the end cap and join styles only apply
to stroked paths. If you use a filled path for your custom end cap then these are ignored.

- 190 -

RUBY COMPONENT

- 191 -

CHAPTER 8

Interaction
En la seccin anterior vimos cmo se puede dibujar a un
panel frontal con un componente de Ruby. En esta
seccin vamos a hablar sobre cmo controlar eventos de
ratn a partir de un panel frontal.
Usted necesitar una vista de entrada configurado exactamente de la misma forma
que para el dibujo.
En cambio, si lo que desea es controlar la entrada de eventos de ratn se puede
crear un conector de ratn en lugar de la Vista.
La forma en que maneja los eventos dentro del componente de Ruby es
exactamente el mismo en ambos casos
Overview
Usted recordar de la seccin anterior de que para la elaboracin FlowStone busc un mtodo draw en el
componente de Ruby. Los eventos del ratn se manejan de una manera muy similar.
Para cada tipo de evento FlowStone busca un mtodo particular de su componente de Ruby.
Si lo encuentra a continuacin, los detalles del evento que se pasan al mtodo de modo que pueda responder.
Hay diez mtodos de FlowStone para esto. Todos ellos toman el mismo conjunto de parmetros de entrada.
Hay un primer parmetro de opcin que es la referencia conector de entrada (una cadena de nmero entero o
etiqueta). Slo es necesario esto si tiene mltiples Vistas conectados a su componente de Ruby.
En la gran mayora de los casos esto no ser as, y por lo que no tendr que preocuparse por el parmetro de
referencia del conector.
Los principales parmetros son las coordenadas x e y. Estos son los dos flotadores y estn en unidades
cuadradas de cuadrcula.
Por ejemplo, para definir el mtodo para manejar los clics izquierdos del ratn:
def mouseLDown x,y
end
Si tuviera ms de un Vista o el conector del ratn entonces usted puede agregar la
referencia del conector para que pueda diferenciar entre la llegada eventos:
def mouseLDown i,x,y
end

Ahora nos ocuparemos de los 10 mtodos en


detalle.

- 192 -

RUBY COMPONENT

Handling Mouse Events


El mtodo ms importante que hay que definir es isInMousePoint porque esto es lo que dice
FlowStone que usted acepta eventos del ratn. Sin esto obtendrs ningn evento de ratn en
absoluto.
El mtodo debe devolver true o false para decirle FlowStone si controla los eventos del ratn o no (tambin
puede volver 1 o 0)

El ejemplo anterior muestra cmo el cursor del ratn cambia a la 'mano' por defecto para indicar que
la interaccin es posible.
En este caso hemos elegido para manejar eventos de ratn, independientemente de que el puntero del ratn
se encuentra en la Vista. Sin embargo, se puede utilizar la posicin x e y para devolver un resultado diferente
dependiendo de si el ratn est en un rea o lugar en particular.

- 193 -

CHAPTER 8

Mouse Clicks
Una vez que haya definido su mtodo isInMousePoint recibir un evento cada vez
que un clic de ratn se produce en la vista (que proporciona isInMousePoint
devuelve true para el punto en particular).
Hay 6 mtodos para responder a los clics del mouse estndar, 3 para el botn
izquierdo del ratn y 3 para la derecha. Estos son los siguientes:
mouseLDown
mouseLUp

- Botn izquierdo del ratn cuando se hace clic


- Botn izquierdo del ratn cuando es soltado

mouseLDouble
mouseRDown
mouseRUp
mouseRDouble

Botn izquierdo del raton cuando se hace doble click


left mouse button cuando se hace click
left mouse button cuando es soltado
left mouse button cuando hace doble-click

Aqu definimos un mtodo de clic de botn izquierdo del ratn. Lo hicimos de


forma que produzca una matriz con las coordenadas del punto de clic. Se
puede ver que el puntero del ratn se encuentra en 10 cuadrculas de ancho
y 5 hacia abajo.
Todos los otros mtodos clic del ratn funcionan de la misma forma.

- 194 -

RUBY COMPONENT

Mouse Capture & Dragging


Si desea controlar las operaciones de arrastre, en los que el usuario hace clic,
celebra luego se mueve el cursor, usted tendr que capturar el ratn. Para ello se
llama al mtodo CaptureMouse. Esto debe hacerse en respuesta a un evento de
ratn.
Ahora, siempre y cuando el botn del ratn sigue siendo bajista FlowStone buscar
un mtodo llamado mouseMoveCaptured en su componente de Ruby. Si existe ser
llamado cada vez que se mueve el ratn.
Cuando se suelta el botn del ratn obtendr una llamada al mtodo apropiado del
ratn hacia arriba. A partir de este mtodo tendr que llamar al mtodo
ReleaseMouse
.
Todo
esto es mucho
mejor ilustra en un
ejemplo:

Aqu hemos ampliado el ejemplo anterior para enviar las coordenadas del
puntero del ratn solamente mientras arrastra el ratn.

- 195 -

CHAPTER 8

Key Modifiers
A veces se quiere definir diferentes respuestas a los clics y arrastres en funcin de
si un modificador de tecla en particular se ha aplicado.
Por lo general usted querr comprobar si las teclas SHIFT, CTRL o ALT se presionan
en el momento de o durante la interaccin.

Para ello tenemos el mtodo


isKeyPressed:
isKeyPressed keyName

El mtodo tiene una entrada, el keyName. Esto puede ser una cadena que representa
la clave o un nmero entero que representa el cdigo de tecla virtual.
As que para comprobar la tecla 'q', utilice "q" o el cdigo de tecla virtual de 81
como el nombre de la clave. Usted puede encontrar una lista de los cdigos de tecla
virtual aqu:
http://msdn.microsoft.com/en-us/library/aa243025(v=vs.60).aspx

El mtodo devolver true o false dependiendo de si se presiona la tecla


actualmente o no.
Special Keys

Para algunas teclas especiales, que se utilizan con frecuencia tenemos


cadenas de mtodos abreviados de configuracin para ahorrarle tener que
buscar los cdigos de teclas virtuales:
Key

Cadena de nombre clave para el uso (maysculas y


minsculas)

Shift

Shift

Control

Control or CTRL

Alt

Alt

Space

Space

Return / Enter

Return or Enter

Arrow Key Up

Up or Arrow Up

Arrow Key Down

Down or Arrow Down

Arrow Key Left

Left or Arrow Left

Arrow Key Right

Right or Arrow Right

- 196 -

RUBY COMPONENT

Mouse Move
Si desea capturar los movimientos del ratn cuando no se pulsan los botones del
ratn, entonces primero hay que habilitar esto en el componente MGUI que se est
conectando. Por defecto los mensajes de movimiento del ratn suprimen con el fin de
mejorar el rendimiento.
Para activar movimientos del ratn que usted necesita ir al componente MGUI,
conecte un componente de Boole a su entrada Ratn y establecer en True (como se
muestra a continuacin).

El ejemplo anterior muestra lo que tenemos en el interior del mdulo que


hemos estado utilizando en los ejemplos que hemos mostrado hasta ahora.
Una vez que haya habilitado el ratn se mueve FlowStone buscar un
mtodo mouseMove en su componente de Ruby. Cada vez que se mueve el
ratn en la vista del mtodo mouseMove se llamar.
El siguiente ejemplo muestra las coordenadas que se envan a
cabo cada vez que se mueve el ratn sobre la vista.

- 197 -

CHAPTER 8

Mouse Cursor
Hay otros cursores que se pueden utilizar distintos del predeterminado. Para
establecer el cursor tiene que crear un mtodo MouseCursor. FlowStone espera un
valor devuelto de este mtodo, que le diga que el cursor
you want to use. The return value can be an integer or a string:
0 or default

(por Defecto)

1 or ibeam

(Cursor)

2 or pointer

(Puntero)

3 or handpointer
Mano)
4 or move

(Mano Indicativa) o (Punto de


(Mover)

5 or pointeradd

(Puntero Aumentador)

6 or pointerdel

(Puntero Disminuidor)

7 or smallpointer
secundario)
8 or resizeew

(Puntero Pequeo o
(Reaumento Horizontal)

9 or resizens

(Reaumento vertical)

10 or handopen

(palpar)

11 or handclosed

(tomar)

12 or crosshair
13 or deny

(Punto de Mira)
(Negar)

- 198 -

RUBY COMPONENT

- 199 -

CHAPTER 8

Controles y Dilogos
Hay un par de elementos de la interfaz de usuario que utilizamos con controles de
Windows y cuadros de dilogo.
Tenemos primitivas para ellos, pero cuando se est programando una interfaz que
use componentes de Ruby es mucho ms fcil para poder acceder a ellos desde su
cdigo.

Esta seccin describe estos elementos y cmo


usarlos.
In Place Edit Controls
Los controles de edicin son prcticamente indispensables para reunir numrica
precisa o la introduccin de texto. Se puede crear un lugar en el control de edicin
sobre la marcha cada vez que se necesita para obtener la informacin mediante el
uso createEdit
del mtodo
createEdit
input,
id, area,: [startText [,font [,textColour
[,backColour [,multiline]]]]]

Las entradas al mtodo son los


siguientes:
input
id
area
startText

referencia al conector de entrada Ver (nombre o ndice)


un identificador que se puede utilizar en la devolucin de llamada para que usted sepa lo que est informando de edicin

cuatro array elemento [x, y, w, h] para definir la posicin y el tamao


el texto que aparecer en la edicin para empezar con [OPCIONAL]

font
textColour
backColour

- El tipo de letra a utilizar (un objeto de fuente) [OPCIONAL]


- El color del texto [OPCIONAL]
- El color del rectngulo de fondo para el control de edicin [OPCIONAL]

multiline

- si el control debe ser una edicin de mltiples lneas (verdadero o

falso) [OPCIONAL]
Una vez creado el control de edicin se presentar un informe al componente de Ruby.
Usted puede capturar la informacin reportada por la aplicacin de uno o ambos de los
siguientes mtodos:
def editFinished id,text
end

def editChanged id,text


end

Las entradas a estos mtodos son los mismos - el id del control de edicin que
informa (el que usted le ha proporcionado al crearla) y el texto que se encuentra
actualmente en el control.
La nica diferencia entre los dos es que el mtodo editChanged se llama con
cada golpe de teclado mientras que el mtodo editFinished slo se llama cuando
el control de edicin se cierra (cuando el usuario presiona el tabulador o clics).

- 200 -

RUBY COMPONENT

He aqu un ejemplo de un control de edicin en el lugar que se utiliza para


capturar la entrada. En este ejemplo hemos hecho clic en la interfaz de
usuario por lo que el mtodo mouseLDown ya se ha llamado y ha creado el
control de edicin.

Drop Lists (Suelta Listas)


Para la seleccin de una lista discreta de opciones que tenemos para el control de
lista desplegable. Puede crear una utilizando el mtodo createDropList:
createDropList input, id, pos, items, [checked [,style [,disabled]]]

Las entradas al mtodo son los


siguientes:
input
id
pos

- referencia al conector de entrada Ver (nombre o ndice)


- un identificador que se puede utilizar en la devolucin de llamada para que usted sepa qu lista
est informando
- esquina superior izquierda de la lista desplegable

items
checked

- comas de
- ndice del

cadenas de nombres de elementos separados


elemento que desea mostrar como prueba [OPCIONAL]

style
disabled

- "scroll", "autocol" o el nmero de artculos por la columna

[OPCIONAL]
- el ndice del elemento que desea mostrar como discapacitados
Una vez creado el[OPCIONAL]
control de lista desplegable que informar al componente Rub

vez a la seleccin se ha hecho. Usted puede capturar la informacin reportada por


la aplicacin del siguiente mtodo:
def dropListFinished id, index, name
end

La entrada id es el id de la lista desplegable que informa (el que se suministra cuando lo


cre). El ndice es el ndice del elemento seleccionado y el nombre es el nombre del
elemento que se muestra en la lista.

- 201 -

CHAPTER 8

He aqu un ejemplo de un control de lista desplegable en la accin. En este


ejemplo hemos hecho clic en la interfaz de usuario por lo que el mtodo
mouseLDown ya se ha llamado y ha creado el control.

Message Boxes
Es til ser capaz de dar avisos al realizar acciones irrecuperables o para solicitar un usuario
para su confirmacin. Aqu es donde los cuadros de mensajes vienen pulg Usted puede crear
un cuadro de mensaje con el mtodo messageBox:
messageBox id, text [,title [,type ]]

Las entradas al mtodo son los


siguientes:
id
text
title

- Un identificador que se puede utilizar en la devolucin de llamada para que usted sepa
cul va a denunciar
- El texto a mostrar en el cuadro de mensaje
- El texto de la barra de ttulo del cuadro de mensaje [OPCIONAL]

cmo se ve el cuadro de mensaje y se comporta


[OPCIONAL]
El tipo es una combinacin de cadenas en cualquier orden con ningn separador
que te gusta. Las opciones son las siguientes:
type

- define

arreglos de Botn: okcancel, retrycancel, yesnocancel, yesno, abortretryignore


Iconos: exclaimation, warning, information, asterisk, question, stop, error, hand
Botones por defecto: defbutton1, defbutton2, defbutton3, defbutton4

- 202 -

Una vez que el cuadro de mensaje ha cerrado informar al


componente de Ruby. Usted puede capturar la informacin reportada
por la aplicacin del siguiente mtodo:

RUBY COMPONENT

def messageBoxFinished id, result


end

La entrada id es el identificador del cuadro de mensaje que informa (el que se


suministra cuando lo cre).
La entrada de resultado es el botn que se presion ej "yes", "ok", "cancel",
"retry" etc.

He aqu un ejemplo de un cuadro de mensaje en la accin. En este ejemplo hemos hecho clic en la
interfaz de usuario por lo que el mtodo mouseLDown ya se ha llamado y creamos el cuadro de
mensaje..

- 203 -

CHAPTER 8

External DLLs

You can call functions in external DLLs from inside your Ruby code. This is done by making use of the
Ruby Win32API extension.
All you do is create an instance of the Win32API class that has all the information about the function
call you want to make. You then execute the Win32API call method to execute the function. All very
straightforward.
Let's take a look in detail about how this is all achieved.

The Win32API Extension


The key to providing access to external DLLs is the Win32API extension. This is installed in your
FlowStone folder in Program Files under \ruby\libraries\win32.
The files are separate from the software but FlowStone knows where to look for them on your PC. If
you are only ever working on the same machine then you don't have to worry about any of this.
However, if you create an exported exe that uses the extension and want to pass this to someone else
then either they will need to have FlowStone installed on their system or you will have to distribute
the \ruby\libraries\win32 folder (including the ruby and libraries parent folders).
The ruby parent folder should then be inside the same folder and at the same level as your exported
exe as shown in the picture below:

The first thing you need to do is tell Ruby you want to use the Win32API extension. This is done by
calling the Kernel method require:
require "Win32API"

Creating a Function Object


Before you can call a function in an external DLL you need to create an instance of the Win32API
class. The resulting object must have all the information it needs about the target function before it can
be used to make the call.

- 204 -

RUBY COMPONENT
To create a Win32API object:
callObject = Win32API.new( library, functionName, inTypes, outType )
The input parameters (shown in italics above) are as follows:
library
This is the name of the dll that contains the function you want to call. You don't need to add the .dll file
extension so you can leave that off if you wish. If you don't specify a path then the software will look for
the dll in the following places:

the folder from which the application executed

the current folder

the Windows system folder (e.g. c:\windows\system or system32)

the Windows folder

the folders that are listed in the PATH environment variable

functionName
This is the name of the function you want to call. It must be exactly as it is written in the dll and is case
sensitive.
inTypes
This defines the number of inputs to the function and their types. Each parameter is represented by a
single character. You can use a Ruby array with each element as a character ( e.g. ['I','n','c'] ) or you
can use a string ( e.g. inc ).
The types you can use are as follows:
I or i

- integer

L or l
P or p
S or s

- long
- pointer (including char* buffers)
- string (const char* only)

V or v

- void

For constant strings use 'S'. For string buffers that might be modified by the function call use 'P'.
outType
This defines the output type. This is a single character and can be any of those shown above including
'v' (upper or lowercase) to represent a void return value.
As an example we're going to use the GetCursorPos function in user32.dll so our Win32API object
would be created as follows:
getCursorPos = Win32API.new("user32", "GetCursorPos", ['P'], 'V')

- 205 -

CHAPTER 8

Making the Call


Once you have your object you are ready to make your function call. To do this we use the Win32API
method call and pass it a set of parameters that match the ones we supplied when we created the
object.
If your function call modifies the input data passed to it then you need to allocate the memory for that
data before passing it to the function.
In the example we've chosen the GetCursorPos function takes an LPPOINT which is 8 bytes. So we
need to create a string with 8 characters to allocate this memory. We can then unpack this after the call
has been made to extract the x and y coordinates we're after.
Here's how everything looks when it's put together:

We added a Tick25 so that we can watch the coordinates change as we move the mouse.
Here's another example:

This will show a message box whenever the trigger button is pressed. The input parameters to the
MessageBox call are parent window, message, title, type. Notice that the message and title are passed

- 206 -

RUBY COMPONENT
as strings. You don't need to do any packing. We use 'p' in the input types because these strings are
char* values, not constants.
Here's one final example. This shows how to retrieve a string value from a function call.

We're using a call to GetUserName to return us the name of the current user. For this we have to
create a buffer for the function to put the name into and also pass a variable to send the buffer size
and receive the length of the string sent back.
To create a suitable buffer we just need a Ruby string of sufficient size. To set up the variable to send
the buffer size we have to create a 32bit unsigned int. This we do using the pack method of the Ruby
Array class. We put the number we want to initialise the int with in an array ([buf.length] ie. [260]). We
call pack on the array passing 'L' meaning 32bit unsigned int. See the Ruby documentation for more
on the Array Pack method.
You can see that the buffer returns the name of the user, Fred in this case.
The size of the returned string is placed in 'len'. This is a 32bit unsigned int remember so to convert it
to a Ruby Int we need to unpack it. The result of calling unpack is an array with the string size as the
first entry. We can see the size is 5, the four characters in 'Fred' and the string null terminator.

Distribution
If you plan to distribute any exported exes or plugins that use an external DLL you must ensure that
the DLL is distributed with it. You must also distribute the ruby\libraries\win32 folder that is located in
your FlowStone install folder. You need to have a folder called ruby in the same folder as your exported
file. Inside this folder should be a libraries folder and inside that you place the win32 folder and all its
contents. Without these your export will not function correctly.

- 207 -

CHAPTER 8

MIDI

When you send MIDI data to a Ruby component it is represented by an instance of the MIDI class.
Using Ruby you are then free to process this MIDI object in any way you like. You can create new MIDI
objects and you can send objects out of the Ruby component to play a synth in your schematic or
somewhere else.

Reading MIDI Objects


The MIDI class is a very straightforward. A single instance of the class represents one individual MIDI
message. FlowStone handles MIDI channel messages and MIDI system exclusive messages.

MIDI Channel Messages


MIDI channel messages are defined by four properties:
Status
Channel
Data1
Data2

the type of message eg. note on, program change etc.


the MIDI channel on which the message was transmitted (1-16)
first piece of status dependent data associated with the message
second piece of status dependent data associated with the message

We won't go into the MIDI specification in any great detail here. If you're not familiar with it then there
are plenty of good resources online.
To look access these properties for a MIDI object, call the to_array method. This will give you a ruby
array with the above properties as the elements, listed in order.

- 208 -

RUBY COMPONENT
In the above example we're playing a middle C. You can see that the MIDI message shows 144 for the
status (ie. NOTE ON) and 1 for the MIDI channel. For MIDI note on and off messages Data1 gives you
the note number (60 = middle C) and Data2 gives you the velocity (127 is maximum velocity).

MIDI System Exclusive


MIDI system exclusive messages (or sysex for short) are single chunks of data expressed in
hexadecimal (Hex) form. A sysex hex string starts with F0 and is terminated by F7. The data in
between can represent mostly anything that a synth manufacturer may want to send or receive from
their MIDI device.
Again, we won't go into the details of sysex here, we'll just explain how you can manipulate it within a
Ruby component.
When a MIDI object containing sysex arrives at a Ruby component you can look at it using the
to_array method. This will give you a Ruby array containing two entries. The first is the sysex hex data
string and the second is the number of hex bytes in that string (as each byte is two characters this
number will of ocurse be half the length of the string).

The above example shows how to look at the data in a system exclusive message. You can see the
array with the hex data as the first entry.

- 209 -

CHAPTER 8

Creating MIDI Objects

You can create your own MIDI messages using the MIDI class. This is done differently depending on
whether you want a MIDI channel or system exclusive message.

MIDI Channel Messages


To create a MIDI channel message you need to supply the four properties mentioned above as inputs
to the new method.
The example below shows how to create a NOTE ON message for middle C and send it out.

Ideally you'd want to create a note on together with a note off shortly after, so that you get a note of a
particular length. To do this you use the event scheduling capabilities of the Ruby component.

The example above will play a middle C at full velocity lasting a quarter of a second whenever you
press the trigger button. We need to make use of the optional time input to the event method here.
This gives us the current time and we schedule the 'off' MIDI event to be sent at time now + 0.25
seconds.

- 210 -

RUBY COMPONENT
MIDI System Exclusive
To create a MIDI sysex message you simply provide the sysex string to the new method.
The following example shows how you do this. You can see that we've sent the sysex message out
and the Sysex To String component has deciphered it.

- 211 -

CHAPTER 8

Frames

FlowStone processes high data rate signals such as audio using Streams. These allow you to perform
one-sample-at-a-time processing at rates of 44.1Khz and beyond with minimal compromise in
performance.
Frames allow you to process this data via the Ruby component without losing a single sample.
Because of the high data rates involved you can't do this processing one sample at a time the
processing overhead would be way too much. What we can do is give you access to the data in
batches of samples. We call these batches Frames.
Processing frames in Ruby can never compete with the speed of streams, so there is a performance
cost. However, if squeezing everything out of your cpu is not that critical then, together with Ruby,
Frames provide a very flexible way of analysing high data rate signals.

Mono to Frame
The Mono To Frame component takes Mono stream data and delivers it one frame at a time in precise
sync with the stream. The example below shows how you can use this.

The component produces instances of a Frame class. These are generated every time a frame of
samples is requested from ASIO or Direct Sound. The size of the frame depends on the ASIO or Direct
Sound setup you have.

- 212 -

RUBY COMPONENT

The Frame Class


The Frame class encapsulates a frame of samples. Frame objects can be easily manipulated inside a
Ruby component.

Reading Sample
There are two ways to access the individual samples. You can use the element reference operator ie.
square brackets to access a particular sample:
myFrame[i] gives you the sample at index i in myFrame
If you need access to the whole frame of samples you can convert it to an array:
myFrame.to_array gives you the samples in a Ruby array
There's a little bit of an overhead in converting to a Ruby array. However, if you plan on manipulating
all the samples then it's probably more efficient to convert to a Ruby array and do the processing on
the array than it is to access each sample individually.

Writing Samples
In the same way that you can read a single sample you can also write to a single sample:
myFrame[i] = 3.0 assigns 3.0 to the sample at index i in myFrame
If you want to assign an array of Ruby Floats to a Frame then you'll need to create a new Frame
object. Here's how you do it:
f = Frame.new smpls creates a new Frame from the array called smpls

- 213 -

CHAPTER 8

Frame To Mono
The Frame To Mono component takes Frames and passes them back into the Mono stream. Using this
component in conjunction with the Mono To Frame component allows you to apply Ruby processing
within a Mono section.

In the example above we're taking a sine wave signal and halving the amplitude before passing it back
into the Mono stream. The Frame is converted to a Ruby array and then each element in the array is
multiplied by 0.5. The resulting array is passed out.
Note that we didn't pass out a new Frame object. This is because the Mono To Frame component can
take a Ruby array as input too.
We could easily have created a Frame object too by replacing the output a by
output (Frame.new a).

- 214 -

RUBY COMPONENT

Frame Sync
If you just want to generate a signal then you don't need the Mono To Ruby component, you just need
to generate Frames from your Ruby component and pass them to the Frame to Mono.
However, what you do need is a way to sync the Frame output with the Mono stream and also a way of
finding out the required frame size. This is where the Frame Sync component comes into play.

The example here shows a generated sine wave. The Frame Sync component sends the required
Frame size to the Ruby component at the time when a Frame needs to be generated. The Ruby
component then creates an array of samples, in this case based on a sine wave and sends this out
immediately.

- 215 -

CHAPTER 8

Processing Frames in a DLL


You can process Frames in an external DLL. This is useful if you need maximum performance or if you
have existing algorithms written in another language that you want to make use of.
To show you how this is done we've created a function, written in C, for a simple delay effect and put
this in an external DLL. The code for this function is as follows:

- 216 -

RUBY COMPONENT
To call this from FlowStone we need to use a Ruby component and the Win32API class. See the
earlier section on External DLLs for more information about using Win32API.

We use a circular buffer for the delay and this together with the current buffer index needs to be
managed on the FlowStone side. For the buffer we use a Frame object.
You can see from the C code of the external DLL that the function is called delayFrame and it takes 5
ints followed by two pointer inputs.
In the Call method we pass ints directly. So the size of the frame, the current index and the delay
amount are all passed without any need for conversion. The other two int values are pointers to the
Frame data for the current frame and the circular buffer. These are accessed via the data method of
the Frame class. This method gives you a Ruby int value which is the memory address of the raw
sample data. By doing this we don't need to convert between the underlying sample data and Ruby
which is much more efficient.
The remaining two inputs are Float values. Floats are not handles explicitly by Win32API so you need
to pack them into 32 bit floats.
That's all there is to it. The call is made and the external function updates the data in the current Frame
object and the circular buffer.
NOTE: if you want to create a standalone that uses a dll in this way then see the External DLLs section
for details on what you have to include in your distributiion.

- 217 -

CHAPTER 8

Ruby Limitations

Our main aim for Ruby in FlowStone was to provide a scripting mechanism that binds tightly into our
graphical programming environment and allows you to do things that were not possible before or were
very difficult previously using graphical programming techniques.
Ruby integration brings a massive number of benefits but this is Ruby within FlowStone and as such
there are some limitations when compared with using pure Ruby via text files and the command line.
The vast majority of people will be able to use Ruby in FlowStone without encountering any of these
limitations. However, for some advanced users of Ruby there are certain aspects of the
implementation in FlowStone that you should be aware of as they may restrict some of the things you
might want to do. This section covers those limitations.

Single Interpreter
The first thing to note is that there is a single interpreter for each instance of FlowStone. This means
that if you open two schematics within the same exe they will share the same interpreter the same
Ruby airspace so to speak.
Individual Ruby components are always completely self contained so any instance variables you use
there relate only to the Ruby component in which they are declared. However, if you declare global
variables or classes in one schematic then they will be visible in the 'Ruby space' of the other
schematic.
Most of the time this will not be an issue. It's just worth knowing in case you happen to run into any
behaviours that may arise from this.

Standard Ruby Libraries


The standard installation of Ruby comes with a number of libraries. We don't currently supply all of
these with FlowStone. In fact we only supply one, win32 (used for connecting to external DLLs).
The main reason for this is that if you choose to export to a standalone exe or plugin, because the
libraries are external to Ruby you would need to distribute the library files alongside your export.
We hope to be able to provide an automatic way of dealing with this in the future so that you don't
need to think about dependencies on libraries instead it would all be dealt with in the export process.
This would allow us to be able to offer the full set of standard libraries.

- 218 -

RUBY COMPONENT

Declaration Order
Because all Ruby components share the same interpreter you can declare globally available classes
and variables in one Ruby component and they will be available in all others. This is a very useful
feature. However, you need to make sure that when you re-load your schematic, the declarations
occur before they are needed. To do this the Ruby component that contains the declarations must be
interpreted before any Ruby components that use those declared items.
When FlowStone loads a schematic it starts with the top-level schematic and then loads each
component on that schematic in the order they were added. When it reaches a module it will load the
schematic for that module and the process continues in the same way.
The earlier a Ruby component appears in this ordering the earlier it will be interpreted. So let's say that
you have some class declarations in a Ruby component that are only used in a particular module. If
you ensure that the Ruby component is the first component in the schematic for the module then all
will be fine.
Unless you really plan ahead and add the Ruby component for your declarations first it's likely that
you'll find yourself in a situation where you need to change the order of components so that it's the first
one. You can do this by selecting all the other components, cutting them and pasting them back in.

Declaration Persistence
The Ruby interpreter is running constantly. Because of this any declared classes, global or instance
variables and constants will remain declared even if you delete the code for them. Currently the only
way to flush all the declarations is to save your schematic and restart FlowStone.

Gems
All seasoned Rubyists will know about Gems. These are packaged libraries of code that you can install
and use to extend Ruby beyond its standard capabilities.
If you have a Gem you want to use with FlowStone then if it is implemented in pure Ruby you should
have no problem using it. You will need to place the ruby files for the gem in a folder and then
reference that folder when you write your 'require' statement. You could also put it in the FlowStone
install folder under ruby/libraries.
If your Gem is written partly or wholly in C then it needs to be (or have been) compiled using Visual
Studio in order for it to work with FlowStone. If it has been compiled with mingw (as many Windows
gems are) it is unlikely to work.

- 219 -

CHAPTER 8
The same distribution issues apply to gems as for the standard libraries. If you decide to export your
creation and it uses a gem then you need to distribute the gem alongside it. You must also make sure
that the paths to the gem are all taken care of or it won't load.

Gems and VST Plugins


Currently VST plugins generated by FlowStone cannot make use of Ruby extensions or Gems.

- 220 -

RUBY COMPONENT

Ruby DLL

Ruby functionality is provided by an external DLL. This dll is called msvcr90-ruby191.dll. In order to
use this with FlowStone it has to be compiled using Microsoft Visual Studio 2008.
To comply with the Ruby licence agreement we provide details here of how to build it.

Changes
We have made no changes to the Ruby source that change the way that the Ruby interpreter
functions. However, we have added a small section of code into eval.c that we use to reference one of
our own objects.
The code is:
void* g_pInterpreter = 0;
void* ruby_interpreterPtr(void) { return g_pInterpreter; }
void ruby_setInterpreterPtr(void* ptr) { g_pInterpreter = ptr; }
This should be inserted into eval.c just after:
#include "eval_jump.c"

This change does not affect the way Ruby works or add to it in any way. It merely allows us to store an
object within the scope of the dll.

- 221 -

CHAPTER 8

Building the DLL


You must have a version of Microsoft Visual Studio 2008 installed before you can proceed.
1.

Download the ruby source code from here:


http://mirrors.ibiblio.org/ruby/1.9/ruby-1.9.3-p0.zip

2.

Unzip to a folder eg. C:\ruby-src

3.

Open the Visual Studio/C++ Command prompt as Administrator

4.

Run vcvars32.bat

5.

Move into C:\ruby-src\ruby-1.9.3-p0

6.

In the command prompt execute the following instructions:


win32\configure.bat
nmake
nmake test
nmake install

The msvcr90-ruby191.dll binary will be located in the C:\ruby-src\ruby-1.9.3-p0 folder.

- 222 -

DSP CODE COMPONENT

9 DSP Code
Component
THE

ULTIMATE LOW -LEVEL

DSP

- 223 -

TOOL

CHAPTER 9

DSP Coding
Para la mayora de las tareas, el enfoque de la programacin grfica de
FlowStone se adapte a sus necesidades muy bien. Sin embargo, cuando se
trata de DSP de programacin se requiere un enfoque ms algortmica. Para
este propsito tener el componente de cdigo.
Usando el componente de cdigo que puede hacer cualquier tipo de
procesamiento que te gusta.
El componente utiliza un muy pequeo conjunto de comandos que le
permite traducir algoritmos DSP en un cdigo muy simple. El cdigo es
luego compilado dinmicamente en binario que se ejecuta muy rpido para
un mximo rendimiento.
The DSP Code Component

Encontrar el componente de cdigo de DSP en el grupo Cdigo de la caja de


herramientas. El componente proporciona un rea en la que puede escribir su
cdigo. Haga clic en el elemento para ir al modo de edicin. Usted
permanecer en el modo de edicin hasta que haga clic o pestaa de
distancia.
Inputs and Outputs
Con el fin de vincular el cdigo en un esquema que necesitar algunas entradas
y salidas.
El componente de cdigo es utilizado para el procesamiento de seales de
audio por lo que slo le permite crear Poly, Mono, Stream o corriente booleana
entradas y salidas. Hay ocho comandos para aadir entradas y salidas:
polyin, polyout, monoin, monoout, streamboolin, streamboolout, streamin,
streamout

Usted necesita asegurarse de que usted da a cada entrada y salida de un


nombre y que cada lnea de cdigo se termina con un punto y coma. Una
vez que la sintaxis correcta se ha aplicado, la entrada o salida aparecern
automticamente al hacer clic o pestaa de distancia.
Entradas / salidas booleanas Arroyo le permiten procesar o recibir datos de
la mscara booleanos. Vea las secciones sobre las expresiones y
declaraciones condicionales para ms informacin sobre las mscaras.

- 224 -

DSP CODE COMPONENT

Los nombres de entrada / salida se convierten en variables que se pueden


utilizar en el cdigo siguiente. Las variables tomarn cualesquiera valores
vienen en o salir al vincular el componente a otras partes de un esquema.
Si nada est vinculado a una entrada, la variable asumir un valor de cero.
Un ltimo punto a destacar es que es una buena idea utilizar streamin y
streamout lugar de las alternativas poli y mono como su cdigo puede ser
utilizado en las secciones tanto poli y mono.
Syntax Colouring
Los colores de edicin de cdigo para indicar la sintaxis correcta. Entrada / Salida de comandos,
operadores y soportes son purple, variables son blue y loa tipos de datos y funciones son green.

Si en algn momento el coloreado de sintaxis se detiene y todo el


texto despus de ese punto se vuelve negro, esto es una
indicacin de que hay un error en la sintaxis en ese punto.

- 225 -

CHAPTER 9

Editor

Los soportes de editor de cdigo copiar y pegar a travs de las teclas de acceso
directo estndar (CTRL + C, CTRL + V). A deshacer local tambin se implementa
para que pueda deshacer y rehacer mecanografa, supresiones, pega, etc
la accin de deshacer locales se aplica a los cambios que realice en una sesin
especial (Entre clic en el componente y hacer clic de distancia). Despus de que
todava se puede deshacer a travs del sistema de deshacer de la aplicacin,
pero esto slo va a volver a travs de las modificaciones realizadas entre
ediciones.
Puede desplazarse con la rueda del ratn o las teclas del cursor. Puede pgina
utilizando el PGUP y las teclas AV PG. CTRL + INICIO ir a la parte superior y
CTRL + FIN ir a la parte inferior.
Local Variables

Adems de los datos que extrae de su esquema a


travs de
entradas tambin se pueden crear variables locales.
Estos son definida exactamente de la misma manera
que las entradas y salidas.
No es slo un tipo de la variable en el momento y
que es
un flotador. Esto representa un nmero de punto
flotante. Al igual que con las entradas y salidas que
necesita para dar a la variable un nombre y terminar
el mandato con un punto y coma.
Las variables
pueden ser inicializados al mismo
float x=3;
tiempo que se declaran. Usted puede escribir:

Y x se le asigna el valor 3. Variables que no se inicializa explcitamente


se ponen a cero.
Puede declarar mltiples variables en una sola lnea de
cdigo.
por ejemplo:
float x,y,z;
Crear tres variables x, y, z.

- 226 -

DSP CODE COMPONENT

Assignments

Despus de haber configurado sus entradas,


salidas y las variables locales a continuacin,
puede pasar a la implementacin de su
algoritmo DSP.
Para asignar un valor a una variable o enviarlo a
una salida, utilice el operador de igualdad =.
Puede asignar valores fijos o se puede utilizar
una expresin regular para calcular el valor.

- 227 -

CHAPTER 9

El ejemplo de la derecha muestra cmo se pueden combinar


todos los elementos expuestos hasta ahora para crear un
filtro moog simple.

- 228 -

DSP CODE COMPONENT

Expressions

Las expresiones pueden utilizar una combinacin de operaciones


matemticas y funciones integradas. A continuacin se presenta un
resumen completo de los operadores y funciones que se admiten en la
actualidad.

sin1(a)

Mathematical sine, cosine and tangent

cos1(a)
tan1(a)

The 1 indicates that the input value a is converted to a value in the range 0-1
and not 0 and 2 . So 0.5 would be equivalent to and 1.25 would be
equivalent to /2

log10(a)

Logarithm (base 10) of a

max(a,b)
min(a,b)

rndint(a)

*
+
/

The numerically largest (max) or smallest (min) of a and b

Rounds a to the nearest integer value above or below (so 1.4 becomes 1 but
1.6 becomes 2)

Standard mathematical operations

Calcula el resto despus de dividir el lado izquierdo


por el lado derecho

>
>=
<
<=

Los operadores de comparacin Estos generan una


mscara basada en el resultado de la comparacin

&

Operador AND. Utilice esta opcin para


aplicar una mscara

- 229 -

CHAPTER 9
One limitation of the code component is that you can only have 8 successive operations in an
expression. For example, the expression:
a = 0+1+2+3+4+5+6+7+9+10;
is not allowed because there are 9 addition operations in a row. You can easily get round this by
splitting the expression up into smaller sections using brackets ( and ). For example:
a = (0+1+2+3+4)+(5+6+7+9+10);

Conditional Statements
Because FlowStone uses SSE to process four channels at a time, conditional statements can't be
implemented in the traditional way. However, you can achieve the effect of a conditional statement by
using a mask.
A mask can be applied to all four channels at the same time. Each channel is affected differently.
FlowStone includes conditional operators that generate exactly these kind of masks.

For example, the following FlowStone code:


x=x-

(x >= 1) & 1.0;

is equivalent to the following C/C++ code:


if( x >= 1 ) x = x 1.0;
The >= operator creates a mask. The mask will effectively be true for each channel that meets the
condition and false for each one that doesn't. The bitwise & will return a value of 1.0 or 0.0 for each
SSE channel based on the mask.

Comments
You can leave comments in your code. These are just snippets of text that remind you of what a
particular part is doing. Comments take up no processing time. They can be put at the end of a line or
they can have a whole line to themselves
For example:
index = index + 1; //Increment index
//Increment index
index = index + 1;

- 230 -

DSP CODE COMPONENT

Advanced Features

Arrays
Usted puede declarar matrices en el componente de cdigo. Estos actan como amortiguadores que se puede utilizar
para almacenar los valores del pasado, por ejemplo, o para utilizarlos como una tabla de bsqueda.
An array is declared as follows:
float buffer[100];
This defines an array called buffer which is 100 floats (4x100=400 bytes) in size.

Initialising
By default all the entries in the array are set to zero. You have two other options for initialising an array:
1. Set all entries to a particular value
float buffer[100] = 0.62;
2. Randomise the contents of the array
float buffer[100] = rand(-0.5,0.5);

Accessing
To access a particular entry in an array use the array specifiers (square brackets) [ and ].
out = buffer[25] ;
buffer[6] = 3.14159;
Note that the array index is zero based so in the example above buffer[0] would be the first entry and
buffer[99] would be the last entry in the array.
You must make sure that you use indexes that are within range for the array, failure to do so will
produce unpredictable results and could even crash the software.

- 231 -

CHAPTER 9

Hop
There are some calculations that dont need to be calculated for every sample, its sufficient to
recalculate for every 4 th sample say. For this purpose we have the hop command.
The syntax for the hop command is as follows:
hop(8)
{
< code in here is executed only for every 8th sample >
}
Hops must be powers of 2 and the maximum hop length is 4096 so values of
2,4,8,16,32,64,128,256,512,1024,2048 and 4096 are the only acceptable values.

Loop
Sometimes you need to execute the same code several times, changing one or two parameters on
each pass. You can do this in the code component using the loop command.
Heres the syntax:
loop(10)
{
< code in here is executed 10 times in succession >
}
You could use a loop to initialise an array for example:
float index;
float buffer[10];
loop(10)
{
buffer[10] = sin1(index);
index = index+0.1;
}

Usted debe tener cuidado de no utilizar demasiados bucles o lazos con


muchas iteraciones, ya que pueden provocar un aumento significativo en la
CPU.
Tambin para algunos bucles (como el ejemplo de inicializacin array) slo
desea que se ejecutan una vez, aqu es donde las etapas se presentan en.

- 232 -

DSP CODE COMPONENT

Stages
The code is split into four parts called stages. These are numbered 0,1,2 and 3.

Stage(0)
Stage(0) runs only for the first sample and is intended for processing that you only want to happen at
the very start, usually to set up other parameters that you will then use on every sample.
For the example weve just been looking at we could put the array initialisation into Stage(0) and it will
run only once.
Defining the stage is very easy:
stage(0)
{
< code in here is executed only for the first sample >
}

Stage(2)
We'll jump to Stage(2) now because this is the default stage. Any code written outside of a Stage
definition is assumed to be Stage(2).
Stage(2) code is executed for every sample (including the first) and happens after Stage(0).

Stage(1) and Stage(3)


These two stages are only used for implementing delays. They are needed to make sure that data
flows correctly when one or more delays are chained together in a feedback loop.
The software executes the code in stage order so after Stage(0) Stage(1) goes next.
Stage(1) should be used to move data from internal variables (most likely a buffer) and the outputs.
This ensures that all delays have a consistent output value before doing any calculations.
Next the standard Stage(2) is executed. Any code that needs the outputs of any delays will have the
values they need now.
Finally Stage(3) is executed. This should be used to move data from the inputs to internal variables
(again most likely a buffer) and perform any calculations.
Note that each stage is executed for the whole of the schematic before proceeding to the next stage.

- 233 -

CHAPTER 9
An example of how to use Stage(1 ) and Stage(3) for a delay is shown below.
streamin in;
streamout out;
streamin delay;
float mem[44100];
float index;
stage(1)
{
out = mem[index];
}
stage(3)
{
mem[index] = in;
index = index + 1;
index = (index<delay)&index;
}
Note that because the transfer to outputs in Stage(1) occurs before the buffer update in Stage(3) this
will always produce a minimum of 1 sample delay. If you need a delay that will work correctly when the
input delay length is zero samples then you can implement this by modifying the above code as
follows:
stage(1)
{
out = mem[index]&(delay>0) + in&(delay==0);
}

- 234 -

DSP CODE COMPONENT

Debugging

Using Syntax Colouring


Weve already seen that the first indication youll have that your code is incorrect will be a discontinuity
in the syntax colouring. The following example shows this.

You can see that the colouring stops with the sin function. This indicates that there is something wrong
with the expression. Sure enough we forgot the 1, the line should read:
a = sin1(in);
If we make this correction everything becomes coloured correctly.

Checking the Assembler


The code component converts the high-level language that it uses into x86 assembler prior to
compiling. You can look at this assembler code by connecting a Text component to the String output of
the code component.
If you understand assembler (and even if you dont) it can be useful to examine this code to make sure
that nothing out of place is happening.
When there is a syntax error the assembler code will only be generated up to the point at which the
syntax broke down.
If the syntax is correct then the other possible problem could be the limitation on expressions
discussed earlier. This is much more difficult to spot in the code because the colouring will indicate
correct syntax. However, a quick look at the assembler code can identify this type of problem.

- 235 -

CHAPTER 9
The example below shows exactly this. The way to spot the problem is to look for xmm999 in the code.
If this happens then you know to look at your expressions to make sure that the 8 consecutive operator
limit has not been exceeded.

- 236 -

DLL COMPONENT

10 DLL Component
THE ULTIMATE IN FLEXIBILITY AND PERFORMANCE

- 237 -

CHAPTER 10

Introduction

The DLL component allows you to call your own custom code which you write in C/C++ and compile
into an external dynamic link library (DLL).
The DLL can be kept external to the software or you can choose to embed it directly inside a DLL
component so it's completely self contained. This allows you to create your own components which
you can easily share with others.
You can of course already make your own components from modules in FlowStone. However by using
compiled code in a separate DLL you have the advantage of huge flexibility and streamlined
performance. You can also keep any proprietary algorithms secret as, unlike a module which is build
from lower level components, the compiled code is not readable within a schematic.
For the rest of this chapter we assume that you have an understanding of how to program in C/C++
and how to build DLLs using a compiler such as Visual Studio.

- 238 -

DLL COMPONENT

The Component

The DLL component has 6 inputs and 3 outputs initially.


The Dll and Func inputs are for the path to the dll and the name of the function you want to call. The
Embed input determines whether the dll is left external to the software or whether it is to be embedded
into the component.
The 3 boolean outputs will indicate whether the inputs that lie opposite them have succeeded. So the
first output will be true if the dll was found, the second will be true if the function was found within the
dll and the third will be true if the dll can be successfully embedded into the component (some dlls
can't be embedded because they depend on other dlls more on that later).
The Reset input disconnects the software from the dll. This is useful if you want to make changes to
your dll and then retry them in your schematic without having to close it. Note that all DLL components
that use the dll will be disconnected because otherwise the dll would remain locked and you wouldn't
be able to rebuild it.
Finally the Exec inputs allow you to call the function in the dll. Two inputs are provided depending on
whether you want to execute the call based on a green data trigger or a Ruby event.

Defining Inputs and Outputs


In most cases you'll want to be able to send data to and receive data from the dll. You define this data
by dragging the gripper control on the component itself. This is located below the very last input
(similar to the Ruby component).
Dragging the gripper control down will create more inputs and outputs.
You'll notice that connectors are added in pairs one input and one corresponding output.

- 239 -

CHAPTER 10

We add the connectors in pairs in order to keep things simple and also because for Ruby Frame types
you must have a matching input and output.
You still have all the flexibility you need. If you need an input but not an output, just ignore the
corresponding output and vice-versa.

Connector Types
El componente DLL soporta 9 tipos de datos de piedra variable: float, int, String, Float Array, Int.
Array, de Cuerda Array, Boolean, Bitmap y marco Ruby.
Con este subconjunto se puede hacer casi cualquier cosa que usted necesita.
Al crear nuevas entradas y salidas como se ha descrito anteriormente, el tipo de conector aadido
ser el mismo que para la anterior (o un flotador si no ha agregado ninguna todava).
Para cambiar el tipo de conector, haga clic en la entrada y elija el nuevo tipo en el men emergente.
Cuando se cambia el tipo de entrada de la salida correspondiente cambiar en consecuencia.

- 240 -

DLL COMPONENT

Connector Labels
Con el fin de hacer que sea ms fcil recordar lo que cada conector es para usted puede agregar etiquetas. Para ello
primero seleccione el componente a continuacin, mantenga CTRL y se ciernen sobre el lugar donde las etiquetas de
entrada iran. Ver la esbozo de un cuadro de edicin aparece.

Click in the box, type a label then hit return. The label will appear on the component. You can change
the label in exactly the same way.
Use the TAB key to move between labels and edit several at a time.

- 241 -

CHAPTER 10

The DLL

Ahora que hemos visto el componente volvamos nuestra atencin a la dll. Como hemos visto, la DLL
componente llama a una funcin determinada de la dll. Esta funcin debe tener una declaracin muy especfica
que va de la siguiente manera:
extern "C" __declspec(dllexport) void myFunction( int nParams, int* pIn, int* pOut )

nParams le indica cuntos parmetros se estn pasando. Este es igual al nmero de entradas que
creado en el componente DLL.
pIn es una matriz que contiene los valores de entrada que se han pasado al componente. Los contenidos
de cada entrada depender del tipo de conector.
pOut es una matriz que se utiliza para pasar valores de nuevo al componente. Cada entrada de mapas en una salida en
el componente. A gestionar los contenidos de esta matriz, pero la propia matriz se crea para usted por FlowStone.

La matriz pOut se llena con ceros para comenzar con (cada entrada se pone a cero). La nica excepcin a esto es si el
tipo es Marco Rub, en cuyo caso la salida de los puntos de entrada en el mismo valor que la entrada de entrada.
Vamos a hablar acerca de los tipos de datos de prxima y echar un vistazo a cmo se accede a la informacin que pasa a
ustedes desde el componente DLL. Tambin vamos a ver cmo se pasa los datos al componente DLL utilizando la matriz
de puchero.

Data Types
The pIn and pOut arrays se declara como int * pero cada entrada no es necesariamente un int. El valor cambia
dependiendo del tipo de datos y llegar a estos datos puede que tenga que hacer un poco de colada C.
More on that in a moment.
En primer lugar vamos a ver los diferentes tipos de piedra variable y cmo se representan en C cuando llegan a
su dll. Lo hemos visto en la seccin anterior que el componente DLL le permite utilizar 9 tipos de datos diferentes. Estos
se representan en C como se muestra en la tabla siguiente.

- 242 -

DLL COMPONENT
FlowStone Type

C Representation

Int

int

Float

float

Boolean

The first byte of the entry is a bool

String

char* an array of chars which is zero terminated

Float Array

float[n+1] where n is the number of array entries and the first 4


bytes is an int giving you the number of entries

Int Array

int[n+1] where n is the number of array entries and the first 4 bytes is
an int giving you the number of entries

String Array

char*[n+1] where n is the number of array entries and the first 4


bytes is an int giving you the number of entries

Bitmap

unsigned char[n+12] where n = width x height x channels. The first


4 bytes give you the width, the next 4 bytes give you the height and the
next 4 bytes give you the number of channels (all as ints).

Frame

float[n+1] where n is the number of array entries and the first 4


bytes is an int giving you the number of entries. This is the same as for a
Float Array

Let's take a look at each type in more detail.

Ints
Digamos que tenemos un componente DLL donde input 'x' se ha definido como un conector Int.. La matriz PIN ya
est definido como una matriz de enteros de modo de llegar a este valor en C de todo, slo necesitamos hacer lo
siguiente:
int value = pIn[x];

Si, pues, hemos querido establecer el valor de salida correspondiente que haramos
esto:
pOut[x] = value;

- 243 -

CHAPTER 10

Floats
For the Float type we need to cast to a C float like this:
float value = *((float*)&pIn[x]);

Tenga en cuenta que no podemos convertir el valor del PIN [x] a un flotador, ya que esto sera convertir un int a un
flotador. Los 4 bytes que forman el valor int es necesario abordar como si fueran 4 octetos que componen un flotador.
Por lo tanto tenemos que echar la direccin del valor a un puntero de flotador y luego eliminar la referencia de eso..
Para configurar la salida correspondiente que tenemos que hacer el mismo elenco de la matriz
Faneca:
*((float*)&pOut[x]) = value;

Booleans
Tipos booleanos convierten en un tipo C bool. A bool en C es un solo byte. Por ello, lanzamos la siguiente manera:
bool value = *((bool*)&pIn[x]);

Para configurar la salida correspondiente que tenemos que hacer el mismo elenco de la matriz
Faneca:
*((bool*)&pOut[x]) = value;

Strings
From the table you'll see that FlowStone Strings are represented as a zero terminated array of chars.
In this case we need to cast as follows:

char* value = *((char**)&pIn[x]);

Hasta ahora hemos tratado con los datos cuyo valor est contenido dentro de los 4 bytes que
definen el elemento de matriz. Sin embargo, para las cadenas de valor es un puntero a otros datos
es decir, una matriz de caracteres.
As que cuando se trata de enviar una cadena a la matriz de salida que necesitamos para crear
nuestra propia matriz de caracteres. La gestin de la memoria nos vamos hasta usted.
Esta vez, para ajustar la salida correspondiente que tenemos que hacer ms que asignar un valor.
Algo parecido a lo siguiente sera tpico de cuerdas.:

- 244 -

DLL COMPONENT
// Delete previous string and reset pOut entry
if( pOut[x] )
{
delete *((char**)&pOut[x]);
pOut[x] = 0;

}
// Create new string (assume we have declared 'length' add 1 for null terminator)
char* s = new char[length+1];
// {initialise the string here}
// Don't forget to null terminate
s[length] = 0;
// Assign to correct entry in the output array
*((char**)&pOut[x]) = s;

Si est utilizando la misma cadena de longitud cada vez entonces podra crear una vez y ahorrar tener que eliminar y
hacer uno nuevo cada vez. Si est trabajando con las cadenas de una longitud mxima entonces tambin podra
seguir con una cuerda y mover el terminador nulo en cada ocasin. Todo depende de usted..

Float Arrays
Estos se representan como una matriz C de flotadores pero con una entrada adicional en el inicio que proporciona 4 bytes
para almacenar el nmero de elementos de la matriz. As que tenemos dos moldes para hacer, uno para el tamao de la
matriz y otra para la propia matriz:

int size = *((int*)pIn[x]);


float* array = (float*)pIn[x]+1;

Se puede ver que interpretamos la primera entrada como un int que nos da la longitud de la matriz. La propia matriz a
continuacin, comienza en la segunda entrada, por lo tanto, el '+1'.
Para establecer el valor de la produccin que tenemos que crear una nueva matriz. Este es
un proceso similar como para cuerdas. Una vez ms la gestin de la memoria depende de
usted. He aqu una manera de hacerlo:
// Delete previous array and reset pOut entry
if( pOut[x] )
{
delete *((float**)&pOut[x]);
pOut[x] = 0;

}
// Create new array (assume we have declared 'length' add 1 for size at front)
float* array = new float[length+1];
// Set the size
*((int*)array) = length;

- 245 -

CHAPTER 10
// {initialise the array here}
// Assign to correct entry in the output array
*((float**)&pOut[x]) = array;

This will create a new array each time the function is called. Again, you could create a single array if
you're working with fixed sizes or adjust the array only if you need more storage space.

Int Arrays
Int arrays are handled in an identical way to Float arrays. The only difference is the base type, a C int
in this case. Again, there's an extra entry at the start which provides 4 bytes to store the number of
array elements. So we have two casts to make, one for the array size and one for the array itself:
int size = *((int*)pIn[x]);
int* array = (int*)pIn[x]+1;

You can see that we interpret the first entry as an int giving us the array length. The array itself then
begins at the second entry, hence the '+1'.
To set the output value we need to create a new array. The management of memory is up to you.
Here's one way of doing it:

// Delete previous array and reset pOut entry


if( pOut[x] )
{
delete *((int**)&pOut[x]);
pOut[x] = 0;

}
// Create new array (assume we have declared 'length' add 1 for size at front)
int* array = new int[length+1];
// Set the size
*((int*)array) = length;
// {initialise the array here}
// Assign to correct entry in the output array
*((int**)&pOut[x]) = array;

Esto crear una nueva matriz cada vez que se invoca la funcin. Se podra crear una sola matriz, si se trabaja con
tamaos fijos o ajustar la matriz slo si necesita ms espacio de almacenamiento.

- 246 -

DLL COMPONENT
String Arrays
Matrices de cadenas son probablemente el ms complicado de todos los tipos de datos para trabajar. Usted no slo
tiene que
administrar la matriz, pero tambin hay que gestionar cada cadena de la matriz.
Una matriz de cadenas est representado por una matriz C de char *. Al igual que con las otras matrices, hay un
adicional
elemento en la parte delantera que se utiliza para almacenar el tamao de la matriz.
Acceso a la matriz es similar a flotar y Int. matrices en que hay dos moldes para hacer que, uno para la
tamao de la matriz y una para la propia matriz.:
int size = *((int*)pIn[x]);
char** array = (char**)pIn[x]+1;

You can see that we interpret the first entry as an int giving us the array length. The array itself then
begins at the second entry, hence the '+1'.
To set the output value we need to create a new array and each string that goes in it. Here is one way
of doing this:

// Delete previous array (and contents) and reset pOut entry


if( pOut[x] )
{
int size = *((int*)pOut[x]);
char** array = (char**)pOut[x]+1;

for( int i=0; i<size; i++ )


{
if( array[i] )
delete array[i];
}
delete (char**)pOut[x];
pOut[x] = 0;

}
// Create new array (assume we have declared 'length' add 1 for size at front)
char** array = new char*[length+1];
// Set the size
*((int*)array) = length;
// Create the strings in the array
for( int i=1; i<length+1; i++ )
{
// Create new string (assume we have declared 'stringlen')
char* s = new char[stringlen+1];

// {initialise the string here}


// Don't forget to null terminate
s[stringlen] = 0;
// Add to the sting array
array[i] = s;
}

- 247 -

CHAPTER 10

// Assign to correct entry in the output array


*((char***)&pOut[x]) = array;

Bitmaps
Los datos de mapa de bits tambin se proporciona en forma de matriz, esta vez de bytes (caracteres sin signo). La
matriz comienza con 12 bytes de informacin descriptor de datos. Esto se utiliza para suministrar 3 parmetros int:
ancho de mapa de bits, altura de mapa de bits y el nmero de canales (bytes por pxel).
You can access these values as follows:
int width = *((int*)pIn[x]);
int height = *((int*)pIn[x]+1);
int channels = *((int*)pIn[x]+2);

The number of bytes of pixel data we will have is then the product of these values:
int bytes = width * height * channels;

You can get at the array of pixel data like this:


unsigned char* pData = (unsigned char*)pIn[x]+12;

The data will give us the value for each channel (0-255) for each pixel in the bitmap. The pixel data
runs from top-left across to the right before starting the next line.
EXAMPLE
Let's say we have 3 channels (Red, Green and Blue) and a bitmap that is 10 pixels wide and 4 pixels
high. We will have 10 x 4 x 3 = 120 bytes of pixel data. pData[0] will give you the red component of the
top-left pixel. pData[29] will give you the green component for the rightmost pixel in the top row.
pData[90] will give you the bottom-left pixel red component and pData[119] will give you the blue
component of the very last (bottom-right) pixel.

- 248 -

DLL COMPONENT

Para establecer el valor de la produccin que necesitamos para crear una nueva matriz de bytes. Una vez ms, esto es
muy similar a las matrices y cadenas. Una vez ms la gestin de la memoria depende de usted:

// Create a new byte array (assuming we have already defined bytes)


unsigned char* pNewBytes = new unsigned char[bytes+4*3];
*((unsigned char**)(&pOut[x])) = pNewBytes;

// Set the data descriptors (assume width, height and channels have been defined)
*((int*)pNewBytes) = width
*((int*)pNewBytes+1) = height
*((int*)pNewBytes+2) = channels

// Get pointer to pixel data


unsigned char* pPixelData = pNewBytes+12;
{you then need to initialise your byte data}

This only shows you how to create the data. You may have to provide additional code to manage when
the bitmap data is deleted. For example, you may want to create a new array and then keep reusing it
(as opposed to deleting and recreating it every time). You may then want to delete and recreate it only
when the bitmap changes size. All this is down to you to decide.

Frames
Al manejar objetos Frame Ruby (generados por el Mono a marco componente) puede procesar audio
a una velocidad de muestreo.
Al igual que las matrices de flotador, Marcos se representan como una matriz C de carrozas. Tienen
la misma entrada extra al inicio proporcionando 4 bytes para almacenar el nmero de elementos de
la matriz seguido de la propia red de flotadores. Para separar estos hacemos lo siguiente.:

int size = *((int*)pIn[x]);

- 249 -

CHAPTER 10
float* array = (float*)pIn[x]+1;

A diferencia de matrices de flotador, Marcos utilizan la misma matriz para la entrada y la salida. Esto significa que usted
no tiene que crear una nueva matriz para pasar a la matriz de salida - ya se ha hecho por ti. La razn principal de esto
es que la matriz de salida debe ser el mismo tamao que la de entrada. Sin embargo, tambin hay un beneficio en
trminos de eficiencia demasiado.
As que todo lo que necesita hacer es procesar la matriz de entrada y actualizarlo. Slo tenga cuidado de no asignar un
valor a un elemento de matriz hasta que haya terminado de usarlo o que ha almacenado el valor de lo contrario puede
terminar con el nuevo valor en lugar de la que vino originalmente..

Helpers
El casting puede ser un poco complicado, as que subimos con algunas macros simples que hacen que el acceso y el
establecimiento de las matrices de entrada y salida un poco ms fcil y ms legibles.
Adems, para la mayora de los tipos que usted debe comprobar siempre que el pin [x] o faneca [x] son cero antes de
intentar extraer valores utilizando los modelos anteriores por lo que las macros incorporan esta comprobacin tambin,
lo cual reduce estrellarse.
Las macros se muestran a continuacin.:

#define GETFLOAT(p) *((float*)&p)


#define GETBOOL(p) *((bool*)&p)
#define GETINT(p) p
#define GETSTRING(p) *((char**)&p)
#define GETFLOATARRAY(p) p ? ((float*)p+1) : 0
#define GETINTARRAY(p) p ? ((int*)p+1) : 0
#define GETSTRINGARRAY(p) p ? ((char**)p+1) : 0
#define GETARRAYSIZE(p) p ? *((int*)p) : 0
#define GETFRAME(p) p ? ((float*)p+1) : 0
#define GETFRAMESIZE(p) p ? *((int*)p) : 0
#define GETBITMAPWIDTH(p) p ? *((int*)p) : 0
#define GETBITMAPHEIGHT(p) p ? *((int*)p+1) : 0
#define GETBITMAPCHANNELS(p) p ? *((int*)p+2) : 0
#define GETBITMAPDATA(p) p ? ((BYTE*)p+12) : 0
#define GETBITMAPBYTES(p) p ? *((int*)p) * *((int*)p+1) * *((int*)p+2) : 0
#define NEWINTARRAY(p,n) if(n>0) { *((int**)&p)=new int[n+1]; ((int*)p)[0]=n; }
#define NEWFLOATARRAY(p,n) if(n>0) { *((float**)&p)=new float[n+1]; ((int*)p)[0]=n; }
#define NEWSTRINGARRAY(p,n) if(n>0) { *((char***)&p)=new char*[n+1]; ((int*)p)[0]=n; }
#define DELETESTRING(p) if(p) { delete *((char**)&p); p=0; }
#define DELETEINTARRAY(p) if(p) { delete *((int**)&p); p=0; }
#define DELETEFLOATARRAY(p) if(p) { delete *((float**)&p); p=0; }

- 250 -

DLL COMPONENT
#define DELETESTRINGARRAY(p) if(p) { for( int j=0; j<*((int*)p); j++ ) { if( ((char**)p+1)[j] ) delete
((char**)p+1)[j]; } delete *((char***)&p); p=0; }

To illustrate how these macros can help the code below shows how the code for resetting the output
value for an Int Array, would reduce down to just two lines:
// Delete previous array and reset pOut entry
DELETEINTARRAY(pOut[x])
// Create new array (assume we have declared 'length' add 1 for size at front)
NEWINTARRAY(pOut[x],length)

If you want to use the macros, simply copy and paste them in at the top of your dll source file.

Example 1 Float Add


This is a really simple example which simply adds two floats together and outputs the result. Whilst it is
basic it shows you how all the things we've talked about come together.

extern "C" __declspec(dllexport) void addFloats( int nParams, int* pIn, int* pOut )
{
if( pIn && pOut && nParams >= 2 )
{
float f0 = GETFLOAT(pIn[0]);
float f1 = GETFLOAT(pIn[1]);
GETFLOAT(pOut[0]) = f0+f1;
}

- 251 -

CHAPTER 10

Example 2 String Uppercase


This example takes a string and makes it uppercase. There's a bit more to it in that you need to
manage the memory for the output string that holds the result.

extern "C" __declspec(dllexport) void makeUppercase( int nParams, int* pIn, int* pOut )
{
if( pIn && pOut && nParams >= 1 )
{
char* strIn = GETSTRING(pIn[0]);

DELETESTRING(pOut[0]);
if( strIn )
{
int i=0;

int len = strlen(strIn);


char* strOut = new char[len+1];
while( strIn[i] )
{
char c = strIn[i];
strOut[i] = toupper(c);
i++;
}

strOut[len]=0;
GETSTRING(pOut[0]) = strOut;
}
}
}

- 252 -

DLL COMPONENT

Example 3 Audio Delay


Este pequeo efecto de retardo le y la idea de cmo hacer el procesamiento de audio
en tu dll dar. El efecto espera 6 entradas, el marco, el nmero de muestras de retraso,
la cantidad de retroalimentacin, nivel de mezcla, un contador para mantener la
posicin en la memoria intermedia circular y el propio buffer circular..
Podramos haber creado el bfer y contador como variables globales en la dll pero hemos elegido para que les
suministren desde el esquema para que el dll podra ser utilizado por ms de un componente DLL a la vez.

extern "C" __declspec(dllexport) void makeUppercase( int nParams, int* pIn, int* pOut )
{
if( pIn && pOut && nParams >= 6 )
{
if( pIn[0] )
{
float* pData = GETFRAME(pIn[0]);
int n = GETFRAMESIZE(pIn[0]);
int delay = GETINT(pIn[1]);
float feed = GETFLOAT(pIn[2]);
float mix = GETFLOAT(pIn[3]);
int ctr = GETINT(pOut[4]);
float* pBuffer = GETFRAME(pIn[5]);
int buffSize = GETFRAMESIZE(pIn[5]);

if( pBuffer && buffSize >= delay && pData )


{
float curr;
for( int i=0; i<n; i++ )

{
curr = pData[i];
pData[i] = (mix)*pBuffer[ctr] + curr;
pBuffer[ctr] = pBuffer[ctr]*feed + curr;
ctr++;

if( ctr >= delay ) ctr = 0;


}
GETINT(pOut,4) = ctr;
}
}
}
}

- 253 -

CHAPTER 10

Connecting
Una vez que usted ha construido su dll es el momento de conectarse a l
desde FlowStone. Arrastre en un componente DLL y conecte Strings para
especificar la ruta y el nombre de la funcin dll.

Conecte los componentes booleanos para las tres primeras salidas para que pueda comprobar que el componente se
est comunicando con su dll. Los dos primeros deben leer 'true' si se ha encontrado el archivo dll y funcin. Si leen
'false' a continuacin, comprobar cuidadosamente la trayectoria y la funcin y asegrese de que coincidan con su dll.

Next agregar las entradas y salidas que va a necesitar su dll y alambre para arriba como sea necesario. Para los
addFloats necesitamos dos entradas y salidas de flotador.

- 254 -

DLL COMPONENT

Por ltimo es necesario tener algo unido a una de las dos entradas Exec. A menos que usted est procesando Rub
Marcos tendr que utilizar la entrada de disparo Exec verde (el primero de los dos). Puede conectar un botn de
disparo para esto por ahora, pero si lo haces en un mdulo, entonces puede que tenga que conectar para arriba de
modo que los cambios en las entradas de los mdulos activarn el Exec.

Eso es todo! Haga clic en el botn de disparo y su dll procesar las entradas y enviar cualquier resultado
fuera.

A note about Outputs


As we saw in the previous section the array of output data is populated in your dll code. Anything you
put there will be accessible from the outputs on the DLL component. However, how and indeed
whether the outputs send out this data depends on which Exec input you use to invoke the call to your
dll function.

Exec 1 - green Trigger connector


If you use the first Exec input then all outputs that are not a Ruby Value connectors will be sent a
trigger and hence anything you have connected to these outputs will be updated after the dll function
has been executed.

- 255 -

CHAPTER 10
Exec 2 - Conector de Rub Valor
Si utiliza la segunda entrada Exec entonces todas las salidas que son tambin
conectores Rub Valor se enviar un evento de Ruby despus de la funcin dll se ha
ejecutado. Todas las dems conectores tendrn sus valores actualizados, pero no
se enviar ningn desencadenantes.
Esto es porque el valor de entrada de Ruby se utiliza por lo general para audio que
se est ejecutando en la velocidad de muestreo.
verde Disparo conectores en esta frecuencia sera demasiado intensivo de la CPU.
Si usted tiene que ser capaz de leer un verde provocado la salida de datos en estas
circunstancias, entonces la mejor manera de hacer esto es conectar un disparador
de un lmite (o algo similar) a la misma entrada que la salida de su componente
DLL est conectado a.
Esto se ilustra mucho mejor en una imagen:

- 256 -

DLL COMPONENT

Debugging

Trabajar a un nivel tan bajo, es inevitable que usted se encontrar con los errores en algn momento.
Afortunadamente la mayora de los compiladores le permiten asociar al proceso FlowStone para que pueda entrar en
su cdigo y ver donde ningn tipo de accidentes ocurren. La siguiente seccin describe cmo hacer esto en Visual
Studio.

Debugging using Visual Studio


To debug your dll using Visual Studio:
1.

First run FlowStone and open the schematic which you are using to connect to your dll.

2.

Open your dll project in Visual Studio (make sure you've built it in debug or with debugging
information).

3.

From the Debug menu choose 'Attach To Process'

- 257 -

CHAPTER 10
4.

From the process list select FlowStone and click 'Attach'

Visual Studio ahora se conectar a FlowStone. Puede establecer puntos de interrupcin en el cdigo dll y dispare la
entrada Exec en el componente dll dentro FlowStone y Visual Studio se detiene la ejecucin en el punto de ruptura que ha
especificado. Ahora puede recorrer el cdigo, trampa accidentes y navega en las variables de la forma habitual.
En nuestra experiencia con lo que el ejemplo de los proyectos de todos los accidentes que tuvimos fue debido a los errores
en los dlls que estbamos creando. As que por favor, antes de reportar un posible error en FlowStone se echa sobre su
cdigo dll ya que es ms que probable que este es el origen del problema radicar.

Code Test Debug Cycle


If you spot a bug or need to change your dll then you can do this without exiting FlowStone or your
schematic. However, if you've already connected and run your dll function you will probably find that
when you rebuild your dll you get an error saying that the dll file could not be opened for writing.
This is because the dll gets file locked by the software when it loads it into memory. To release it simply
trigger the Reset input on the DLL Component.

- 258 -

DLL COMPONENT

Si el dll es utilizado por otros componentes DLL en su esquema, entonces ser


liberado de los mismos.
Sin embargo, no dar a conocer si tiene otros esquemas abiertos que se han
bloqueado o si otros componentes DLL en el mismo esquema estn provocando
continuamente la entrada Exec.
Una vez que el archivo DLL se ha liberado puede reconstruir y volver a activar la
entrada Exec para ver los resultados de los cambios.
De esta manera se puede ejecutar con rapidez a travs del cdigo - test - ciclo de
depuracin.

- 259 -

CHAPTER 10

Sharing

La principal ventaja del componente DLL es que permite al usuario crear sus propios
componentes, sin comprometer la seguridad de saber el rendimiento que cualquier
secreto comercial se mantienen oculto del mundo. Todo lo que necesitas hacer es
envolver su componente DLL en un mdulo.
Hay, pues, dos maneras que usted puede compartir sus nuevos mdulos con los
dems..

Share the DLL Separately


Simply share the dll and your schematic with the module in it. Any recipient may need to modify the
path to the dll inside the schematic to match where they end up putting it. If they don't do this then the
module will not work.
If you want to share the source code as well then this is the method of distribution you want to go for.
It's also the route you'll have to take if your dll uses any other external libraries.

Embed the Dll


If you're not distributing the source code and want to send the module as a kind of black box then you
can embed the dll inside the DLL component.
This is really easy. Go to your DLL component and set the Embed input to True:

- 260 -

DLL COMPONENT
That's it your dll is now embedded in the DLL Component. You can copy and paste it and the dll will
be retained. If you want to you can delete the Dll path input value as it's not needed. You might do this
if you wanted to hide where the dll was originally located but it's completely up to you.
To share this simply send the module in a schematic.

Pros and Cons of Embedding


On most occasions embedding the dll will be the go to option However, there are some disadvantages
of embedding that are worth noting. We've listed the pros and cons below.

PROS
Easy to distribute there is no separate dll file and no need to worry about file paths.
Independent Globals you can create global variables to store persistent data that won't be shared.

CONS
Larger files because the dll is stored in the schematic the file size will be larger.
No Debug once embedded you can't debug the dll code (not usually an issue when sharing though).
No shared Globals you can't create global data to share amongst calls from different dl components.
No external Libraries you can't use external libraries as these dlls can't be embedded

Exporting
Al exportar a EXE o VST se puede elegir si desea incrustar automticamente
cualquier dlls que se encuentran actualmente externo para el esquema. As que eso
es dlls para el que no se ha ajustado la entrada Insertar en true.
Esto es til si desea mantener la dlls externa hasta el punto de exportacin y le
ahorra tener que ir a travs de todo su esquema de integrar cada una dll.
Busque la casilla de verificacin a continuacin en el cuadro de dilogo de
exportacin EXE o VST.

Si se encuentra algn dlls que no se puede incrustar el software le dir acerca de ellos.

- 261 -

CHAPTER 11

11 Options
CUSTOMISING

THE

APPLICATION

- 262 -

OPTIONS

The Options Dialog

Hay una serie de aplicaciones y esquemticas opciones de nivel / caractersticas que se pueden cambiar con el fin de
hacer que el software funcione de la manera que usted desea. Puede llegar hasta ellos por ir al men de opciones y
seleccionar una de las siete categoras en las que se organizan los distintos parmetros.

- 263 -

CHAPTER 11

Application
These options apply to features and settings that apply at application level.

Startup Options
Por defecto, el software se cargar el archivo de ejemplo que se incluye con el software. Esto est muy bien la primera
vez que empezar a buscar en el software, pero una vez que comience a hacer sus propias creaciones de este
comportamiento se vuelve indeseable.

- 264 -

OPTIONS
Thankfully you can switch this off. You can choose between the software launching with a blank
schematic (the fastest way to load up) or the schematic that you were working on last time you closed
down.
If you double-click on a file in Explorer it will usually open in FlowStone for editing. However, you can
choose to have double-clicked files open in Focus Mode and run the schematic as if it were an Exe.

Most Recent File List


The most recently used schematics are shown at the bottom of the File menu for rapid access. The
default size of this list is 4 items but you can choose to have up to 16 schematics displayed. You can
also choose to clear the recently used file list by clicking the Clear List button.

Auto Recovery
Auto Recovery is a handy little feature that saves a copy of your schematic periodically so that if your
session should suddenly be closed down due to a crash or loss of power you wont lose your work.
Instead, when you next launch FlowStone the file(s) you were editing will be recovered based on the
state when they were last saved.
You can switch auto recovery on and off at any time. By default the save period is every 5 seconds.
For larger schematics you may want to choose a longer save interval to allow for the increased save
time.
Recovery files are saved to the App Data folder on your system. If you need to access this folder you
can do so by clicking the Open Recovery Folder button.

Automatic File Compression


Schematic files are automatically compressed to keep file sizes down. With very big files that contain
large amounts of image or sample data you may find that your save times begin to increase. In these
cases you can reduce the save time by switching file compression off.

Check For Updates On Startup


FlowStone is updated regularly so the software can check whether you have the latest version and
notify you that there is an update waiting. If you prefer not to do this you can switch the behaviour off.
You can also manually check for updates by clicking the Check Now button.
Please be assured that your privacy is maintained at all times. No data is transmitted during the update
check and only the latest version information is download to your PC from our server.

- 265 -

CHAPTER 11

Navigator

Performance
When you change a front panel item like a knob or a slider this often results in values changing in
other parts of your schematic. Any modules that are shown in the navigator will be updated to reflect
these changes. On some PCs this can be very slow.
You can therefore choose how often the Navigator updates. The default is for minimal updates and
often this is all you need. If you want to see the results of your interactions reflected in just the current
module in the navigator then choose Selective. To make the Navigator update on every change select
Frequent.

- 266 -

OPTIONS

Toolbox

Adaptive Scrolling
Enabling this option makes the toolbox scrolling amount adapt to the speed at which you move your
mouse wheel. Move the wheel slowly and you'll get small movements. Move it quickly and the toolbox
scrolls rapidly, building momentum as it goes.
When you stop scrolling the toolbox will slowly brake to a halt. You can control how quickly or slowly
the toolbox braking is applied.

Scroll Sensitivity
This determines how far the toolbox scrolls in response to each mouse wheel movement.

Filter Selection
There are numerous ways of filtering the toolbox to zero in on what you're looking for. You can use
tags or the search bar and there several types of filter on the filter pane.
This option allows you to choose what happens to the currently applied filter when you click on a
different one.

- 267 -

CHAPTER 11
If you choose to Combine filters then the existing one(s) will be retained when you click on another
one. For example, if you have the Audio tag selected and then click on the Float type filter only
components with the Audio tag that also match the Float type will be shown. If you then type some
search text this will only search the components that are currently shown.
If you choose to Replace filters then then the existing filter will be cleared when you click on another
one. Taking the same example as above, if you have the Audio tag selected and then click on the Float
type filter then all components matching the Float type will be shown (not just the ones with an Audio
tag). If you then type some search text all components matching that search text will be shown.
When the Replace option is selected you can (at any time) hold SHIFT to temporarily combine filters.
For search text you can use CAPS LOCK to save you having to hold SHIFT as you type.

Schematic

Mouse Behaviour
When drag selecting you can choose whether components will become part of the selection once they
are fully enclosed in the drag rectangle or when they touch some part of the area covered by the drag
rectangle.
You can decide whether a right-click brings up the standard context menu or if moves you up to the
parent when inside a module.

Zoom Level
The default zoom level is defined as a number of pixels. This represents the size of a single grid
square so a higher number will result in a default zoom that appears magnified. If you click Use
Current youll get the zoom level for the current module.

Auto Linking
You can decide how close components have to be before the software will suggest an automatic link.
You can also choose whether links are then created after a short time or if the software waits for you to
right-click to accept a suggested link.

Links On Top
Check this box if you want links to appear on top of components in your schematic (applies to the
schematic as a whole).

- 268 -

OPTIONS

Modules

Animation
You can choose whether to enable or disable module animation for when you minimize or maximize a
module or open/close the properties panel.

Properties
By default a modules properties panel will close as soon as you click away (provided it isnt pinned
open). You can switch this off so that the properties remain open until you close them.

- 269 -

CHAPTER 11

Export

Target Folders
When you export standalone exes they are saved to a particular folder. You can set this here.

SSE/2 Support
The PC on which you generate your exports may support SSE2 or it may just support SSE. When you
export the software saves code that is optimised for the SSE capabilities of your own PC. If you then
give the export to someone whose PC has different SSE capabilities from you the software needs to
make adjustments on loading so that the export will work.
These adjustments can slow down the loading process. To avoid this you can choose to include
support for all SSE setups at export time. This way there is no reduction in loading speed when
exports are used on PCs with different SSE capabilities.

- 270 -

OPTIONS

Advanced

R&D Components
We will periodically offer some components on a trial basis to gather feedback or for testing. You can
decide whether to show these components by checking the box.

- 271 -

CHAPTER 11

Link Curvature
When you bend links they take a curved form. You can decide how curved you want them to be from
highly curved to perfectly straight lines. Note that this affects the way that links look in any schematic
you open.

Code Compilation
In order to increase performance code compilation is switched off while you are typing in a code
component. However, sometimes you want to be able to see the effects of your code as you type.

SSE/2 Support
The PC on which you create your schematics may support SSE2 or it may just support SSE. When
you save a schematic the software saves code that is optimised for the SSE capabilities of your own
PC. If you then give the schematic to someone whose PC has different SSE capabilities from you the
software needs to make adjustments on loading so that the schematic will work.
These adjustments can slow down the loading process. To avoid this you can choose to include
support for all SSE setups at save time. This way there is no reduction in loading speed when
schematics are used on PCs with different SSE capabilities.
You only need to enable this option for schematics if you intend to distribute them. One side affect of
enabling this option is that your save times are increased.

Floating Point Numbers


In computing floating point numbers cannot represent every possible number using 32bits. The system
therefore has to approximate some numbers.
-3

For example, 0.01 is represented as 9.9999998 x 10

These small inaccuracies can sometimes lead to unexpected results in calculations because
FlowStone will display 0.01 as 0.01 when in fact the number being used is of course the floating point
approximation.
These situations are quite rare but if you are doing precise calculations where these inaccuracies may
be significant in your results then you can choose to display the underlying representations instead so
that all your calculations are completely transparent.

COLOR MATRIX
Color matrix permite modificar un mapa de bits de gran tamao sin
costo de CPU
Facilitando la edicin extrema para el usuario.

Para usarlo necesitamos el componente BitmapArea


en
SynthMaker
O el componente Draw en FlowsTone (es lo mismo solo que con
distinto donmbre)
Entradas
- Bmp - Entrada de datos de mapa de bits para la imagen.
- Src - rea Fuente (pxl) es un tipo de datos de rea que define el rea
de origen de la
- imagen. El rea de origen se define en no pxeles rejillas de modo de
clculo puede ser
necesario si el uso de salidas de dimensiones estndar de primitivas que
son tpicamente
en las redes. Esquina superior izquierda de la imagen es el origen de las
coordenadas de la
cuadrcula de pxeles.
- Dest - del rea de destino es el tipo de datos que define el rea (en
unidades de rejilla),
donde la imagen se mostrar en la vista.
- Matriz - Matriz de color permite una transformacin de color que se
lleva a cabo sobre la
imagen de mapa de bits.

y tomaremos como referencia la imagen:

Donde color matrix es donde conectaremos nuestra matrix de color.

Nota: si por casualidad esta usando el parmetro alfa del componente


Bitmat, procure que el valor de alfa sea sobre el 127 hasta 255 para
que la imagen sea visible y no tenga inconvenientes en las pruebas
de imgenes con otros componentes.

esto

es nuestra matrix de color:

El componente primitiva Matriz de color permite un color y transparencia


transformaciones y traducciones en los componentes grficos que ellos
(transformaciones afines) apoyan. Actualmente el tipo de datos de matriz
coluor slo es utilizado por uno de los dos componentes de mapa de bits
Dibujar y por el componente de mapa de bits Area.
Entradas
Matrix - una entrada de cadena que lleva slo un 5 por 5 matriz de
nmeros con comas
entre cada elemento. El componente no reconoce las nuevas lneas como
delimitadores,
pero es conveniente para los usuarios comunes para incluirlos. Pero la
nueva lnea no toma
el lugar de la coma.
Analizar - una entrada de disparo para hacer que el componente
compruebe el
formato de la cadena de entrada. (Nota: este disparador no funcionar
con cualquier cosa,
pero la serie de la matriz se alimenta a la misma, as como a la conexin

de la matriz y, as,
es esencialmente no funcional.)
Salidas
Salida de datos de la matriz de color.
xit - una salida booleana que es 'True' si y slo si la serie de la matriz
analizada es vlida.

esto

es nuestro set de color:

The Colour Matrix Set componente primitivo reemplaza cualquier elemento


de una matriz de color con un nuevo valor flotante.
Entradas
Matrix - la matriz de color a alterar
Rol - una entrada interger del ndice de la fila que ser alterado
Col - una entrada de nmero entero del ndice de la columna que ser
alterado
Valor - un valor flotante que tomar el lugar del elemento que se est
alterado.
Salidas
La matriz de color alterado es la nica salida.

A continuacin, en la pagina siguiente, sabremos como es la matrix y


como funciona

- 272 -

La matrix usa los cuadros binarios de Windows para funcionar dentro de Flowstone o Synthmaker :

Utilizando una matriz de color para transformar un


color nico
(Crtl + click para ir a la fuente de la informacin (english)
Windows GDI + proporciona las clases Image y Bitmap para almacenar y manipular
imgenes . Objetos Image y Bitmap almacenan el color de cada pxel como un
nmero de 32 bits : 8 bits cada uno para el rojo , verde, azul y alfa . Cada uno de los
cuatro componentes es un nmero de 0 a 255 , donde 0 representa la ausencia de
intensidad y 255 que representa la mxima intensidad . El componente alfa especifica
la transparencia del color : 0 es completamente transparente y 255 es totalmente
opaco .
Un vector de color es una 4 - tupla de la forma ( rojo, verde, azul, alfa) . Por ejemplo ,
el vector de color ( 0 , 255 , 0 , 255 ) representa un color opaco que no tiene color rojo
o azul , pero tiene verde a plena intensidad .
Otra convencin para representar los colores utiliza el nmero 1 para la mxima
intensidad y el nmero 0 para la intensidad mnima . El uso de dicho convenio , el
color se describe en el prrafo anterior sera representado por el vector ( 0 , 1 , 0, 1 ) .
GDI + utiliza la convencin de 1 como la mxima intensidad cuando se lleva a cabo
transformaciones de color .
Puede aplicar transformaciones lineales (rotacin , escalado , y similares) a los
vectores de color mediante la multiplicacin por una matriz de 4 4 . Sin embargo ,
no se puede utilizar una matriz de 4 4 para realizar una traduccin ( no lineal ) . Si
se agrega un maniqu quinta coordenada ( por ejemplo, el nmero 1 ) para cada uno
de los vectores de color , se puede utilizar una matriz de 5 5 para aplicar cualquier
combinacin de las transformaciones lineales y traducciones . Una transformacin
que consiste en una transformacin lineal seguida de una traduccin se denomina
una transformacin afn . Una matriz de 5 5 que representa una transformacin afn
se llama una matriz homognea para una transformacin 4 - espacio . El elemento en
la quinta fila y quinta columna de una matriz homognea 5 5 debe ser 1 , y todas las
otras entradas en la quinta columna debe ser 0 .
Por ejemplo , suponga que desea comenzar con el color ( 0.2 , 0.0, 0.4 , 1.0 ) y
aplicar las siguientes transformaciones :
Doblar el componente rojo
Aadir 0,2 a los componentes rojo , verde y azul
La siguiente multiplicacin de matrices llevar a cabo el par de transformaciones en el
orden indicado .

-273 -

Los elementos de una matriz de color son indexados (basado en cero) por fila
y luego la columna. Por ejemplo, la entrada en la quinta fila y tercera columna
de la matriz M se denota por M [4] [2].
La matriz de identidad 5 5 (que se muestra en la siguiente ilustracin) tiene
1s en la diagonal y 0 en cualquier otro lugar. Si se multiplica un vector de color
de la matriz de identidad, el vector de color no cambia. Una manera
conveniente de formar la matriz de una transformacin de color es comenzar
con la matriz de identidad y hacer un pequeo cambio que produce la
transformacin deseada.

Para una discusin ms detallada de las matrices y las


transformaciones, vea Sistemas de coordenadas y transformaciones.
El siguiente ejemplo se toma una imagen que es de un solo color (0.2,
0.0, 0.4, 1.0) y se aplica la transformacin descrita en los prrafos
anteriores.
Image
ImageAttributes
UINT
UINT

image(L"InputColor.bmp");
imageAttributes;
width = image.GetWidth();
height = image.GetHeight();

ColorMatrix colorMatrix = {
2.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.2f, 0.2f, 0.2f, 0.0f, 1.0f};
imageAttributes.SetColorMatrix(
&colorMatrix,
ColorMatrixFlagsDefault,
ColorAdjustTypeBitmap);
graphics.DrawImage(&image, 10, 10);
graphics.DrawImage(
&image,
Rect(120, 10, width, height), // destination rectangle
0, 0,
// upper-left corner of source rectangle
width,
// width of source rectangle

height,
// height of source rectangle
UnitPixel,
&imageAttributes);

-274-

La siguiente ilustracin muestra la imagen original en la imagen transformada


izquierda ya la derecha.

El cdigo en el ejemplo anterior utiliza los siguientes pasos para realizar el


cambio de color: (web in english languaje of Microsoft company)
1) Iniciar una estructura ColorMatrix.
2) Crear un objeto ImageAttributes y pase la direccin de la estructura
ColorMatrix a los ImageAttributes :: mtodo SetColorMatrix del objeto
ImageAttributes.
3) Pasar la direccin del objeto ImageAttributes al mtodo DrawImage
Mtodos de un objeto Graphics.

-275-