I am making an ebuild for the linux gentoo overlay. (Gentoo overlays are the gentoo equivalence for multiple repositories). An ebuild is a script that the package management software (portage) will use to build and install a software.
If I resume what my ebuild is doing, this is
1) clone the git repository
2) copy it in a portage work directory
3) configure it with cmake
4) build it with make
5) install it with make install
The points 1 to 4 are just working fine, but 5 tell me:
make -j5 DESTDIR=/var/tmp/portage/media-sound/iannix-9999/image/ INSTALL_ROOT=/var/tmp/portage/media-sound/iannix-9999/image/ install
make: Nothing to be done for `install'
That imply that I will have to install every single file by hand from the ebuild.
That also imply that the “make install” phase is missing into iannix.
If you look at the code, you see “DESTDIR=
On linux, $PREFIX is usually /usr. See here for more on the Linux File Hierarchy.
This 2 steps install is necessary to insure, among other things, that it will be no files collision with other installed software. That imply than the install phase must honour both $DESTDIR and $PREFIX. $PREFIX is set with the configure step, $DESTDIR is set on the fly by portage when installing the package, The default PREFIX is /usr/local. That way, an user that install the package without the help of a package manager will not have to change it, and it will not collide with the files managed by the package manager. (It can be /usr for some system related packages). A package manager will replace it by /usr.
When installing by “hand”, only $PREFIX will be used, but when installing with/for a package manager, both $PREFIX and $DESTDIR will be used.
Also, if you want iannix to be incorporated not only into overlays or multiple repositories, you have to release some tarballs of the sources. In fact, this is all you need to do, because every single distribution will take the sources and compile them anyway (this is the best and only way to really insure the system consistency).
Also, if you want to try linux, and for the distributions I know, I would recommend gentoo or debian. gentoo because you will learn a lot very fast (the first install is hard, but after, this is just happiness), debian because you will find here a lot of dedicated peoples. And maybe the most important: both have an outstanding support forum with a lot of very nice and skilled peoples.
For a programmer, another gentoo advantage is than, as every thing is compiled from the sources by portage in the user’s computer, it is the easiest distribution for installing from the sources, and get the whole thing managed by the package manager (portage provide eclasses for git, svn, and so on, other eclases for qt or kde programs,…).
OK, the ebuild work. The files are installed into common linux places as follow:
/usr
/usr/bin
/usr/bin/IanniX
/usr/lib
/usr/lib/debug
/usr/lib/debug/usr
/usr/lib/debug/usr/bin
/usr/lib/debug/usr/bin/IanniX.debug
/usr/share
/usr/share/applications
/usr/share/applications/IanniX-iannix.desktop
/usr/share/doc
/usr/share/doc/iannix-9999
/usr/share/doc/iannix-9999/Documentation
/usr/share/doc/iannix-9999/Documentation/Common
/usr/share/doc/iannix-9999/Documentation/Common/css
/usr/share/doc/iannix-9999/Documentation/Common/css/reset.css
/usr/share/doc/iannix-9999/Documentation/Common/css/styleDocumentation.css
/usr/share/doc/iannix-9999/Documentation/Common/font
/usr/share/doc/iannix-9999/Documentation/Common/font/museo300-regular-webfont.eot
/usr/share/doc/iannix-9999/Documentation/Common/font/museo300-regular-webfont.svg
/usr/share/doc/iannix-9999/Documentation/Common/font/museo300-regular-webfont.ttf
/usr/share/doc/iannix-9999/Documentation/Common/font/museo300-regular-webfont.woff
/usr/share/doc/iannix-9999/Documentation/Common/font/museo500-regular-webfont.eot
/usr/share/doc/iannix-9999/Documentation/Common/font/museo500-regular-webfont.svg
/usr/share/doc/iannix-9999/Documentation/Common/font/museo500-regular-webfont.ttf
/usr/share/doc/iannix-9999/Documentation/Common/font/museo500-regular-webfont.woff
/usr/share/doc/iannix-9999/Documentation/Common/font/museo700-regular-webfont.eot
/usr/share/doc/iannix-9999/Documentation/Common/font/museo700-regular-webfont.svg
/usr/share/doc/iannix-9999/Documentation/Common/font/museo700-regular-webfont.ttf
/usr/share/doc/iannix-9999/Documentation/Common/font/museo700-regular-webfont.woff
/usr/share/doc/iannix-9999/Documentation/Common/font/museo_slab_500-webfont.eot
/usr/share/doc/iannix-9999/Documentation/Common/font/museo_slab_500-webfont.svg
/usr/share/doc/iannix-9999/Documentation/Common/font/museo_slab_500-webfont.ttf
/usr/share/doc/iannix-9999/Documentation/Common/font/museo_slab_500-webfont.woff
/usr/share/doc/iannix-9999/Documentation/Common/font/museosans_500-webfont.eot
/usr/share/doc/iannix-9999/Documentation/Common/font/museosans_500-webfont.svg
/usr/share/doc/iannix-9999/Documentation/Common/font/museosans_500-webfont.ttf
/usr/share/doc/iannix-9999/Documentation/Common/font/museosans_500-webfont.woff
/usr/share/doc/iannix-9999/Documentation/Common/font/stylesheet.css
/usr/share/doc/iannix-9999/Documentation/Common/img
/usr/share/doc/iannix-9999/Documentation/Common/img/add.jpg
/usr/share/doc/iannix-9999/Documentation/Common/img/autosize.png
/usr/share/doc/iannix-9999/Documentation/Common/img/bezier.png
/usr/share/doc/iannix-9999/Documentation/Common/img/center.jpg
/usr/share/doc/iannix-9999/Documentation/Common/img/cursor.png
/usr/share/doc/iannix-9999/Documentation/Common/img/curve.png
/usr/share/doc/iannix-9999/Documentation/Common/img/fastrewind.png
/usr/share/doc/iannix-9999/Documentation/Common/img/globale.png
/usr/share/doc/iannix-9999/Documentation/Common/img/info.png
/usr/share/doc/iannix-9999/Documentation/Common/img/inspector_cursor.png
/usr/share/doc/iannix-9999/Documentation/Common/img/inspector_curve.png
/usr/share/doc/iannix-9999/Documentation/Common/img/inspector_message.png
/usr/share/doc/iannix-9999/Documentation/Common/img/inspector_selection.png
/usr/share/doc/iannix-9999/Documentation/Common/img/inspector_trigger.png
/usr/share/doc/iannix-9999/Documentation/Common/img/logo_black.png
/usr/share/doc/iannix-9999/Documentation/Common/img/play.png
/usr/share/doc/iannix-9999/Documentation/Common/img/registercolor.png
/usr/share/doc/iannix-9999/Documentation/Common/img/registertexture.png
/usr/share/doc/iannix-9999/Documentation/Common/img/remove.png
/usr/share/doc/iannix-9999/Documentation/Common/img/script.jpg
/usr/share/doc/iannix-9999/Documentation/Common/img/setactive.png
/usr/share/doc/iannix-9999/Documentation/Common/img/setcoloractive.png
/usr/share/doc/iannix-9999/Documentation/Common/img/setcoloractivemessage.png
/usr/share/doc/iannix-9999/Documentation/Common/img/setcolorinactive.png
/usr/share/doc/iannix-9999/Documentation/Common/img/setcolorinactivemessage.png
/usr/share/doc/iannix-9999/Documentation/Common/img/setcurve.png
/usr/share/doc/iannix-9999/Documentation/Common/img/setgroup.png
/usr/share/doc/iannix-9999/Documentation/Common/img/setlabel.png
/usr/share/doc/iannix-9999/Documentation/Common/img/setline.png
/usr/share/doc/iannix-9999/Documentation/Common/img/setmessage.png
/usr/share/doc/iannix-9999/Documentation/Common/img/setpointat.png
/usr/share/doc/iannix-9999/Documentation/Common/img/setpointsellipse.png
/usr/share/doc/iannix-9999/Documentation/Common/img/setpointsimg.png
/usr/share/doc/iannix-9999/Documentation/Common/img/setpointssvg.png
/usr/share/doc/iannix-9999/Documentation/Common/img/setpointssvg2.png
/usr/share/doc/iannix-9999/Documentation/Common/img/setpointstxt.png
/usr/share/doc/iannix-9999/Documentation/Common/img/setpos.jpg
/usr/share/doc/iannix-9999/Documentation/Common/img/setresize.png
/usr/share/doc/iannix-9999/Documentation/Common/img/setsize.png
/usr/share/doc/iannix-9999/Documentation/Common/img/settextureactive.png
/usr/share/doc/iannix-9999/Documentation/Common/img/settextureactivemessage.png
/usr/share/doc/iannix-9999/Documentation/Common/img/settextureinactive.png
/usr/share/doc/iannix-9999/Documentation/Common/img/settextureinactivemessage.png
/usr/share/doc/iannix-9999/Documentation/Common/img/setwidth.png
/usr/share/doc/iannix-9999/Documentation/Common/img/trigger.png
/usr/share/doc/iannix-9999/Documentation/Common/img/zoom.jpg
/usr/share/doc/iannix-9999/Documentation/Common/jquery.js
/usr/share/doc/iannix-9999/Documentation/Common/vid
/usr/share/doc/iannix-9999/Documentation/Common/vid/setbounds.swf
/usr/share/doc/iannix-9999/Documentation/Common/vid/setboundsvalue.swf
/usr/share/doc/iannix-9999/Documentation/Common/vid/setoffset.swf
/usr/share/doc/iannix-9999/Documentation/Common/vid/setpattern.swf
/usr/share/doc/iannix-9999/Documentation/Common/vid/setspeed.swf
/usr/share/doc/iannix-9999/Documentation/Common/vid/setspeedf.swf
/usr/share/doc/iannix-9999/Documentation/Common/vid/settime.swf
/usr/share/doc/iannix-9999/Documentation/Common/vid/speed.swf
/usr/share/doc/iannix-9999/Documentation/EN
/usr/share/doc/iannix-9999/Documentation/EN/index.html
/usr/share/doc/iannix-9999/Documentation/EN/intro.html
/usr/share/doc/iannix-9999/Documentation/EN/objets.html
/usr/share/doc/iannix-9999/Documentation/EN/reference.html
/usr/share/doc/iannix-9999/Documentation/EN/script.html
/usr/share/doc/iannix-9999/Documentation/FR
/usr/share/doc/iannix-9999/Documentation/FR/index.html
/usr/share/doc/iannix-9999/Documentation/FR/intro.html
/usr/share/doc/iannix-9999/Documentation/FR/objets.html
/usr/share/doc/iannix-9999/Documentation/FR/reference.html
/usr/share/doc/iannix-9999/Documentation/FR/script.html
/usr/share/doc/iannix-9999/Documentation/index.html
/usr/share/doc/iannix-9999/Readme.txt.bz2
/usr/share/iannix
/usr/share/iannix/Examples
/usr/share/iannix/Examples/Learn - Curve 3D equations.nxscript
/usr/share/iannix/Examples/Learn - Curve 3D points.nxscript
/usr/share/iannix/Examples/Learn - How to manage received messages in scripts.nxscript
/usr/share/iannix/Examples/Performance - (a-z)².nxscript
/usr/share/iannix/Examples/Performance - Recurrence.nxscript
/usr/share/iannix/Examples/Script sample - Fractal.nxscript
/usr/share/iannix/Examples/Script sample - Glyphs.nxscript
/usr/share/iannix/Examples/Script sample - Grid.nxscript
/usr/share/iannix/Examples/Script sample - IanniX logo.nxscript
/usr/share/iannix/Examples/Script sample - Random 3D lines.nxscript
/usr/share/iannix/Examples/Script sample - Rosette MIDI.nxscript
/usr/share/iannix/Examples/Script sample - Rosette.nxscript
/usr/share/iannix/Examples/Script sample - Shape with Xenakis score.nxscript
/usr/share/iannix/Examples/Script sample - Smooth 3D curves.nxscript
/usr/share/iannix/Examples/Script sample - Spin.nxscript
/usr/share/iannix/Examples/Script sample - Torus.nxscript
/usr/share/iannix/Examples/Script sample - Xenakis Metastaseis linear.nxscript
/usr/share/iannix/Examples/Script sample - Xenakis Metastaseis.nxscript
/usr/share/iannix/Examples/Simple Javascript example (basic).nxscript
/usr/share/iannix/Examples/Simple Javascript example (more complex).nxscript
/usr/share/iannix/Examples/Simple MIDI example.nxscript
/usr/share/iannix/Examples/Simple TCP-XML example.nxscript
/usr/share/iannix/Examples/Simple serial example.nxscript
/usr/share/iannix/Examples/Style sample - Triggers in triangle.nxstyle
/usr/share/iannix/Examples/Tool - Add random triggers.nxscript
/usr/share/iannix/Examples/Xenakis - Metastaseis.png
/usr/share/iannix/Examples/Xenakis - Metastaseis.svg
/usr/share/iannix/Examples/background.jpg
/usr/share/iannix/Examples/logo.png
/usr/share/iannix/Examples/trigger_loop.png
/usr/share/iannix/Examples/trigger_play.png
/usr/share/iannix/Examples/trigger_speaker.png
/usr/share/iannix/Examples/trigger_speaker_mask.png
/usr/share/iannix/Examples/trigger_triangle.png
/usr/share/iannix/Patches
/usr/share/iannix/Patches/Ableton Live MIDI
/usr/share/iannix/Patches/Ableton Live MIDI/1. Please run Simple MIDI example.png
/usr/share/iannix/Patches/Ableton Live MIDI/2. Live setup.png
/usr/share/iannix/Patches/Ableton Live MIDI/IanniX Project
/usr/share/iannix/Patches/Ableton Live MIDI/IanniX Project/Ableton Project Info
/usr/share/iannix/Patches/Ableton Live MIDI/IanniX Project/Ableton Project Info/Project8_1.cfg
/usr/share/iannix/Patches/Ableton Live MIDI/IanniX Project/IanniX.als
/usr/share/iannix/Patches/Arduino
/usr/share/iannix/Patches/Arduino/Check your serial port setup and run Simple serial example.png
/usr/share/iannix/Patches/Arduino/IanniX
/usr/share/iannix/Patches/Arduino/IanniX/IanniX.ino
/usr/share/iannix/Patches/Arduino/IanniX/iannix_lib.cpp
/usr/share/iannix/Patches/Arduino/IanniX/iannix_lib.h
/usr/share/iannix/Patches/CSound
/usr/share/iannix/Patches/CSound/ChebyshevTest01.csd
/usr/share/iannix/Patches/CSound/ChebyshevTest01.nxscore
/usr/share/iannix/Patches/CSound/CsoundTemplate.csd
/usr/share/iannix/Patches/CSound/CsoundTest01.csd
/usr/share/iannix/Patches/CSound/CsoundTest01.nxscore
/usr/share/iannix/Patches/CSound/CsoundTest02.csd
/usr/share/iannix/Patches/CSound/CsoundTest02.nxscore
/usr/share/iannix/Patches/CSound/CsoundTest03.csd
/usr/share/iannix/Patches/CSound/CsoundTest03.nxscore
/usr/share/iannix/Patches/ChucK
/usr/share/iannix/Patches/ChucK/ChucK.txt
/usr/share/iannix/Patches/MaxMSP
/usr/share/iannix/Patches/MaxMSP/IanniX.maxpat
/usr/share/iannix/Patches/MaxMSP/synthCursor.maxpat
/usr/share/iannix/Patches/MaxMSP/synthTrigger.maxpat
/usr/share/iannix/Patches/Pd
/usr/share/iannix/Patches/Pd/IanniX.pd
/usr/share/iannix/Patches/Pd/subpatch.pd
/usr/share/iannix/Patches/Processing
/usr/share/iannix/Patches/Processing/IanniX
/usr/share/iannix/Patches/Processing/IanniX/IanniX.pde
/usr/share/iannix/Patches/SC
/usr/share/iannix/Patches/SC/Iannix_classes
/usr/share/iannix/Patches/SC/Iannix_classes/Iannix.sc
/usr/share/iannix/Patches/SC/Iannix_classes/IannixObjects.sc
/usr/share/iannix/Patches/SC/Iannix_classes/PianniX.sc
/usr/share/iannix/Patches/SC/Iannix_help
/usr/share/iannix/Patches/SC/Iannix_help/Examples
/usr/share/iannix/Patches/SC/Iannix_help/Examples/0_Read_me.html
/usr/share/iannix/Patches/SC/Iannix_help/Examples/1_iannix_receive.html
/usr/share/iannix/Patches/SC/Iannix_help/Examples/2_iannix_send.html
/usr/share/iannix/Patches/SC/Iannix_help/Examples/3_receive+send_supercollider_grain.html
/usr/share/iannix/Patches/SC/Iannix_help/Examples/4_Gendy_Metastaseis.html
/usr/share/iannix/Patches/SC/Iannix_help/Examples/SCcube.png
/usr/share/iannix/Patches/SC/Iannix_help/Examples/SCcube_mask.png
/usr/share/iannix/Patches/SC/Iannix_help/Iannix.html
/usr/share/iannix/Patches/SC/Iannix_help/IannixCursor.html
/usr/share/iannix/Patches/SC/Iannix_help/IannixCurve.html
/usr/share/iannix/Patches/SC/Iannix_help/IannixObject.html
/usr/share/iannix/Patches/SC/Iannix_help/IannixTrigger.html
/usr/share/iannix/Patches/SC/Instructions.txt
/usr/share/iannix/Project
/usr/share/iannix/Project/Important for former IanniX users.txt
/usr/share/iannix/Project/New Score Template.nxscore
/usr/share/iannix/Project/New Script Template.nxscript
/usr/share/iannix/Tools
/usr/share/iannix/Tools/Add a linear cursor.nxscript
/usr/share/iannix/Tools/HTML Template.html
/usr/share/iannix/Tools/JavaScript Library.js
/usr/share/iannix/Tools/Reset orientation.nxscript
/usr/share/iannix/Tools/Reset score.nxscript
/usr/share/iannix/Tools/Restore original background.nxstyle
/usr/share/iannix/Tools/Restore triggers original shapes.nxstyle
/usr/share/iannix/Tools/Translation_fr_FR.qm
/usr/share/iannix/Tools/Translation_fr_FR.ts
/usr/share/iannix/Tools/White background.nxstyle
/usr/share/iannix/Tools/background.jpg
/usr/share/iannix/Tools/backgroundWhite.jpg
/usr/share/iannix/Tools/trigger.png
/usr/share/iannix/Tools/trigger_message.png
/usr/share/iannix/Tools/trigger_speaker_1.png
/usr/share/iannix/Tools/trigger_speaker_2.png
/usr/share/iannix/Tools/trigger_speaker_3.png
/usr/share/iannix/Tools/trigger_speaker_4.png
/usr/share/iannix/pixmaps
/usr/share/iannix/pixmaps/icon.ico
/usr/share/iannix/pixmaps/icon.png
/usr/share/iannix/pixmaps/icon_green.ico
/usr/share/iannix/pixmaps/icon_orange.ico
/usr/share/iannix/pixmaps/res_about.png
/usr/share/iannix/pixmaps/res_appicon_pause.png
/usr/share/iannix/pixmaps/res_appicon_play.png
/usr/share/iannix/pixmaps/res_icon_cursor.png
/usr/share/iannix/pixmaps/res_icon_cursor_select.png
/usr/share/iannix/pixmaps/res_icon_curveCircle.png
/usr/share/iannix/pixmaps/res_icon_curveFree.png
/usr/share/iannix/pixmaps/res_icon_curvePoint.png
/usr/share/iannix/pixmaps/res_icon_curve_select.png
/usr/share/iannix/pixmaps/res_icon_down.png
/usr/share/iannix/pixmaps/res_icon_editor.png
/usr/share/iannix/pixmaps/res_icon_ff.png
/usr/share/iannix/pixmaps/res_icon_fullscreen.png
/usr/share/iannix/pixmaps/res_icon_grid.png
/usr/share/iannix/pixmaps/res_icon_grid_snapX.png
/usr/share/iannix/pixmaps/res_icon_grid_snapY.png
/usr/share/iannix/pixmaps/res_icon_help.png
/usr/share/iannix/pixmaps/res_icon_inspector.png
/usr/share/iannix/pixmaps/res_icon_inspector_info.png
/usr/share/iannix/pixmaps/res_icon_inspector_osc.png
/usr/share/iannix/pixmaps/res_icon_inspector_project.png
/usr/share/iannix/pixmaps/res_icon_inspector_view.png
/usr/share/iannix/pixmaps/res_icon_label.png
/usr/share/iannix/pixmaps/res_icon_light.png
/usr/share/iannix/pixmaps/res_icon_lock.png
/usr/share/iannix/pixmaps/res_icon_minus.png
/usr/share/iannix/pixmaps/res_icon_pause.png
/usr/share/iannix/pixmaps/res_icon_play.png
/usr/share/iannix/pixmaps/res_icon_plus.png
/usr/share/iannix/pixmaps/res_icon_timer.png
/usr/share/iannix/pixmaps/res_icon_transport.png
/usr/share/iannix/pixmaps/res_icon_trigger.png
/usr/share/iannix/pixmaps/res_icon_trigger_select.png
/usr/share/iannix/pixmaps/res_info_curve.png
/usr/share/iannix/pixmaps/res_info_export.png
/usr/share/iannix/pixmaps/res_info_img.png
/usr/share/iannix/pixmaps/res_info_svg.png
/usr/share/iannix/pixmaps/res_info_txt.png
/usr/share/iannix/pixmaps/res_info_update.png
/usr/share/iannix/pixmaps/res_logo.png
/usr/share/iannix/pixmaps/res_splash.png
/usr/share/iannix/pixmaps/res_splash2.png
But when I run IanniX, I get:
IanniX
/usr/bin
Command line syntax : ./IanniX
trying to open file "/dev/tty.usbserial-A600afc5"
could not open file: Aucun fichier ou dossier de ce type
Last update : 12/08/2012 20:22:19 (each 1 days)
Ready to start!
Erreur de segmentation
If I stop portage when the build is finished and run IanniX from the source directory, it work.
So here, I am stick. Is it something I can do like a wrapper script?
Another issue is than I can see a few directories into the build directory, but nothing was compiled into them:
qextserialport qffmpeg qjsedit qkinect qrtmidi qwacom
What are those? Can an user want them, and if yes, what must I do in order to compile them? Do they need custom dependencies?
It is also an Info.plist file. Do I need it on linux?
On linux, all you need to do is to release tarballs with the source code. Each distribution have its own way to manage its packages. It is 3 main ways to do that, 1) the sources based distribution like gentoo, 2) and 3) the executables way with rpm based distributions like red hat or suze, and the deb based distributions like debian or ubuntu.
Even if you release binary packages, they will or not work on an user computer. This is why all the distribution want the source code. It is a plus for them because this is the only way they have to insure the system consistency. It is a plus for you because they will not only test your software, but also your build system, and they will send you some feedback when they feel it is needed (even eventually some patches).
It is a big problem with iannix: it want everything at the same place. Linux is not windows, and a binary will definitely not be installed in the same directory than a pixmap or a library. See my other post on that matter here.
In the short term, you have to fix the build system. It is not much to do, just the install phase is missing. Well, it can be necessary to make a wrapper script or some changes to the program in order to get it to work with the standard linux files hierarchy. If you do that, it will be as easier for the developers of the distributions to take a snapshot of the git code than for you to release a tarball.
My ebuild for innax is working fine, and it will be very easy for me to test your changes into your build system. I thing than when it will work fine with portage, it will work fine with every package management systems around.
OK, portage is amazing. I get it to make a wrapper script for IanniX.
The ebuild is here: iannix-9999.ebuild For instruction on how to install it or the overlay: Pro-Audio Gentoo Overlay
The wrapper is “/usr/bin/iannix”:
#!/bin/sh
cd "/usr/share/iannix"
if [ -n "/usr/share/iannix,/usr/share/iannix/pixmaps" ] ; then
if [ "${LD_LIBRARY_PATH+set}" = "set" ] ; then
export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/usr/share/iannix,/usr/share/iannix/pixmaps"
else
export LD_LIBRARY_PATH="/usr/share/iannix,/usr/share/iannix/pixmaps"
fi
fi
exec /usr/bin/IanniX "$@"
Hello,
I am reading documentation. I find it excellent, thank you.
There is one point where it took me some time to understand what you mean, though:
setBoundsSource
x-top-left-corner etc means you draw a rectangle on the screen… It was not clear to me.
Since we use cursor_value_x and cursor_value_y independantly, I would find easier to define a range for X and a range for Y. Why is it done differently ?
Thank you
Nicolas
Is it possible to snap/quantise notes/triggers in IanniX? What grids can be snapped to?
For example, if I wanted a loop triggering a kick drum locked to the beat ..
Hello,
I’m actually working on my first IanniX project, a reservoir of 3D curves for spatialization of various audio tracks, with remote control of each cursor from Max/MSP via osc.
Nearly everything is doing fine, except a few weird behaviours :
It seems that a track is kept of bad scripts that can’t be erased after that.
For example, I want some curves to be plaid one shot, and some others in loop.
But since I don’t know exactly when, my curves don’t behave anymore like they should according to the setPattern message I give them. They just play once and that’s all.
More precisely than that, the behaviour seems to keep frozen at a previous scripting state.
Are there some messages that disable others ? Maybe using setSpeedF disables setPattern ?
I tried to trash the preferences, use the message “clear” at the beginning of my script, even rename the script and copy-paste the code in a new one with a different name, but all of this won’t work.
In the following code, on my machine only the second curve responds to the setPattern message I give it, the others play once whatever I do :
var ENTONNOIR = 0;
var BOURONNE = 1;
var COURONNE = 2;
var playEntonnoir = 0;
var entonnoirSpeed = 1;
var entonnoirDuration = 10;
var playBouronne = 0;
var bouronneSpeed = 1;
var bouronneDuration = 10;
var playCouronne = 1;
var couronneSpeed = 1;
var couronneDuration = 10;
function onCreate() {
var id = 0;
run("clear");
//
:::::::::::::::::::::::::::::: Entonnoir
run("add curve " + (1000 + id));
run("setPos current " + id * 7 + " 0 0");
//Plot curve
info = plot(function(t) { return {
index : 0, nbPoints: 900,
offset : {x: 0, y:0, z:0},
x : 3 * pow(1-t,3) * cos(t * TWO_PI * 12),
y : 3 * pow(1-t,3) * sin(t * TWO_PI * 12),
z : 2 - (pow(t,1.5) * 4),
t : [0,1] }});
run("add cursor " + id);
run("setCurve current lastCurve");
run("setSpeed current auto " + entonnoirDuration);
run("setSpeedF current " + playEntonnoir * entonnoirSpeed);
run("setPattern current 0 0 1"); // one shot
run("setWidth current 1");
//Set custom cursor message
//*
run("setMessage current 20, osc://127.0.0.1:57120/entonnoir " + id
+ " {cursor_xPos - curve_xPos}"
+ " {cursor_yPos - curve_yPos}"
+ " {cursor_zPos - curve_zPos}"
+ " cursor_time_percent");
//*/
id++;
//_________________________________________________________________________//
//
::::::::::::::::::::::::: Bouronne
run("add curve " + (1000 + id));
run("setPos current " + id * 7 + " 0 0");
// curve variables :
var ray = 2;
var revs = 5;
var hf = 0.5;
//Plot curve
info = plot(function(t) { return {
index : 0, nbPoints: 900,
offset : {x: 0, y:0, z:0},
//theta : sin(6 * TWO_PI * t),
//r : 2.5 - (5 * t),
//phi : cos(6 * TWO_PI * t),
x : ray * cos(TWO_PI * t) * sin(HALF_PI + hf * sin(revs * TWO_PI * t)),
y : ray * sin(TWO_PI * t) * sin(HALF_PI + hf * sin(revs * TWO_PI * t)),
z : ray * cos(HALF_PI + hf * sin(revs * TWO_PI * t)),
t : [0,1] }});
//Add a cursor
run("add cursor " + id);
run("setCurve current lastCurve");
run("setSpeed current auto 10");
run("setPattern current 0 0 1"); // back and forth
run("setWidth current 1");
//Set custom cursor message
//*
run("setMessage current 20, osc://127.0.0.1:57120/bouronne " + id
+ " {cursor_xPos - curve_xPos}"
+ " {cursor_yPos - curve_yPos}"
+ " {cursor_zPos - curve_zPos}"
+ " cursor_time_percent");
//*/
id++;
//_________________________________________________________________________//
//
::::::::::::::::::::::::: Couronne
run("add curve " + (1000 + id));
run("setPos current " + id * 7 + " 0 0");
//Plot curve
info = plot(function(t) { return {
index : 0, nbPoints: 900,
offset : {x: 0, y:0, z:0},
//r : 2,
//theta : TWO_PI * t,//cos(22 * TWO_PI * t),
//phi : sin(TWO_PI * 5 * t),//TWO_PI * t,
x : 2 * cos(t * TWO_PI),// * (2 - abs(sin(6 * TWO_PI * t))),
y : 2 * sin(t * TWO_PI),// * (2 - abs(sin(6 * TWO_PI * t))),
z : sin(6 * TWO_PI * t), //2 - (pow(t,1.5) * 4),
t : [0,1] }});
run("add cursor " + id);
run("setCurve current lastCurve");
run("setSpeed current auto " + couronneDuration);
run("setSpeedF current " + playCouronne * couronneSpeed);
run("setPattern current 0 0 1"); // mono directionnal infinite loop
run("setWidth current 1");
//Set custom cursor message
run("setMessage current 20, osc://127.0.0.1:57120/couronne " + id
+ " {cursor_xPos - curve_xPos}"
+ " {cursor_yPos - curve_yPos}"
+ " {cursor_zPos - curve_zPos}"
+ " cursor_time_percent");
id++;
// Play on init :
run("play");
}
//If a message is received
function onMessage(protocol, host, port, destination, values) {
if(protocol == "osc") {
// :::::::::::::::::::::::::::::::::::: Entonnoir control
if(destination == "/entonnoir/play") {
playEntonnoir = values[0];
run("setSpeedF " + ENTONNOIR + " " + playEntonnoir * entonnoirSpeed);
if(playEntonnoir == 0) {
run("setTime "+ ENTONNOIR + " 0");
}
}
if(destination == "/entonnoir/duration") {
entonnoirDuration = (values[0] <= 1) ? 0.001 : values[0]/1000;
}
if(destination == "/entonnoir/speed") {
entonnoirSpeed = values[0];
run("setSpeedF " + ENTONNOIR + " " + playEntonnoir * entonnoirSpeed);
}
// :::::::::::::::::::::::::::::::::::: Couronne control
///*
if(destination == "/couronne/play") {
playCouronne = values[0];
run("setSpeedF " + COURONNE + " " + playCouronne * couronneSpeed);
if(playCouronne == 0) {
run("setTime "+ COURONNE + " 0");
}
}
if(destination == "/couronne/duration") {
couronneDuration = (values[0] <= 1) ? 0.001 : values[0]/1000;
}
if(destination == "/couronne/speed") {
couronneSpeed = values[0];
run("setSpeedF " + COURONNE + " " + playCouronne * couronneSpeed);
}
//*/
}
}
Sorry the code is a bit long, but since I don’t know where the bug comes from, it may be anywhere (maybe using global variables or osc messages … but I really need them !)
Another symptom is that once, I also had to rewrite the same script from scratch in order to have a cursor attached to a curve with the run(“setCurve current lastCurve”); instruction. Before I did that the cursor was stuck at the origin (0,0,0) and wouldn’t move. After that it reworked fine, but the same trick won’t work for the setPattern problem.
Any clues ? Maybe there is a method to “reinit” some frozen variables states hidden in the IanniX engine ?
Sorry if it is somewhere in the documentation but I didn’t find anything.
Thank you very much, and keep up the very good work.
IanniX is definitely powerful !!!
Cheers,
J
I’ve volunteered to do some audio / music packaging for the Fedora project. IanniX is one of the packages I’m hoping to work on. Has anyone built a source RPM for IanniX?
Hi Joseph, I’m the author of GeoSonix which was branched off IanniX about a year ago.
I was curious to know whether the problems you are reporting existed in GeoSonix so I converted your script to a GeoSonix script. The commands are similar but the syntax is simplified (see below). As far as I can tell the script builds a score that runs as you intended, although I have not tried controlling it with OSC.
The converted script is at the end of this post. It needs the GeoSonix Version 0.9 Beta (OS X only for now). If you’d like to try it contact me at the email address in the message signature for download information.
– Chris
var ENTONNOIR = 0;
var BOURONNE = 1;
var COURONNE = 2;
var playEntonnoir = 0;
var entonnoirSpeed = 1;
var entonnoirDuration = 10;
var playBouronne = 0;
var bouronneSpeed = 1;
var bouronneDuration = 10;
var playCouronne = 1;
var couronneSpeed = 1;
var couronneDuration = 10;
function onCreate() {
var id = 0;
clear();
rotate();
center(6.5,0,0);
zoom(50);
//
:::::::::::::::::::::::::::::: Entonnoir
addCurve(1000 + id);
setPosition(id * 7,0,0);
//Plot curve
fx = function(t) {return 3 * pow(1-t,3) * cos(t * TWO_PI * 12)};
fy = function(t) {return 3 * pow(1-t,3) * sin(t * TWO_PI * 12)};
fz = function(t) {return 2 - (pow(t,1.5) * 4)};
plot( 300, fx, fy, fz);
addCursor(id);
setCurve();
setDuration(entonnoirDuration);
//setSpeedMultiplierRT(playEntonnoir * entonnoirSpeed);
setPattern("1 0"); // one shot
setCursorWidth(1);
//Set custom cursor message
setMessage(20, "osc://127.0.0.1:57120/entonnoir " + id
+ " {cursorXPosition - curveXPosition}"
+ " {cursorYPosition - curveYPosition}"
+ " {cursorZPosition - curveZPosition}"
+ " cursorTimePercent");
id++;
//_________________________________________________________________________//
//
::::::::::::::::::::::::: Bouronne
addCurve(1000 + id);
setPosition(id * 7,0,0);
// curve variables :
var ray = 2;
var revs = 5;
var hf = 0.5;
//theta : sin(6 * TWO_PI * t),
//r : 2.5 - (5 * t),
//phi : cos(6 * TWO_PI * t),
fx = function(t) {return ray * cos(TWO_PI * t) * sin(HALF_PI + hf * sin(revs * TWO_PI * t))};
fy = function(t) {return ray * sin(TWO_PI * t) * sin(HALF_PI + hf * sin(revs * TWO_PI * t))};
fz = function(t) {return ray * cos(HALF_PI + hf * sin(revs * TWO_PI * t))};
plot( 300, fx, fy, fz);
//Add a cursor
addCursor(id);
setCurve();
setDuration(10);
setPattern("1 -1"); // back and forth
setCursorWidth(1);
//Set custom cursor message
setMessage(20, "osc://127.0.0.1:57120/bouronne " + id
+ " {cursorXPosition - curveXPosition}"
+ " {cursorYPosition - curveYPosition}"
+ " {cursorZPosition - curveZPosition}"
+ " cursorTimePercent");
id++;
//_________________________________________________________________________//
//
::::::::::::::::::::::::: Couronne
addCurve(1000 + id);
setPosition(id * 7,0,0);
//Plot curve
//fx = function(t) {return 2 * cos(t * TWO_PI)};// * (2 - abs(sin(6 * TWO_PI * t)))};
//fy = function(t) {return 2 * sin(t * TWO_PI)};// * (2 - abs(sin(6 * TWO_PI * t)))};
//fx = function(t) {return sin(6 * TWO_PI * t)};//2 - (pow(t,1.5) * 4)};
fx = function(t) {return ray * cos(TWO_PI * t) * sin(HALF_PI + hf * sin(revs * TWO_PI * t))};
fy = function(t) {return ray * sin(TWO_PI * t) * sin(HALF_PI + hf * sin(revs * TWO_PI * t))};
fz = function(t) {return ray * cos(HALF_PI + hf * sin(revs * TWO_PI * t))};
plot( 300, fx, fy, fz);
addCursor(id);
setCurve();
setDuration(couronneDuration);
//run("setSpeedF current " + playCouronne * couronneSpeed);
setPattern("1"); // mono directionnal infinite loop
setCursorWidth(1);
//Set custom cursor message
setMessage(20, "osc://127.0.0.1:57120/couronne " + id
+ " {cursorXPosition - curveXPosition}"
+ " {cursorYPosition - curveYPosition}"
+ " {cursorZPosition - curveZPosition}"
+ " cursorTimePercent");
id++;
// Play on init :
play(1);
}
//If a message is received
function onMessage(protocol, host, port, destination, values) {
if(protocol == "osc") {
// :::::::::::::::::::::::::::::::::::: Entonnoir control
if(destination == "/entonnoir/play") {
playEntonnoir = values[0];
setSpeedMultiplierRT(ENTONNOIR, playEntonnoir * entonnoirSpeed);
if(playEntonnoir == 0) {
setTime(ENTONNOIR, 0);
}
}
if(destination == "/entonnoir/duration") {
entonnoirDuration = (values[0] <= 1) ? 0.001 : values[0]/1000;
}
if(destination == "/entonnoir/speed") {
entonnoirSpeed = values[0];
setSpeedMultiplierRT(ENTONNOIR, playEntonnoir * entonnoirSpeed);
}
// :::::::::::::::::::::::::::::::::::: Couronne control
if(destination == "/couronne/play") {
playCouronne = values[0];
setSpeedMultiplierRT(COURONNE, playCouronne * couronneSpeed);
if(playCouronne == 0) {
run("setTime "+ COURONNE + " 0");
}
}
if(destination == "/couronne/duration") {
couronneDuration = (values[0] <= 1) ? 0.001 : values[0]/1000;
}
if(destination == "/couronne/speed") {
couronneSpeed = values[0];
setSpeedMultiplierRT(COURONNE, playCouronne * couronneSpeed);
}
}
}
Hello Chris,
Thanks a lot for your reply.
I downloaded GeoSonix and ran your adapted script without any problem.
That’s a good start.
But what makes me perplex is the fact that in my script (in IanniX), the second curve behaves as I tell it : I can change the pattern and it will act accordingly after saving.
The first and 3rd ones will go on playing one-shot whatever I do.
That keeps me thinking that there is, I guess in a mysterious place in my system files that I didn’t find yet, some track of my previous scripting errors, because during the scripting process I generated parsing errors due to my begginer’s bad scripting. And these errors concerned the first and 3rd curves.
I tried to make syntax errors in GeoSonix but this didn’t seem to affect the behaviour when I corrected them back.
Maybe I didn’t make the right errors … or maybe you corrected the bug by improving the scripting interface in GeoSonix.
I just tried once again to trash IanniX, remove all the preference files I could find, re-install it and create a new script where I copied-pasted the code of my curves script (without a change because I’m sure it is correct) from TextEdit (external editor, just in case it would matter).
No way … same thing is happening over and over.
I am tempted to use GeoSonix for my project (because it seems to work well !), but I stand frustrated and I would really love an explanation of what’s going on here in IanniX.
Moreover, although you have done a really great work on the scripting part of Geosonix, I would like to continue using IanniX if possible, because I know a bit the people who started and still work on this project, and would like to contribute to its evolution.
I guess they have little time to spend on this for the moment because they must have other businesses to deal with, so if you have any suggestions that could help Guillaume find the bug, or a fix that could help me get my project back working in IanniX without recompiling, I think that would be a great thing.
For now I’ll be using GeoSonix because I need this script to work for my project.
Be sure I’ll keep you informed if I experience any bugs with your software.
Thank you again,
Joseph
Hi Joseph,
I don’t want to take up space on the IanniX list to discuss GeoSonix. I saw that you didn’t have a reply for a while so I thought I’d offer assistance. If you need help or have problems with your GeoSonix script feel free to email me directly at chrisgr99 at gmail dot com we’ll see what we can do to get your project working.
Regarding the relationship between GeoSonix and IanniX, the GeoSonix code has evolved in a different direction from IanniX as I’ve been pursuing somewhat different objectives: rhythm (e.g. the auto-generated triggers), precise control of note durations (although only in midi so far), integrated harmony processing, simplified scripting syntax with useful defaults for parameters, etc. I see the two projects as complementary. The IanniX team is welcome to borrow ideas from GeoSonix if they find them useful.
Hi,
You’re right.
Thanks for your help, and for the precisions about GeoSonix.
I’ll definitely have a deeper look at it.
J
what if I want an object to be created at a specific time ?
I’ve tried to put this command :
direct:// {(global_time>2)?(“add trigger 10″):”suppress”}
but it seems iannix tries to add a trigger every 20ms when global time has pass 2 sec. and I just want it to do it once.
In fact, another way that could be ok for me, is an object that remain still and invisible from 0 to 2 sec, and then start to act. but i have no idea how to do this.
Any help appreciated…
Hi!
Sorry, IanniX is now compatible only with Mac OS X 6+.
Some new features requires Mac OS 10.6 SDK and Apple’s policy is not focused on backward compatibility!
Thanks, but we actually don’t own this book. Added to my wishlist!
You can snap to the grid (with a grid of 1 sec).
If you need more complex quantization, you can use the inspector and type directly the x/y values for the trigger coordinates.
Cookie | Duration | Description |
---|---|---|
cookielawinfo-checkbox-analytics | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Analytics". |
cookielawinfo-checkbox-functional | 11 months | The cookie is set by GDPR cookie consent to record the user consent for the cookies in the category "Functional". |
cookielawinfo-checkbox-necessary | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookies is used to store the user consent for the cookies in the category "Necessary". |
cookielawinfo-checkbox-others | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Other. |
cookielawinfo-checkbox-performance | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Performance". |
viewed_cookie_policy | 11 months | The cookie is set by the GDPR Cookie Consent plugin and is used to store whether or not user has consented to the use of cookies. It does not store any personal data. |