{"id":13106,"date":"2020-10-23T20:14:19","date_gmt":"2020-10-23T18:14:19","guid":{"rendered":"https:\/\/magazine.swissinformatics.org\/gongpong-sat-a-case-study-in-developing-realtime-android-apps\/"},"modified":"2023-04-21T18:01:44","modified_gmt":"2023-04-21T16:01:44","slug":"case-study","status":"publish","type":"post","link":"https:\/\/magazine.swissinformatics.org\/it\/case-study\/","title":{"rendered":"GongPong.SAT: Developing Realtime Android Apps"},"content":{"rendered":"<p>The application underlying this case study is at the core of an award-winning concept of a distributed multi-player performance called&nbsp;<em>Music for Gongs and Satellites<\/em>. In short, the vision aims at turning commercially available mobile phones into devices for coordinating a group of performers who are acting as a distributed mass. While the application itself may not be of much practical use to most people, it serves perfectly as archetype of an Android app that makes decisive use of real-time features such as system clock and GPS sensor modern portable devices are equipped with. In this paper, I shall explain how to design, organize and implement such an app in&nbsp;<em>Java<\/em>&nbsp;on the basis of the&nbsp;<em>Android Studio<\/em>&nbsp;IDE.<\/p>\n<p><strong>The Project<\/strong><\/p>\n<p>\u201cMusic for Gongs and Satellites\u201d is a participatory work for a random public audience that can be performed in any given public space. The basic idea behind the work is to create a situation in which participants can \u201crun wild\u201d within a system while undertaking performative actions but remain coordinated by some higher power regardless of where or how they \u201crun\u201d within the system. Each participant is given a paired set of tuned gongs and asked to download the needed app to his or her mobile phone. Participants are readied in about 5 minutes and performing is accomplished through a process of&nbsp;learning-by-doing. Performances of the work have lasted several hours, but participants can play for a few minutes or a few hours at their will.<\/p>\n<p><strong>The Application <\/strong><\/p>\n<p>The application uses satellites and the mobile phone\u00b4s system clock to control an intelligent algorithm that in turn coordinates and instructs the participants via optical marks, based on where they stand, how, when and where they move, as well as how quickly and often they do so. Using a tool based on satellites, the application makes it possible to perform the work in any open space without constraining the dimensions of the area in which the work takes place. In principle, the group of participants could be distributed around the globe and still perform as a whole to create ever changing patterns of beautiful gong sounds spread out across an open space, paired with choreographic movements and highlighted by visual impact of the performers.<\/p>\n<p>A simple version of the work will be discussed in this paper in more technical detail. Our sample performance takes place in a circular playground area that is divided up into three concentric \u201czones\u201d around a common center point called \u201cground zero\u201d. Depending on the zone and the location within the zone that a performer is standing at the time, the controlling app changes the timing of the signaling mark by adding a slight amount of delay or by skipping it entirely.<\/p>\n<p><strong>Design and Implementation of the Application in Java on Top of Android Studio<\/strong><\/p>\n<p>The development of the GongPong.SAT app in Java on top of the Android Studio IDE platform provided for some specific challenges. Among these are the need to operate in real-time in a precise rhythm and in total synchronicity with all companion players, the need to know the exact location of a player at any time, and the desire to give useful optical feedback.<\/p>\n<p>Receiving and processing GPS data from satellites is at the core of this app. With the goal of providing this in a simple as possible application with a minimum of code, we decided in favor of using Google\u00b4s&nbsp;<em>Fused Location Provider<\/em>&nbsp;API, where \u201cfused\u201d refers to an implicit handling of the source of the location data from GPS satellites or earthly network, whichever is available and more appropriate at the place at which the location data is needed.<\/p>\n<p>Moving forward, we will explain our use of the API in detail: First we observe that any location service code running on top of Android\u2019s operating system must be guarded by a statement ensuring compatibility with the application\u2019s permissions, as they are specified in the application\u2019s manifest file&nbsp;<em>AndroidManifest.xml<\/em>:<\/p>\n<p><a href=\"https:\/\/magazine.swissinformatics.org\/case-study\/gps_code_01-2\/\" rel=\"attachment wp-att-13123\"><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone size-large wp-image-13123\" src=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_01-1024x572.png\" alt=\"\" width=\"1024\" height=\"572\" srcset=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_01-1024x572.png 1024w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_01-300x168.png 300w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_01-768x429.png 768w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_01-1536x858.png 1536w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_01.png 1830w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>Basically, starting the Fused Location Provider service consists of calling two constituents of the API: a) Getting an initial location fix and b) Launching a task listening for location updates. The following two sections will give the details on both calls.<\/p>\n<p><strong>Get an Initial Location Fix<\/strong><\/p>\n<p>The following code for getting an initial location fix reveals the asynchronicity of the model: Two listeners are supposed to call (back) a method in case of success and of failure respectively:<\/p>\n<p><a href=\"https:\/\/magazine.swissinformatics.org\/case-study\/gps_code_02-2\/\" rel=\"attachment wp-att-13127\"><img decoding=\"async\" class=\"alignnone size-large wp-image-13127\" src=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_02-1024x423.png\" alt=\"\" width=\"1024\" height=\"423\" srcset=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_02-1024x423.png 1024w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_02-300x124.png 300w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_02-768x317.png 768w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_02-1536x634.png 1536w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_02.png 1832w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p><strong>Starting a Listening Task<\/strong><\/p>\n<p>In the case of having received a valid location fix by the&nbsp;<em>onSuccess<\/em>&nbsp;method, a&nbsp;<em>listening-and-updating task<\/em>&nbsp;is launched with the following code:<\/p>\n<p><a href=\"https:\/\/magazine.swissinformatics.org\/case-study\/gps_code_03-2\/\" rel=\"attachment wp-att-13131\"><img decoding=\"async\" class=\"alignnone size-large wp-image-13131\" src=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_03-1024x472.png\" alt=\"\" width=\"1024\" height=\"472\" srcset=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_03-1024x472.png 1024w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_03-300x138.png 300w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_03-768x354.png 768w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_03-1536x708.png 1536w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_03.png 1832w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>Obviously, the decisive part of this piece of code for task-launching is the installation of the function&nbsp;<em>LocationCallback, which<\/em>&nbsp;periodically calls (back) the&nbsp;<em>onLocationResult<\/em>&nbsp;method with a list of newly computed locations, governed by the priority and frequency specifications in the&nbsp;<em>LocationRequest<\/em>&nbsp;object&nbsp;<em>req<\/em>. The callback itself first causes a conversion of the list of newly received locations into an array and subsequently sends a call to the&nbsp;<em>UpdateWindow&nbsp;<\/em>function whose name refers to a&nbsp;<em>sliding window<\/em>&nbsp;of distances between the performer\u00b4s position and the initial \u201cground zero\u201d position, computed from location data received via recent callbacks:<\/p>\n<p><a href=\"https:\/\/magazine.swissinformatics.org\/case-study\/gps_code_04-2\/\" rel=\"attachment wp-att-13135\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13135\" src=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_04-1024x204.png\" alt=\"\" width=\"1024\" height=\"204\" srcset=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_04-1024x204.png 1024w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_04-300x60.png 300w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_04-768x153.png 768w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_04-1536x306.png 1536w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_04.png 1828w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>In technical terms, the sliding window serves as a basic data structure connecting the two major tasks of this application, a) delivering (\u201cproducing\u201d) new location data and b) their processing (\u201cconsuming\u201d) that we shall discuss in the following sections.<\/p>\n<p>However, we should not lose sight of the bigger picture and the final purpose of our app: Turning a mobile phone device into a tool for performing a work for gongs and satellites, which is largely a&nbsp;<em>user interface<\/em>&nbsp;topic. After some initial experiments, we decided in favor of a simple, but efficient, graphical user interface, which is created by switching a circular spot through different&nbsp;<em>sizes<\/em>&nbsp;(from small to large) and various colors (from yellow to orange and red) at predefined time intervals. The changes in color and size alert the performers when it is time to play i.e. to strike the gong. &nbsp;As the following helper Java class called&nbsp;<em>Signal<\/em>&nbsp;shows, the user-interface is controlled by another runnable&nbsp;<em>(<\/em>called <em>Notify)<\/em>&nbsp;whose task is it to force a redraw-event for the spot by invalidating its current representation:<\/p>\n<p><a href=\"https:\/\/magazine.swissinformatics.org\/case-study\/gps_code_05-2\/\" rel=\"attachment wp-att-13139\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13139\" src=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_05-1024x940.png\" alt=\"\" width=\"1024\" height=\"940\" srcset=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_05-1024x940.png 1024w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_05-300x276.png 300w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_05-768x705.png 768w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_05.png 1200w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>The formal picture of the user-interface is revealed by the app\u2019s <em>activity_main.xml<\/em>&nbsp;file: a linear layout specifying three elements in vertical order: a text field (for logging), a button (for restarting the app interactively) and the circular signal just explained (for alerting):<\/p>\n<p><a href=\"https:\/\/magazine.swissinformatics.org\/case-study\/gps_code_06-2\/\" rel=\"attachment wp-att-13143\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13143\" src=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_06-1024x556.png\" alt=\"\" width=\"1024\" height=\"556\" srcset=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_06-1024x556.png 1024w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_06-300x163.png 300w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_06-768x417.png 768w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_06.png 1198w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>It is now time to come back to the consumer task that defines the operating rhythm of the app by periodically processing the data provided by the sliding window and implementing the actual&nbsp;<em>performance logic<\/em>. This task is implemented by a&nbsp;<em>scheduler<\/em>&nbsp;(of type&nbsp;<em>Handler<\/em>) posting a&nbsp;<em>runnable<\/em>&nbsp;piece of code called&nbsp;<em>Check<\/em>&nbsp;that is reposting itself to be run again after each second, according to the device\u00b4s clock.<\/p>\n<p>Here is the framework code:<\/p>\n<p><a href=\"https:\/\/magazine.swissinformatics.org\/case-study\/gps_code_07-2\/\" rel=\"attachment wp-att-13147\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13147\" src=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_07-1024x271.png\" alt=\"\" width=\"1024\" height=\"271\" srcset=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_07-1024x271.png 1024w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_07-300x79.png 300w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_07-768x203.png 768w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_07.png 1194w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>The performance logic still to be filled into the body of the <em>run<\/em> method roughly comprises two functionalities: a) computing the current distance from ground zero and b) deciding about possible actions to be performed depending on the time and the performer&#8217;s current position within the playground.<\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/magazine.swissinformatics.org\/gongpong-sat-a-case-study-in-developing-realtime-android-apps\/gongpongsat-1\/\" rel=\"attachment wp-att-13092\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13092\" src=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GongPongSAT-1-678x381.jpg\" alt=\"\" width=\"1000\" height=\"563\" srcset=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GongPongSAT-1-678x381.jpg 678w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GongPongSAT-1-300x169.jpg 300w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GongPongSAT-1-1024x576.jpg 1024w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GongPongSAT-1-768x432.jpg 768w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GongPongSAT-1-1536x864.jpg 1536w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GongPongSAT-1.jpg 2000w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/a><\/p>\n<p style=\"text-align: center;\"><strong>Fig. 1. A diagram showing the design for the GongPong.SAT app.<\/strong><\/p>\n<p><strong>&nbsp;<\/strong><\/p>\n<p><strong>Computing the Current Distance from Ground Zero<\/strong><\/p>\n<p>Early experiments showed that computing distances from individual location fixes unavoidably leads to distorting jumps caused by noisy GPS data. Consequently, we added a simple algorithm for computing a smoothed-out approximation of the current distance from ground zero. At this point our sliding window comes in handy as it supports, for example, a solution based on dropping a few outlier values (in comparison with the previous smoothed-out distance value) and averaging across the remaining recent distance values:<\/p>\n<p><a href=\"https:\/\/magazine.swissinformatics.org\/case-study\/gps_code_08-2\/\" rel=\"attachment wp-att-13151\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13151\" src=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_08-1024x354.png\" alt=\"\" width=\"1024\" height=\"354\" srcset=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_08-1024x354.png 1024w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_08-300x104.png 300w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_08-768x265.png 768w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_08.png 1192w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p><strong>Deciding about the Next Action to be Performed<\/strong><\/p>\n<p>Instructing players via graphical feedback about the next action to be performed is at the core of the performance logic. As can be seen from the piece of code below, the decision if or not to alert a player (via posting&nbsp;<em>sig.Notify&nbsp;<\/em>after a slight time shift depending on the player\u00b4s relative position within the playground) is based on the player\u00b4s&nbsp;<em>zone<\/em>&nbsp;(circle of radius&nbsp;<em>r0<\/em>,&nbsp;<em>r1<\/em>&nbsp;or&nbsp;<em>r<\/em>&nbsp;around ground zero) and the multiplicity of&nbsp;<em>ticks<\/em>&nbsp;(seconds since the start of the performance):<\/p>\n<p><a href=\"https:\/\/magazine.swissinformatics.org\/case-study\/gps_code_09-2\/\" rel=\"attachment wp-att-13155\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13155\" src=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_09-1024x446.png\" alt=\"\" width=\"1024\" height=\"446\" srcset=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_09-1024x446.png 1024w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_09-300x131.png 300w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_09-768x334.png 768w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_09.png 1204w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>The one final challenge that remains is provided by the request of precisely synchronizing the devices of a (potentially large) number of <em>GongPong.SAT<\/em>&nbsp;participants. As it is demonstrated by the following code excerpt, we have overcome this challenge quite elegantly by making use of the universal GPS time when launching the checker task of each device at the next full satellite second:<\/p>\n<p><a href=\"https:\/\/magazine.swissinformatics.org\/case-study\/gps_code_10-2\/\" rel=\"attachment wp-att-13159\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13159\" src=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_10-1024x84.png\" alt=\"\" width=\"1024\" height=\"84\" srcset=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_10-1024x84.png 1024w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_10-300x25.png 300w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_10-768x63.png 768w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_10.png 1200w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>In concluding our presentation, we mention again the built-in option of interactively restarting a performance, which allows the app to be recalibrated at ground zero. This is achieved simply by pressing the&nbsp;<em>restart button<\/em>&nbsp;of our user-interface:<\/p>\n<p><a href=\"https:\/\/magazine.swissinformatics.org\/case-study\/gps_code_11-2\/\" rel=\"attachment wp-att-13163\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13163\" src=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_11-1024x130.png\" alt=\"\" width=\"1024\" height=\"130\" srcset=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_11-1024x130.png 1024w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_11-300x38.png 300w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_11-768x98.png 768w, https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/GPS_Code_11.png 1196w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p><strong>Summary<\/strong><\/p>\n<p>By taking a media art work as a case study, we demonstrate the feasibility of developing custom-tailored software for off-the-shelf commercial mobile phones, including the use of their high-precision sensors like GPS module and system clock, and for the use as a real-time controller. From a software-engineering point of view the multi-threaded modeling approach with the benefit of elegantly separating different concerns is particularly noteworthy. All this is a highly promising result, in particular as it is by no means limited just to creating applications for the arts.<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Acknowledgment<\/strong><\/p>\n<p>I would like to thank Art Clay for inspiring me to dive into this adventure at all and my brother Ernst for numerous extremely valuable comments and hints regarding the use of the Android Studio IDE. Further thanks go to the Swiss Arts Council for providing the needed funding in support of the work and to the PHONOS Foundation, Barcelona for hosting the premiere of the work during their Fall Festival.<\/p>\n<p>&nbsp;<\/p>\n<p>&#8211; J\u00fcrg Gutknecht, Swiss informatics Society<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The application underlying this case study is at the core of an award-winning concept of a distributed multi-player performance called&nbsp;Music for Gongs and Satellites. In short, the vision aims at turning commercially available mobile phones into devices for coordinating a group of performers who are acting as a distributed mass. While the application itself may [&hellip;]<\/p>\n","protected":false},"author":1834,"featured_media":13089,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4872,469],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>GongPong.SAT: Developing Realtime Android Apps - SI Digital Magazine<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/magazine.swissinformatics.org\/it\/case-study\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GongPong.SAT: Developing Realtime Android Apps - SI Digital Magazine\" \/>\n<meta property=\"og:description\" content=\"The application underlying this case study is at the core of an award-winning concept of a distributed multi-player performance called&nbsp;Music for Gongs and Satellites. In short, the vision aims at turning commercially available mobile phones into devices for coordinating a group of performers who are acting as a distributed mass. While the application itself may [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/magazine.swissinformatics.org\/it\/case-study\/\" \/>\n<meta property=\"og:site_name\" content=\"SI Digital Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/www.swissinformatics.org\/?fref=ts\" \/>\n<meta property=\"article:published_time\" content=\"2020-10-23T18:14:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-04-21T16:01:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/IMG_1905.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1920\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Juerg Gutknecht\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@SIGesellschaft\" \/>\n<meta name=\"twitter:site\" content=\"@SIGesellschaft\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Juerg Gutknecht\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/magazine.swissinformatics.org\/it\/case-study\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/magazine.swissinformatics.org\/it\/case-study\/\"},\"author\":{\"name\":\"Juerg Gutknecht\",\"@id\":\"https:\/\/magazine.swissinformatics.org\/en\/#\/schema\/person\/522c1cbf28b407be4ddfca15dd159d20\"},\"headline\":\"GongPong.SAT: Developing Realtime Android Apps\",\"datePublished\":\"2020-10-23T18:14:19+00:00\",\"dateModified\":\"2023-04-21T16:01:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/magazine.swissinformatics.org\/it\/case-study\/\"},\"wordCount\":1737,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/magazine.swissinformatics.org\/en\/#organization\"},\"articleSection\":[\"\u2022 Articolo \u2022\",\"Tecnologia\"],\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/magazine.swissinformatics.org\/it\/case-study\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/magazine.swissinformatics.org\/it\/case-study\/\",\"url\":\"https:\/\/magazine.swissinformatics.org\/it\/case-study\/\",\"name\":\"GongPong.SAT: Developing Realtime Android Apps - SI Digital Magazine\",\"isPartOf\":{\"@id\":\"https:\/\/magazine.swissinformatics.org\/en\/#website\"},\"datePublished\":\"2020-10-23T18:14:19+00:00\",\"dateModified\":\"2023-04-21T16:01:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/magazine.swissinformatics.org\/it\/case-study\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/magazine.swissinformatics.org\/it\/case-study\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/magazine.swissinformatics.org\/it\/case-study\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/magazine.swissinformatics.org\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"GongPong.SAT: Developing Realtime Android Apps\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/magazine.swissinformatics.org\/en\/#website\",\"url\":\"https:\/\/magazine.swissinformatics.org\/en\/\",\"name\":\"SI Digital Magazine\",\"description\":\"News - Nachrichten - Nouvelles - Notizie\",\"publisher\":{\"@id\":\"https:\/\/magazine.swissinformatics.org\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/magazine.swissinformatics.org\/en\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/magazine.swissinformatics.org\/en\/#organization\",\"name\":\"Swiss Informatics Society\",\"url\":\"https:\/\/magazine.swissinformatics.org\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/magazine.swissinformatics.org\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2017\/11\/SI_KeyImage_4to3.jpg\",\"contentUrl\":\"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2017\/11\/SI_KeyImage_4to3.jpg\",\"width\":1441,\"height\":1081,\"caption\":\"Swiss Informatics Society\"},\"image\":{\"@id\":\"https:\/\/magazine.swissinformatics.org\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/www.swissinformatics.org\/?fref=ts\",\"https:\/\/twitter.com\/SIGesellschaft\",\"https:\/\/www.youtube.com\/channel\/UCYUEr1Qkbri9GDTa84z415g\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/magazine.swissinformatics.org\/en\/#\/schema\/person\/522c1cbf28b407be4ddfca15dd159d20\",\"name\":\"Juerg Gutknecht\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/magazine.swissinformatics.org\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0f2282cccaf9f300752694899f19c685?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0f2282cccaf9f300752694899f19c685?s=96&d=mm&r=g\",\"caption\":\"Juerg Gutknecht\"},\"description\":\"J\u00fcrg Gutknecht started his professional career in Computing when he joined the real-time systems programming group at Swissair. From 1970 and while being employed by IBM as a working student, Gutknecht studied Mathematics at the ETH Zurich, from where he graduated in 1977 with a PhD. After an employment as a professor of Mathematics at the Kantonsschule Heerbrugg in the Swiss Rheintal, Gutknecht joined Niklaus Wirth\u2019s Lilith\/ Modula research team in 1981 and, in 1985, after a sabbatical stay at the Xerox-PARC Research Laboratory in California, he was appointed Assistant Professor and later Full Professor of Computer Science at ETH. Together with Wirth, Gutknecht developed the Oberon programming language and the Ceres personal workstation. His esearch interests are in the area of programming languages, compilers, concurrency and component-oriented systems design.\",\"url\":\"https:\/\/magazine.swissinformatics.org\/it\/author\/president\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"GongPong.SAT: Developing Realtime Android Apps - SI Digital Magazine","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/magazine.swissinformatics.org\/it\/case-study\/","og_locale":"it_IT","og_type":"article","og_title":"GongPong.SAT: Developing Realtime Android Apps - SI Digital Magazine","og_description":"The application underlying this case study is at the core of an award-winning concept of a distributed multi-player performance called&nbsp;Music for Gongs and Satellites. In short, the vision aims at turning commercially available mobile phones into devices for coordinating a group of performers who are acting as a distributed mass. While the application itself may [&hellip;]","og_url":"https:\/\/magazine.swissinformatics.org\/it\/case-study\/","og_site_name":"SI Digital Magazine","article_publisher":"https:\/\/www.facebook.com\/www.swissinformatics.org\/?fref=ts","article_published_time":"2020-10-23T18:14:19+00:00","article_modified_time":"2023-04-21T16:01:44+00:00","og_image":[{"width":2560,"height":1920,"url":"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2020\/10\/IMG_1905.jpg","type":"image\/jpeg"}],"author":"Juerg Gutknecht","twitter_card":"summary_large_image","twitter_creator":"@SIGesellschaft","twitter_site":"@SIGesellschaft","twitter_misc":{"Scritto da":"Juerg Gutknecht","Tempo di lettura stimato":"10 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/magazine.swissinformatics.org\/it\/case-study\/#article","isPartOf":{"@id":"https:\/\/magazine.swissinformatics.org\/it\/case-study\/"},"author":{"name":"Juerg Gutknecht","@id":"https:\/\/magazine.swissinformatics.org\/en\/#\/schema\/person\/522c1cbf28b407be4ddfca15dd159d20"},"headline":"GongPong.SAT: Developing Realtime Android Apps","datePublished":"2020-10-23T18:14:19+00:00","dateModified":"2023-04-21T16:01:44+00:00","mainEntityOfPage":{"@id":"https:\/\/magazine.swissinformatics.org\/it\/case-study\/"},"wordCount":1737,"commentCount":0,"publisher":{"@id":"https:\/\/magazine.swissinformatics.org\/en\/#organization"},"articleSection":["\u2022 Articolo \u2022","Tecnologia"],"inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/magazine.swissinformatics.org\/it\/case-study\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/magazine.swissinformatics.org\/it\/case-study\/","url":"https:\/\/magazine.swissinformatics.org\/it\/case-study\/","name":"GongPong.SAT: Developing Realtime Android Apps - SI Digital Magazine","isPartOf":{"@id":"https:\/\/magazine.swissinformatics.org\/en\/#website"},"datePublished":"2020-10-23T18:14:19+00:00","dateModified":"2023-04-21T16:01:44+00:00","breadcrumb":{"@id":"https:\/\/magazine.swissinformatics.org\/it\/case-study\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/magazine.swissinformatics.org\/it\/case-study\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/magazine.swissinformatics.org\/it\/case-study\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/magazine.swissinformatics.org\/en\/"},{"@type":"ListItem","position":2,"name":"GongPong.SAT: Developing Realtime Android Apps"}]},{"@type":"WebSite","@id":"https:\/\/magazine.swissinformatics.org\/en\/#website","url":"https:\/\/magazine.swissinformatics.org\/en\/","name":"SI Digital Magazine","description":"News - Nachrichten - Nouvelles - Notizie","publisher":{"@id":"https:\/\/magazine.swissinformatics.org\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/magazine.swissinformatics.org\/en\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/magazine.swissinformatics.org\/en\/#organization","name":"Swiss Informatics Society","url":"https:\/\/magazine.swissinformatics.org\/en\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/magazine.swissinformatics.org\/en\/#\/schema\/logo\/image\/","url":"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2017\/11\/SI_KeyImage_4to3.jpg","contentUrl":"https:\/\/magazine.swissinformatics.org\/wp-content\/uploads\/2017\/11\/SI_KeyImage_4to3.jpg","width":1441,"height":1081,"caption":"Swiss Informatics Society"},"image":{"@id":"https:\/\/magazine.swissinformatics.org\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/www.swissinformatics.org\/?fref=ts","https:\/\/twitter.com\/SIGesellschaft","https:\/\/www.youtube.com\/channel\/UCYUEr1Qkbri9GDTa84z415g"]},{"@type":"Person","@id":"https:\/\/magazine.swissinformatics.org\/en\/#\/schema\/person\/522c1cbf28b407be4ddfca15dd159d20","name":"Juerg Gutknecht","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/magazine.swissinformatics.org\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0f2282cccaf9f300752694899f19c685?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0f2282cccaf9f300752694899f19c685?s=96&d=mm&r=g","caption":"Juerg Gutknecht"},"description":"J\u00fcrg Gutknecht started his professional career in Computing when he joined the real-time systems programming group at Swissair. From 1970 and while being employed by IBM as a working student, Gutknecht studied Mathematics at the ETH Zurich, from where he graduated in 1977 with a PhD. After an employment as a professor of Mathematics at the Kantonsschule Heerbrugg in the Swiss Rheintal, Gutknecht joined Niklaus Wirth\u2019s Lilith\/ Modula research team in 1981 and, in 1985, after a sabbatical stay at the Xerox-PARC Research Laboratory in California, he was appointed Assistant Professor and later Full Professor of Computer Science at ETH. Together with Wirth, Gutknecht developed the Oberon programming language and the Ceres personal workstation. His esearch interests are in the area of programming languages, compilers, concurrency and component-oriented systems design.","url":"https:\/\/magazine.swissinformatics.org\/it\/author\/president\/"}]}},"_links":{"self":[{"href":"https:\/\/magazine.swissinformatics.org\/it\/wp-json\/wp\/v2\/posts\/13106"}],"collection":[{"href":"https:\/\/magazine.swissinformatics.org\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/magazine.swissinformatics.org\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/magazine.swissinformatics.org\/it\/wp-json\/wp\/v2\/users\/1834"}],"replies":[{"embeddable":true,"href":"https:\/\/magazine.swissinformatics.org\/it\/wp-json\/wp\/v2\/comments?post=13106"}],"version-history":[{"count":0,"href":"https:\/\/magazine.swissinformatics.org\/it\/wp-json\/wp\/v2\/posts\/13106\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/magazine.swissinformatics.org\/it\/wp-json\/wp\/v2\/media\/13089"}],"wp:attachment":[{"href":"https:\/\/magazine.swissinformatics.org\/it\/wp-json\/wp\/v2\/media?parent=13106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/magazine.swissinformatics.org\/it\/wp-json\/wp\/v2\/categories?post=13106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/magazine.swissinformatics.org\/it\/wp-json\/wp\/v2\/tags?post=13106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}